Envoyer un mail simple (stmp) en vc++

0/5 (36 avis)

Snippet vu 17 345 fois - Téléchargée 38 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 126 Date d'inscription mercredi 18 juillet 2001 Statut Membre Dernière intervention 27 octobre 2004
21 juin 2002 à 19:42
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
22 juin 2002 à 02:47
Est-ce qu'un cin ne limite pas très fort le nombre de caractères? Combien au maximum?
ADPro22 Messages postés 126 Date d'inscription mercredi 18 juillet 2001 Statut Membre Dernière intervention 27 octobre 2004
22 juin 2002 à 10:16
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
17 oct. 2002 à 12:55
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
18 oct. 2002 à 16:14
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.