Envoyer un mail simple (stmp) en vc++

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

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.