Petit probleme de client smtp

Petit probleme de client smtp - C++ - Programmation

Marsh Posté le 29-06-2003 à 18:25:50    

Bonjour,
voila, je me suis mis au C il y a po tres longtemps et je suis en train d'ércire un prog assez long, je le fais donc en plusieurs partie parce que, en phase d'apprentissage, c plus pratique pour tester et vois ce que l on a pas compris. J'en appelle donc à votre indulgence.
ce bout de prog est destiné à envoyer un mail en se connectant au smtp de wanadoo. :
voici tt d abord les réponses qu'obtient l'executable : (remarquez le ehlo a une réponse 220 au lieu de 250 mais je ne vois pas pourquoi) :
 
-----------------------------------------------------------
EHLO TEST
220 mwinf0301.wanadoo.fr ESMTP ABO **************************
 
MAIL FROM:<titi@wanadoo.fr>
250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
RCPT TO:<toto@wanadoo.fr>
250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
DATA
250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
texte de test
250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
.
250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
QUIT
250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
Press a key to finish.
-----------------------------------------------------------
 
voici le source :
 
-----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <winsock2.h>
#include <string.h>
#pragma comment(lib, "ws2_32.lib" )
main(){
 
//ouverture de socket
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("193.252.22.74" );//smtp de wanadoo
sin.sin_family  = AF_INET;
sin.sin_port  = htons(25);//port du smtp
sock = socket(AF_INET,SOCK_STREAM,0);
connect(sock, (SOCKADDR *)&sin, sizeof(sin));
 
//données a envoyer
char buff[100];
char bjr[50] = "EHLO TEST\n";
char mailfrom[50] = "MAIL FROM:<titi@wanadoo.fr>\r\n";
char rcptto[50] = "RCPT TO:<toto@wanadoo.fr>\r\n";
char data[50] = "DATA\r\n";
char texte[50] = "texte de test\r\n";
char fin[50] = ".\r\n";
char fermer[50] = "QUIT\r\n";
 
//envoi du mail
printf("%s", bjr);
send(sock, bjr, sizeof(bjr), 0);
recv(sock, buff, sizeof(buff), 0);
printf("%s\n", buff);
printf("%s", mailfrom);
send(sock, mailfrom, sizeof(mailfrom), 0);
recv(sock, buff, sizeof(buff), 0);
printf("%s\n", buff);
printf("%s", rcptto);
send(sock, rcptto, sizeof(rcptto), 0);
recv(sock, buff, sizeof(buff), 0);
printf("%s\n", buff);
printf("%s", data);
send(sock, data, sizeof(data), 0);
recv(sock, buff, sizeof(buff), 0);
printf("%s\n", buff);
printf("%s", texte);
send(sock, texte, sizeof(texte), 0);
recv(sock, buff, sizeof(buff), 0);
printf("%s\n", buff);
printf("%s", fin);
send(sock, fin, sizeof(fin), 0);
recv(sock, buff, sizeof(buff), 0);
printf("%s\n", buff);
printf("%s", fermer);
send(sock, fermer, sizeof(fermer), 0);
recv(sock, buff, sizeof(buff), 0);
printf("%s\n", buff);
 
//fermeture du socket
closesocket(sock);
WSACleanup();
 
puts("\nPress a key to finish." ); getch();
}
-----------------------------------------------------------
 
Un grand merci à ceux qui auront eu la patience de lire mon post.
je suis sous win2k pro et je compile avec le borland gratuit en ligne de commande. la compilation de pose aucun probleme, pas de warning ni de error.


Message édité par TheTooN le 29-06-2003 à 18:26:52
Reply

Marsh Posté le 29-06-2003 à 18:25:50   

Reply

Marsh Posté le 29-06-2003 à 19:24:44    

http://www.vijaymukhi.com/vmis/wsockexp.htm
 
c est un tutorial que j avais lu il y a un an ou deux pour programmer un ptit client smtp.
En esperant que ca peut aider en comparant avec le code du tuto...(il y a un smtp.cpp  qui traine vers le milieu de la page)
 
 
edit : C est peut etre un probleme de dialogue avec le serveur.
Essaye de taper tout ca en utilisant un client telnet.
 
Derniere possibilité tu n es pas abonne chez wanadoo et par consequent n as pas le droit d utiliser leur smtp (enfin je crois)


Message édité par chewif le 29-06-2003 à 19:27:42
Reply

Marsh Posté le 29-06-2003 à 19:51:47    

je suis abonné chez wanadoo, donc ca c ok et jé recopié les commandes de ce ke g l habitude de faire avec telnet alors ca aussi c god normalement.
g lu avec attention ce que tu m as passé mais un probleme subsiste : ds smtp.cpp, le prog envoi en premier le 'ehlo', ce qui est normal et moi aussi d'ailleurs, sauf que moi j ai comme réponse 220 ce qui n est pas normal (je précise qu'en telnet, g bien une réponse 250)
enfin tt ca pour dire que j envoie les memes choses que lui mais que le serveur smtp ne prend pas en compte certaines choses ????

Reply

Marsh Posté le 29-06-2003 à 20:47:48    

je vois pas où se trouve le problème ....

Reply

Marsh Posté le 29-06-2003 à 21:10:06    

moi non plus mais il y a un probleme parce que le mail n'arrive pas. Est ce parce que j'ai mal cloturé le message : ".\r\n" ne suffit peut etre pas à finaliser le message ? en tout cas, je ne vois pas d'autre solution et voila pourquoi je me tourne vers vous.

