Envoyer un mail

Envoyer un mail en C.

Protocole SMTP

Voir version :

Pas de dépendances

Télécharger :

#define _CRT_SECURE_NO_DEPRECATE
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

void SendAndReceive(SOCKET to_server_socket, char * messagesend)
{
    char bufreceive[1024];
    int size,retVal,nbrecv;
    printf("Envoye : %s\n",messagesend);
    size  = (int)strlen( messagesend );
    retVal = send( to_server_socket, messagesend, size, 0 );
    memset(bufreceive,0,1024);
    while(!bufreceive[0])
    {
        nbrecv = recv( to_server_socket, bufreceive, 1024, 0 );
    }
    printf("Recu : %s\n",bufreceive);
}

SOCKET connexion(char* server_name,unsigned short port)
{
    char buf[ 1024 ] ={0};
    int nbrecv;
    struct sockaddr_in   serverSockAddr;    // addresse de la socket
    struct hostent     * serverHostEnt;     // description du host serveur
    SOCKET to_server_socket = 0;
    memset(&serverSockAddr,0, sizeof( serverSockAddr ) );
    serverHostEnt = gethostbyname( server_name );
    if ( serverHostEnt == NULL )
        return (SOCKET)-1;
    memcpy(&serverSockAddr.sin_addr,serverHostEnt->h_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)
        return (SOCKET)-2;
// requete de connexion
    if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr,sizeof( serverSockAddr ) ) < 0 )
        return (SOCKET)-3;
    while( !buf[0] )
        nbrecv = recv( to_server_socket, buf, 1024, 0 );
    printf("Welcome message : %s\n",buf);
    return to_server_socket;
}

int mail_simple(SOCKET sock,const char* from,const char* to,const char* body)
{
#define SIZEMAX 1000000
    char buffer[SIZEMAX];
    SendAndReceive(sock, "EHLO dude.fr\r\n");
    sprintf(buffer,"MAIL FROM: <%s>\r\n",from);
    SendAndReceive(sock, buffer);
    sprintf(buffer,"RCPT TO: <%s>\r\n",to);
    SendAndReceive(sock, buffer);
    SendAndReceive(sock, "DATA\r\n");
    sprintf(buffer, "Subject: %s",body);
    SendAndReceive(sock, buffer);
    SendAndReceive(sock,  "QUIT\r\n");
    return 0;
}


#define SMTP_SERVER "smtp._____.com"
#define SMTP_PORT 25
#define FROM "truc@machine.fr"
#define TO "dude@truc.com"
#define BODY "Bonjour !\r\nUn petit mail de test ! Je teste juste un truc !\r\nSuperFred\r\n.\r\n"

int main()
{
    SOCKET sock;
    WSADATA wsaData;
    WSAStartup( 0x0101, &wsaData );
    sock = connexion(SMTP_SERVER,SMTP_PORT);
    if (sock<0)
    {
        printf("Echec code : %d\n",(int)sock);
        return (int)sock;
    }
    mail_simple(sock,FROM,TO,BODY);
    shutdown( sock, 2 );
    return( closesocket( sock ) );
}




Commentaires

Voici un code pour envoyer un mail.

Si vous lancez le programme, ça ne va pas marcher, parce que je ne vais pas vous donner mon serveur SMTP, non mais !

A vous de renseigner vos données dans les #define au dessus du main.

D'abord, le serveur SMTP (si vous avez déjà paramétré outlock ou thunderbird, vous savez ce que c'est ! )
Sinon vous trouverez de la documentation sur le net pour configurer tout ça. Votre FAI vous fournit un serveur SMTP.

Ensuite, le port 25 : laissez comme ça, le protocole SMTP se sert du port 25.

Ensuite, FROM : et oui, vous pouvez vous faire passer pour quelqu'un d'autre...
ça me rappelle quand j'étais à la fac, il y a bien longtemps, des potes avaient envoyé un mail de drague d'un vieux prof barbu
a un autre pote en se faisant passer pour lui. On avait bien rigolé ! 

Mais bref, je m'égare.
Le TO : a qui vous voulez l'envoyer.

Et le BODY : c'est une chaine, avec des \r\n : pour les retours de ligne.
Le titre du mail sera la première ligne ! Tout le reste sera le corps du mail.

Dans mon cas, le titre du mail sera "Bonjour !"

Voila, regardons le main.
Je me connecte au serveur SMTP, de la même façon que je me connecterais à un autre serveur : socket,connect...

Si la fonction bloque chez vous, c'est que votre serveur SMTP n'est pas bon. 
Sinon, vous irez au "Welcome message", le serveur vous dit bonjour.

Ensuite, j'ai fait une fonction mail_simple.
C'est elle qui communique via le protocole SMTP

D'abord, un EHLO dude.fr -> EHLO, c'est comme HELLO. Et je ne pense pas qu'il y ait d'importance à ce qui est passé ensuite.
Ensuite, MAIL FROM
Ensuite, RCPT TO
Ensuite DATA, Subject, et QUIT.

Voila, et à chaque fois, j'envoie le message, et j'affiche ce que le serveur me renvoie.