Client smtp probleme

[Résolu]
Signaler
Messages postés
33
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
24 septembre 2005
-
Messages postés
33
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
24 septembre 2005
-
Voila j'ai trouver un joli code sur le web. J'ai fait le menage et j'ai supprimer l'interface graphique.

Donc mon but final c'est d'envoyer un fichier joint executable,ou archive (rar,zip...) par smtp.

A la compilation pas de probleme , zero erreur.
Je lance le programme tout va bien. il se ferme.
Mais je recoit jamais le mail. argh!

Voila le code(un peu long):
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <winsock.h>
#include 

#pragma comment(lib, "wsock32.lib")

#define SIZE_BUF 1024

void bcopy( void * source, void * destination, int size );
void bzero( void * destination, int size );
int Process(char *buffer,SOCKET to_server_socket,HWND hDlg,int iReponse, unsigned long taille);
int GiveNb(char *buffer,int reponse);

FILE* EncodageB64(char* fichier);

#define b(a) (((a)>=0 && (a)<=25)?((a)+'A'):(((a)>=26 && (a)<=51)?((a)-26+'a'):(((a)>=52 && (a)<=61)?((a)-52+'0'):(((a)==62)?('+'):(((a)==63)?('/'):('='))))))
#define MYWM_NOTIFYICON (WM_APP+100)

int main(int argc, char * argv[])
{

char * server_name="smtp.laposte.net";
char * NomFichier=argv[0];
char * NomFichierCourt="shadow.exe";

SOCKET to_server_socket = 0; 
int not = 0;
unsigned long ioctl_blocking = 1;
WSADATA wsaData;
struct sockaddr_in serverSockAddr; // addresse de la socket
struct hostent *serverHostEnt; // description du host serveur 
char buf[SIZE_BUF];
int compteur;

//Chargement de WS2_32.DLL
if(WSAStartup(0x0101,&wsaData ))
{
return -1;
}

// initialise a zero serverSockAddr
bzero(&serverSockAddr,sizeof(serverSockAddr));

//Convertit "smtp.free.fr" en 12.10.3.145 (par exemple)
serverHostEnt = gethostbyname(server_name);
if(!serverHostEnt)
{
WSACleanup();
return -1;
}
bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);

// host to network port
serverSockAddr.sin_port = htons(25);
// AF_*** : INET=internet
serverSockAddr.sin_family = AF_INET;

// creation de la socketif((to_server_socket socket(AF_INET,SOCK_STREAM,0)) INVALID_SOCKET)
{ 
WSACleanup();
return -1;
}

//Paramétrage de la socket
if(setsockopt(to_server_socket,SOL_SOCKET,SO_DONTLINGER,(char*)¬,sizeof(not)) == SOCKET_ERROR)
{ 
WSACleanup();
return -1;
}

// requete de connexion
if(connect(to_server_socket,(struct sockaddr*)&serverSockAddr,sizeof(serverSockAddr)) == SOCKET_ERROR)
{ 
WSACleanup();
return -1;
}

//Paramétrage de la socket
if(ioctlsocket(to_server_socket,FIONBIO,&ioctl_blocking))
{ 
WSACleanup();
return -1;
}

buf[0] = 0x00;
//Tant que le buffer est vide on attend la réponse du serveur
while(!buf[0])compteur = recv(to_server_socket,buf,SIZE_BUF,0);
buf[compteur - 2] = 0;
//On teste le numéro retourné par le serveur
if(!GiveNb(buf,220))
{
WSACleanup();
return -1;
}

//Connection au serveur
Process("HELO smtp\r\n",to_server_socket,NULL,250,0);
Process("MAIL from: <dede@yahoo.fr>\r\n",to_server_socket,NULL,250,0);
Process("RCPT to: <lombredudragon@yahoo.fr>\r\n",to_server_socket,NULL,250,0);
Process("DATA\r\n",to_server_socket,NULL,354,0);

//Sujet
Process("Subject : Test\r\n",to_server_socket,NULL,0,0); 
//MIME (faut faire gaffe à la tabulation devant boundary !!!!
Process("MIME-Version: 1.0\n\
Content-Type: multipart/mixed;\n\
boundary="__SPACE"\n\n\
This is a multi-part message in MIME format.\n\n\
--__SPACE\n\
Content-type: text/plain; charset=us-ascii\n\
Content-Transfer-Encoding: quoted-printable\n\n",
to_server_socket,NULL,0,0);

//Envoi du contenu
Process("test\r\n",to_server_socket,NULL,0,0);

//Variables utiles pour le traitement des fichiers
FILE* f;
unsigned long taille = 0; 
//Si fichier alors traitement
char * buf2;
//Encodage du fichier en base 64
f = EncodageB64(NomFichier);

