Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2918 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Petit probleme de client smtp

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petit probleme de client smtp

n°443168
TheTooN
Posté le 29-06-2003 à 18:25:50  profilanswer
 

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
mood
Publicité
Posté le 29-06-2003 à 18:25:50  profilanswer
 

n°443238
chewif
Posté le 29-06-2003 à 19:24:44  profilanswer
 

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
n°443272
TheTooN
Posté le 29-06-2003 à 19:51:47  profilanswer
 

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 ????

n°443333
Kyle_Katar​n
Posté le 29-06-2003 à 20:47:48  profilanswer
 

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

n°443346
TheTooN
Posté le 29-06-2003 à 21:10:06  profilanswer
 

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.

n°443353
youdontcar​e
Posté le 29-06-2003 à 21:20:26  profilanswer
 

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

n°443390
TheTooN
Posté le 29-06-2003 à 21:45:01  profilanswer
 

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. "
 

n°443431
youdontcar​e
Posté le 29-06-2003 à 22:07:38  profilanswer
 

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.

n°443461
TheTooN
Posté le 29-06-2003 à 22:26:52  profilanswer
 

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 :-/

n°443530
Kyle_Katar​n
Posté le 29-06-2003 à 22:57:10  profilanswer
 

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

mood
Publicité
Posté le 29-06-2003 à 22:57:10  profilanswer
 

n°443542
TheTooN
Posté le 29-06-2003 à 23:03:26  profilanswer
 

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.

n°443566
youdontcar​e
Posté le 29-06-2003 à 23:25:45  profilanswer
 

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();

n°445811
TheTooN
Posté le 01-07-2003 à 23:53:27  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Petit probleme de client smtp

 

Sujets relatifs
Problème de tempsBorland => problème avec exceptions
Probleme d'exportation de constante membre[Eclipse] Développement de fragments de plugin (problème)
Problème avec une condition contenue dans une variableExpression Reguliere ... Où est le problème ?
Problème de pipe (grrrr)probleme de mise en page
Cherche client pour DB2Probleme d utilisation d une DLL externe
Plus de sujets relatifs à : Petit probleme de client smtp


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR