Envoyer un mail simple (stmp) en vc++

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 900 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

Messages postés
1
Date d'inscription
dimanche 15 juillet 2007
Statut
Membre
Dernière intervention
5 avril 2008

la librairie iostream.h est en option ?????
Messages postés
7
Date d'inscription
mercredi 5 octobre 2005
Statut
Membre
Dernière intervention
1 novembre 2007

J'ai trouvé sur le web l'article RFC 821 traduit du protocole SMTP à l'adresse suivante:

http://abcdrfc.free.fr/rfc-vf/rfc821.html

Vous trouverez aussi dans Code Source celle-ci avec d'autre à l'adresse ci-dessous

http://www.ircfr.com/codes/RFC-821-SMTP-1459-IRC-1939-POP3_21210.aspx

Il donne les clauses de transmission des MAIL. En autre, des questions ont été posé sur le problème que le nom de la personne rédactrice ou réceptrice n'apparaîssent pas pour cela, il faut ajouter après la clause DATA une entête au message comme suit:

[From|To|Cc|Bcc]: <login@domain> (; <login@domain>)*

From ::= Expéditeur
To ::= Destinataire
Cc ::= Destinataire en copie
Bcc ::= Copie cachée

Si une adresse spécifiée par une clause RCPT TO n'est pas présente, alors il s'agit d'un destinataire en copie masqué. Cependant, il est trés sommaire sur les directives que l'on peut écrire dans la clause DATA. A première vue cela dépend du serveur MAIL distant car la spécification grammaticale et lexicale ne précise pas de mots spécifique.

Dans mes recherches, il faut consulter la RFC 822 qui donne le détail des balises de la clause DATA. L'adresse ci-dessous permet d'avoir quelques réponses:

http://jlr31130.free.fr/rfc822-index.html

Mais rien sur l'envoie avec des pièces jointes. J'ai, donc, regarder la source d'un message avec une pièce jointe. Dans la clause DATA, la construction semble complexe, on ajoute quelque chose comme ça:

Content-type: multipart/mixed; boundary="Boundary_(ID_Py1zk4uvrMPiov7B0rLf+Q)"
Thread-index: AcepUI3uwpvjmH8rT+mUvK8SOe4DDw==
....
Quelque chose pour faire apparaître le lien
....
--Boundary_(ID_Py1zk4uvrMPiov7B0rLf+Q)
Content-type: application/msword; name="Rapprochement OGI HORUS-DIALVEIL.doc"
Content-transfer-encoding: base64
Content-disposition: attachment; filename="Rapprochement OGI HORUS-DIALVEIL.doc"
....
Format b64 du fichier
....
--Boundary_(ID_Py1zk4uvrMPiov7B0rLf+Q)--

Pour l'instant, je n'ai fait que des test en connexion TELNET. Mais pour l'attachement d'un fichier, il suffit de déclarer qu'il s'agit d'un mail avec multi documents, d'ajouter des liens sur des balises et des balises encadrant le fichier transmis encodé en base 64.
Messages postés
7
Date d'inscription
mercredi 5 octobre 2005
Statut
Membre
Dernière intervention
1 novembre 2007

J'ai eu quelque problème pour le faire fonctionner en modifiant le code. Mais je suis arrivé, comme j'utilise Dev-C++. Pour ceux qui on des problèmes de compilation voici la solution sur les problèmes de liaison: il suffit d'indiquer la librairie de liaison "winsock" pas par la commande pragma (que l'on peut remplacer par celle de "winsock2", ce que j'ai fait) pour cela:

Projet -> Options Projet -> Onglet Paramétre
Dans la liste "Editeur de lien", y ajouter "-lws2_32"
Puis bouton "OK"

A partir de là, tous les messages de lien introuvable devraient disparaître.

Un autre point important qui ne met pas apparu de suite car on n'y pense plus. La plupart des serveurs de messagerie des FAI sont bloqués sur les clients de la FAI (Fournisseur d'Accès à Internet).

Par ex:
Si on a un compte mail sur freesurf et que notre FAI est cegetel alors le mail devra être adresser smtp.cegetel.net et non à smtp.freesurf.fr comme on pourrait le croire.

Pour l'instant, j'arrive à ouvrir la connexion avec le serveur de messagerie distant. Par contre, les commandes de construction du message ne sont pas comprises (donc pas d'envoie mais cela n'est pas très grave, je chercherais la suite demain).
Messages postés
7
Date d'inscription
samedi 6 mai 2006
Statut
Membre
Dernière intervention
1 octobre 2006

salut
j'ai vu ton code c'est bien,je l'ai executer.
normalement j'ai écrit
pop.mail.yahoo.com

xxx@yahoo.fr

ddd@hotmail.com


et j'ai reçu aucun message dans la boite

merci por tout
Messages postés
86
Date d'inscription
dimanche 8 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2010

75 erreurs sous Visual C++
et 4 sous Dev-C++ !!!

J'y comprends plus rien là!...

PS:Je note pas.
Afficher les 36 commentaires

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.