Reply

Marsh Posté le 29-06-2003 à 21:20:26    

TheTooN a écrit :

char bjr[50] = "EHLO TEST\n";

http://www.ietf.org/rfc/rfc1869.txt
 
4.2.  Command syntax
 
   The syntax for this command, using the ABNF notation of [2], is:
 
     ehlo-cmd ::= "EHLO" SP domain CR LF

Reply

Marsh Posté le 29-06-2003 à 21:45:01    

Pourrais tu être plus explicite :
char bjr[50] = "EHLO TEST\r\n";
me renvoi toujours une reponse 220 et g essayé pas mal de combinaisons qui soit renvoient une erreur du serveur de wanadoo, soit la meme réponse 220.
de plus g regardé ta rfc et l'erreur 220 ne semble pas apparaitre :
 
" If successful, the server SMTP responds with code 250. On failure, the server SMTP responds with code 550. On error, the server SMTP responds with one of codes 500, 501, 502, 504, or 421. "
 

Reply

Marsh Posté le 29-06-2003 à 22:07:38    

Ha effectivement je m'embrouille ...
 
>> char bjr[50] = "EHLO TEST\r\n";
me renvoi toujours une reponse 220 et g essayé pas mal de combinaisons qui soit renvoient une erreur du serveur de wanadoo, soit la meme réponse 220.
 
220 est le code 'connexion ok', comme sur un ftp.
 
>> de plus g regardé ta rfc et l'erreur 220 ne semble pas apparaitre :
 
Le rfc que j'ai mis en lien plus haut concerne l'extension EHLO (HELO est le standard). Si tu veux le rfc smtp, c'est celui-là :
http://www.ietf.org/rfc/rfc0821.txt
 
Tu peux quand voir un example d'interaction :
 
       S: <wait for connection on TCP port 25>
       C: <open connection to server>
       S: 220 dbc.mtview.ca.us SMTP service ready
       C: EHLO ymir.claremont.edu
       S: 250 dbc.mtview.ca.us says hello
        ...
 
À la connexion, le serveur t'envoie des infos (220) qu'il faut récupérer avant de pouvoir envoyer des commandes. Essaye un recv() après la connexion.

Reply

Marsh Posté le 29-06-2003 à 22:26:52    

reception : 220 mwinf0301.wanadoo.fr ESMTP ABO  **************************
 
envoi : EHLO test
reception : 250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
envoi : MAIL FROM:<toto@wanadoo.fr>
reception : 250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
envoi : RCPT TO:<titi@wanadoo.fr>
reception : 250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
envoi : DATA
reception : 250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
envoi : texte de test
reception : 250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
envoi : .
reception : 250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
envoi : QUIT
reception : 250-mwinf0301.wanadoo.fr
250-PIPELINING
250-SIZE 10485760
250 8BITMIME
 
 
voila, le premier 'reception' a été lancé juste apres le connect donc le serveur renvoi bien un 220 pour dire que le connect est ok donc maintenant, il n y a plus de pb parce que toutes les réponses sont 250.
Mais je ne recois tjrs pas mon mail :-/

Reply

Marsh Posté le 29-06-2003 à 22:57:10    

Essaye de passer en SMTP et pas en ESMTP, c'est à dire fait une commande HELO à la place de EHLO.
 
En effet le ESMTP est pas complètement standardisé par les RFC, contrairement au SMTP et certains serveur n'en n'ont un support que partiel

Reply

Marsh Posté le 29-06-2003 à 22:57:10   

Reply

Marsh Posté le 29-06-2003 à 23:03:26    

Ben en fait, cela ne fonctionne pas mieux, c'est a dire que j'ai bien une réponse 250 mais je ne recois pas le mail.

Reply

Marsh Posté le 29-06-2003 à 23:25:45    

Chez moi ça marche ...
 
En général, fais gaffe à :
* tout recevoir (select() le socket pour voir s'il est vide)
* terminer les données reçues par \0 lorsque tu veux les afficher
* ne pas envoyer trop - alloue juste ce qu'il faut, pas une taille aléatoire : char bjr[50] = "EHLO TEST\n"; -> char bjr[] = "EHLO TEST\n";  
 
Voici le bout qui marche :
 
SOCKET sock;  
char s[2048];
int n = 0;
char buff[100];  
 
 
void smtp_receive()
{
 int n = recv(sock, buff, sizeof(buff), 0);
        // le buffer pourrait être trop petit, faire un select() pour checker  
 buff[n] = 0;
 sprintf(s, "%s\n", buff);  
 OutputDebugString(s);
}
 
void smtp_send(char* msg)
{
 sprintf(s, "%s\r\n", msg);  
 OutputDebugString(s);
 send(sock, s, strlen(s), 0);  
}
 
et après ton connect() :
 
 smtp_receive();
 
 smtp_send("EHLO www.wanadoo.fr" );
 smtp_receive();
 
 smtp_send("MAIL FROM: <a@wanadoo.fr>" );
 smtp_receive();
 
 smtp_send("RCPT TO: <tonemail@wanadoo.fr>" );
 smtp_receive();
 
 smtp_send("DATA" );
 smtp_receive();
 
 smtp_send("Test" );
 smtp_send("\r\n." );
 
 smtp_send("QUIT" );
 smtp_receive();

Reply

Marsh Posté le 01-07-2003 à 23:53:27    

youdontcare : chez toi mon code marche ?????

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed