Socket et serveur smtp

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'aimerais savoir si c'est possible d'envoyer un mail de cette maniere:

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")


void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("80.245.62.11"); //Serveur a definir ici smtp.laposte.net
sin.sin_family = AF_INET;
sin.sin_port = htons(25);
sock = socket(AF_INET,SOCK_STREAM,0);

if(connect(sock,(SOCKADDR*)&sin,sizeof(sin))==0)
{
send(sock, "HELO smtp\r\n", 11, 0);
send(sock, "MAIL From: <dede@yahoo.fr>\r\n", 28, 0);
send(sock, "RCPT To: <lombredudragon@yahoo.fr>\r\n", 36, 0);
send(sock, "DATA\r\n", 8, 0);
send(sock, "Subject: Test !!!\r\n\r\n Test\r\n.\r\n", 56, 0);
send(sock, "QUIT\r\n", 6, 0);
}

closesocket(sock);
WSACleanup();

}

Et aussi si on peut envoyer un mail avec attachement de fichier .exe .jpeg ... de cette maniere.

6 réponses

Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
oui on peut !!
prquoi ne pourrait-on pas??
Messages postés
33
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
24 septembre 2005

Bon ca fait pas mal de temps que je galere sur un code.
C'est un code recuperer sur internet , j'ai supprimer les traces de l'interface graphique pour ne garder que le code utile.

#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 socket if((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*)&not,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;  
}


Quand je compile j'ai zero erreur mais le mail ne s'envoit pas.
Aurais-je fais des erreurs ??
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
J'ai écris un exemple de programme qui envoi des mails via SMTP et même des fichiers joint.

@+
Arnotic,
Admin CS, MVP Visual C++
Messages postés
33
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
24 septembre 2005

wé je sais j'ai deja vu ta source ;)
mais je souhaiterez utilisé celle que j'ai.
D'un coté pour apprendre mes erreurs et de l'autre car le programme s'envoi lui meme par email.;)
Messages postés
33
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
24 septembre 2005

personne pour me dire mes erreurs???
Messages postés
33
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
24 septembre 2005

allloooooooooo !! y'a quelqu'un