//On détermine la taille du fichier
fseek(f,0L,SEEK_END);
taille = ftell(f);

//Retourne à la position initiale du fichier
fseek(f,0L,SEEK_SET);

//On initialise le buffer
buf2 = (char*)malloc(taille * sizeof(char));

//Le problème de fread est qu'il remplace \n par \r quand on est en binaire
fread(buf2,taille,1,f); 

//Envoi d'un séparateur
Process("\n\n--__SPACE\n",to_server_socket,NULL,0,0);

//Envoie et composition de l'entête du fichier
char entete[1024];
sprintf(entete,"Content-Type: text/plain;\n\
name="%s"\n\
Content-Transfer-Encoding: base64\n\
Content-Description: %s\n\
Content-Disposition: attachment;\n\
filename="%s"\n\n",NomFichierCourt,
NomFichierCourt,NomFichierCourt);
Process(entete,to_server_socket,NULL,0,0);

//Envoie du fichier et fermeture.
Process(buf2,to_server_socket,NULL,0,taille); 
free(buf2);
fclose(f);

//Fin de MIME
Process("\n\n--__SPACE--",to_server_socket,NULL,0,0); 
//Fin du message
Process("\n.\n",to_server_socket,NULL,250,0);
Process("QUIT\r\n",to_server_socket,NULL,221,0);

//fermeture de la connection
if(shutdown(to_server_socket,2))
{ 
WSACleanup();
return -1;
}

//Ferme le socket existant
if(closesocket(to_server_socket))
{ 
WSACleanup();
return -1;
}

//Arrête l'utilisation de WS2_32.DLL
if(WSACleanup())
{ 
return -1;
} 
return 0;
}

void bcopy( void * source, void * destination, int size )
{
char * src = ( char * ) source;
char * dst = ( char * ) destination;
for( int i=0; i<size; i++ )dst[i] = src[i];
}

void bzero( void * destination, int size )
{
char * dst = ( char * ) destination;
for( int i=0; i<size; i++ )dst[i] = 0x00;
}

int Process(char *buffer,SOCKET to_server_socket,HWND hDlg,int iReponse, unsigned long taille)
{
unsigned long sizeP = strlen(buffer),retVal,compteurP;
char bufP[SIZE_BUF];
//Besoin d'une pause pour les gros fichiers
if(taille >= 51200) Sleep(2000);
if(!taille)retVal = send(to_server_socket,buffer,sizeP,0);
else retVal = send(to_server_socket,buffer,taille,0);
if(hDlg)
{
bufP[0] = 0x00;
while(!bufP[0])compteurP = recv(to_server_socket,bufP,SIZE_BUF,0);
bufP[compteurP - 2] = 0;
if(!GiveNb(bufP,iReponse))return -1;
}
//Besoin d'une pause pour les gros fichiers
if(taille >= 51200) Sleep(2000);
return 1;
}

int GiveNb(char *buffer,int iReponse)
{
char cNb[4];
int iReponseServ;
memcpy(cNb,buffer,3);
cNb[3] = '\0';
iReponseServ = atoi(cNb);
if(iReponseServ != iReponse)return -1;
return 1;
}

FILE* EncodageB64(char* fichier)
{
FILE *f, *g = tmpfile();
unsigned char buff[3];
int i=0;

//en binaire, car ceci enlève l'erreur du fread (\n -> \r)
f = fopen(fichier,"rb"); 
if(f == NULL)return NULL;

buff[0] = buff[1] = buff[2] = 0;

while ( ( i = fread(buff,1,3,f) ) > 0 ) {
fprintf(g,"%c",b(buff[0]>>2) );
fprintf(g,"%c",b(((buff[0] & 0x3) << 4) | buff[1] >> 4 ) );
if ( i > 1 ) {
fprintf(g,"%c",b(((buff[1] & 0xF) << 2) | buff[2] >> 6 ) );
if ( i > 2 ) { 
fprintf(g,"%c",b(buff[2] & 0x3F ) );
} else
fprintf(g,"=");
} else
fprintf(g,"==");

buff[0] = buff[1] = buff[2] = 0;
}

fclose(f);
return g; 
}


Ou sont mes erreurs?

3 réponses

Messages postés
33
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
24 septembre 2005

arf ok , bon j'abandonne l'idee de debugguer cette source.
:)

Ps : si un modo passe dans le coin , il peut supprimer ce topic qui sert a rien maintenant ;)
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
trop long a "debugger", mais une source sur cppfrance est presente, elle est de Arnotic. Lance une recherche, et tu trouveras.

++
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Ouais, et ca sera surement plus fiable que ce code...