Envoyer un mail simple (stmp) en vc++

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 813 fois - Téléchargée 36 fois

Contenu du snippet

Envoi un mail via le server stmp définit par l'utilisateur.
Le mail ne peux etre que du texte simple
Ne prend pas en charge les pieces jointes

Source / Exemple :


#include <winsock.h>
#include <iostream.h>
#include <string.h>

SOCKET to_server_socket = 0;
char   server_name[100];
int    port             = 25;

char destinataire[120] = "RCPT To: <";
char sender[120] = "MAIL From: <";
char exp[100], dest[100];
char sujet[50];
char message[1000];
char body[1100] = "Subject: ";

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;
}

void Process( char * buffer )
{
   Sleep( 1000 );
   cerr << "Envoye   < " << buffer << endl;
   int    size   = strlen( buffer );
   int    retVal = send( to_server_socket, buffer, size, 0 );

   char buf[ 1024 ];
   buf[0] = 0x00;
   while( !buf[0] )
      int yeah = recv( to_server_socket, buf, 1024, 0 );
   cerr << "Recu     > " << buf << endl << endl;
}

int main( int argc, char *argv[] )
{
   int           not            = 0;
   unsigned long ioctl_blocking = 1;

   cout<<"Entrez le nom du serveur smtp ou son ip\n";
   cin>>server_name;
   cout<<"Entrez l'adresse email de l'expediteur\n";
   cin>>exp;
   cout<<"\nEntrez l'adresse email du destinataire\n";
   cin>>dest;
   cout<<"\nEntrez le sujet du mail\n";
   cin>>sujet;
   cout<<"\nEntrez votre message\n";
   cin>>message;

   strcat(sender,exp);
   strcat(sender,">\r\n");
   strcat(destinataire,dest);
   strcat(destinataire,">\r\n");
   strcat(body,sujet);
   strcat(body," \r\n\r\n ");
   strcat(body,message);
   strcat(body," \r\n.\r\n");

   WSADATA wsaData;
   if( int err = WSAStartup( 0x0101, &wsaData ) )
   {
      cerr << "WSAStartup failed... Error: " << err << endl;
      exit( -1 );
   }

   struct sockaddr_in   serverSockAddr;    // addresse de la socket
   struct hostent     * serverHostEnt;     // description du host serveur
   long                 hostAddr;          // addr du serveur

   bzero( &serverSockAddr, sizeof( serverSockAddr ) );     // initialise a zero serverSockAddr
   // converti l'adresse ip 9.100.1.1 en entier long
   hostAddr = inet_addr( server_name );

   if( ( long ) hostAddr != ( long ) -1 )                   
      bcopy( &hostAddr, &serverSockAddr.sin_addr, sizeof( hostAddr ) );
   else                                                    // si on a donne un nom
   {
      serverHostEnt = gethostbyname( server_name );
      if ( serverHostEnt == NULL )
      {
         cerr << "echec gethost" << endl;
         exit( 0 );
      }
      bcopy( serverHostEnt->h_addr, &serverSockAddr.sin_addr, serverHostEnt->h_length );
   }

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

   to_server_socket = socket( AF_INET, SOCK_STREAM, 0 );
   if ( to_server_socket < 0)
   {
      cerr << "echec creation socket client" << endl;
      exit( 0 );
   }

   setsockopt(to_server_socket, SOL_SOCKET, SO_DONTLINGER, (char *) &not, sizeof(not));

   // requete de connexion
   if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr, 
                                      sizeof( serverSockAddr ) ) < 0 )
   {
      cerr << "echec demande de connection" << endl;
      exit( 0 );
   }

   ioctlsocket ( to_server_socket, FIONBIO, &ioctl_blocking );

   char buf[ 1024 ];
   buf[0] = 0x00;
   while( !buf[0] )
      int yeah = recv( to_server_socket, buf, 1024, 0 );
   cerr << "Receive > " << buf << endl << endl;

   Process( "EHLO Toto\r\n" );
   Process( sender );   // mail de l'expediteur
   Process( destinataire );   // mail du destinataire
   Process( "DATA\r\n" );
   Process( body );
   Process( "QUIT\r\n" );

   /* fermeture de la connection */
   shutdown( to_server_socket, 2 );
   
   return( closesocket( to_server_socket ) );
}

Conclusion :


ATTENTION dans settings du projet / link ajouter : ws2_32.lib sinon ca marche pas

Je l'ai testé et ça marche nikel !
Pas besoin de modifier la source, juste la copier et la compiler et ça marche.

A voir également

Ajouter un commentaire

Commentaires

ADPro22
Messages postés
127
Date d'inscription
mercredi 18 juillet 2001
Statut
Membre
Dernière intervention
27 octobre 2004
-
Salut SidSilver !

Juste quelques petites remarques:
Au lieu d'utiliser tes fonctions bcopy et bzero, tu peux utiliser memcpy et memset :
void *memcpy( void *dest, const void *src, int count );
void *memset( void *dest, int val, int count );

D'autre part, si tu veux pouvoir saisir le corps du message avec plusieurs lignes, je te conseille d'utiliser cin.getline à la place de cin sous la forme :
cin.getline(message, 1000, '$');
Le délimiteur est alors le caractère $ et non plus


(le premier Process, c'est HELO BobSender...)

Sinon, c'est un super prog.
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008
-
Est-ce qu'un cin ne limite pas très fort le nombre de caractères? Combien au maximum?
ADPro22
Messages postés
127
Date d'inscription
mercredi 18 juillet 2001
Statut
Membre
Dernière intervention
27 octobre 2004
-
Non, cin ne limite pas le nombre de caractères : il renvoie une référence à la chaine e fait. La limitation est donc imposée par la déclaration de la chaine.
Au delà, c'est tronqué.
omnikod
Messages postés
26
Date d'inscription
jeudi 2 août 2001
Statut
Membre
Dernière intervention
23 janvier 2003
-
pour moi ça ne marche pas !!!


Compiling...
smtp.cpp
Linking...
smtp.obj : error LNK2001: unresolved external symbol __imp__recv@16
smtp.obj : error LNK2001: unresolved external symbol __imp__send@16
smtp.obj : error LNK2001: unresolved external symbol __imp__closesocket@4
smtp.obj : error LNK2001: unresolved external symbol __imp__shutdown@8
smtp.obj : error LNK2001: unresolved external symbol __imp__ioctlsocket@12
smtp.obj : error LNK2001: unresolved external symbol __imp__connect@12
smtp.obj : error LNK2001: unresolved external symbol __imp__setsockopt@20
smtp.obj : error LNK2001: unresolved external symbol __imp__socket@12
smtp.obj : error LNK2001: unresolved external symbol __imp__htons@4
smtp.obj : error LNK2001: unresolved external symbol __imp__gethostbyname@4
smtp.obj : error LNK2001: unresolved external symbol __imp__inet_addr@4
smtp.obj : error LNK2001: unresolved external symbol __imp__WSAStartup@8
laglisse
Messages postés
3
Date d'inscription
samedi 9 mars 2002
Statut
Membre
Dernière intervention
18 octobre 2002
-
omnikod> Le code marche tres bien !!!
t'a pas du lire la petite ligne en bas (moi o6 je me suis fé avoir) :
ATTENTION dans settings du projet / link ajouter : ws2_32.lib sinon ca marche pas

Je l'ai testé et ça marche nikel !
Pas besoin de modifier la source, juste la copier et la compiler et ça marche

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.