Socket et serveur smtp

agzel Messages postés 33 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 24 septembre 2005 - 5 sept. 2004 à 13:50
agzel Messages postés 33 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 24 septembre 2005 - 30 sept. 2004 à 15:26
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

cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
5 sept. 2004 à 14:39
oui on peut !!
prquoi ne pourrait-on pas??
0
agzel Messages postés 33 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 24 septembre 2005
5 sept. 2004 à 18:54
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 ??
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
5 sept. 2004 à 20:26
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++
0
agzel Messages postés 33 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 24 septembre 2005
5 sept. 2004 à 21:32
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.;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
agzel Messages postés 33 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 24 septembre 2005
9 sept. 2004 à 13:43
personne pour me dire mes erreurs???
0
agzel Messages postés 33 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 24 septembre 2005
30 sept. 2004 à 15:26
allloooooooooo !! y'a quelqu'un
0
Rejoignez-nous