Probleme d'envoi de données a un server SMTP. [Fermé]

Signaler
-
Messages postés
20
Date d'inscription
vendredi 9 avril 2010
Statut
Membre
Dernière intervention
24 juillet 2019
-
Bonjour,

Voila actuellement je suis en train de coder un programme pour envoyer un mail, donc en fait je commence par créer des tableaux contenant les directives d'envoi du genre:

char HEAD[100]="HELO Salut\r\n";
char sender[100]="MAIL FROM: <";
char receiver[100]="RCPT TO: <";
char line_ret[]="\r\n";
etc...

j'utilise les sockets avec la bibliotheque winsock de windows, j'arrive parfaitement a compiler mon programme et à recevoir des données venant du server smtp en utilisant le port 25, j'ai fait des opérations de concaténation pour relever les adresses que souhaite utiliser l'utilisateur avec les tableaux précédents, mais au moment ou j'envoie mes données sender et receiver, le server me répond a chaque fois:

"500 5.5.2 Error: bad syntax" alors que pour HEAD sa marche plutôt bien...voici les étapes de mon code si sa peut vous aider avec juste le tableau sender:

printf(".Votre adresse mail: ");
scanf("%s",&expeditor);

printf(".Adresse mail de destination: ");
scanf("%s",&target);

strcat(expeditor,">");
strcat(expeditor,line_ret);
strcat(sender,expeditor);

dat=send(sock,sender,strlen(sender)+1,0);
if(dat){
printf("donnee de 'sender' envoyee au server");
}else{
perror("erreur sur send\n");}

le truc c'est que j'ai essayé de changer plusieurs fois la taille de données à envoyer (ici en 3eme argument de la fonction send()) comme sizeof(sender) par exemple mais apparemment la faute ne vient pas de là...pourriez-vous m'aider s'il vous plait je galère juste a cet endroit la ne sachant ou est l'erreur lors de la transmission des données...(j'ai fait un test avec les résultats de la concaténation mais rien n'y fait...)

logiquement les étapes de concaténation sont les suivantes:
sender-->"MAIL FROM: <"
expeditor -->"testf@hotmail.fr"
expeditor -->"test@hotmail.fr>"
expeditor -->"test@hotmail.fr>\r\n"
sender -->"MAIL FROM: <test@hotmail.fr>\r\n"

bonne soirée ;)

9 réponses

Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
salut, j'ai pas testé le code, mais ...
déjà, ce n'est pas HELO qu'il faut faire, mais EHLO

essayes deja ton code via telnet (telnet ton_serveur 25)

il est possible qu'il faille faire EHLO

je te conseille de faire comem sur la page wiki
https://fr.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol

de plus, au lieu de faire EHLO salut, je te conseille de faire EHLO suivi du nom du serveur qui t'a été renvoyé une ligne plus haut ...

tiens moi au courant

attention, si tu testes en telnet, pas de faute de frappe persmis (le retour chariot ne fonctionne pas)
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 78340 internautes nous ont dit merci ce mois-ci

Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
pour le retour chariot, je suis pas sur a 100% mais il me semble (ca dépend peut etre aussi des serveurs)
le smtp de numéricable est bien, c'est avec lui que j'avais fait le mm programme que toi... il y a pas d'authentification :)

pour le EHLO et HELO, beeaucoup prennent les deux, mais autant respecter la RFC....

dat=send(sock,sender,strlen(sender)+1,0);

sender contient : sender -->"MAIL FROM: <test@hotmail.fr>\r\n"
2 solutions:
- le strlen renvoie le nombre de caractères + 2 (pour le \r\n)=>30
- le strlen renvoie le nombre de caractères tout court =>28 ..
a tester.
mais dans les 2 cas, c'est soit +2 ou soit +0 qu'il faut mettre (donc rien) dans les donénes à envoyer ! je pense qu'il ne faut rien mettre ... (a toi de tester)

tiens moi au jus
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 78340 internautes nous ont dit merci ce mois-ci

Salut merci de ta réponse,

bah le truc c'est que j'ai déjà commencé par faire tout ceci avec telnet et sa a marché, tu as raison pour le le EHLO, dans mon vrai code c'est ce que j'ai fait, je l'ai fait suivre par le nom du serveur smtp de connexion, par contre la formulation EHLO ou HELO n'a à priori pas grande importance mais je tiendrais compte de tes conseils, j'ai remarqué que les deux marchent sur la plupart des serveurs...par contre merci de m'avoir appris que le retour charriot ne marchait pas, sa je ne le savais pas...:p

Pour ce qui est du code j'ai mis que la partie qui m'intéressait, la seule partie qui me pause problème, le reste de mon code marche parfaitement mais je préfère ne pas trop embrouiller les gens avec. En fait le serveur me répond bien jusqu'à la ligne de l'adresse d'envoi, pareil pour la ligne de l'adresse de réception du mail.
Du coup globalement il me met sa (testé avec numericable):

220 smtp1.tech.numericable.fr ESMTP Postfix;

apres l'envoi de EHLO:
250 smtp1.tech.numericable.fr;

apres envoi du tableau de char 'sender':
500 error: Bad syntaxe;

après envoi du tableau de char 'receiver':
500 error: Bad syntaxe;


pourtant même sans le retour charriot cela ne semble pas marcher avec la fonction send(), c'est ça que je n'arrive pas à comprendre, cela me rend perplexe je dois dire...de toute évidence ca vient de la syntaxe, mais après je ne sais pas pourquoi...

Quelqu'un aurait-il une idée? :s
D'accord,

merci l'ami je vais voir si ca change quelque chose, c'est vrai que les caractères '\r' et '\n' me posent pas mal de problèmes dans l'envoi des données on dirait...En tout cas merci beaucoup de l'attention que tu portes à mon message, pour ce qui est du choix du serveur SMTP c'est vrai que numéricable est pas mal, je crois que hotmail lui demande une auth, je préfère déjà ciblé les server faciles à manier pour le moment...

Je vais essayer le
strlen+2
parce que le
strlen(sender)
n'a pas marché lui non plus...:( jte retiens au courant.
Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
hotmail, en plus de l'authentification, requiert uen connexion SSL ... j'ai pas encore mis le SSL en oeuvre en C++ (en java,c 'est super simple grace à SSLSocketFactory => c'est totalement transparent! )
Non apparemment cela ne marche pas non plus...je suis vraiment coincé, mais en tout cas merci beaucoup pour ton aide, disons que le C n'est peut être pas le meilleur langage pour faire ce genre de programme, mais en même temps je me dis que plus c'est difficile, plus sa devient intéressant ^^
Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
mais si c'est faisable, je l'ai fait il y a un peu plus d'un an ...
Ah j'ai pas dit le contraire, ce que je veux dire par là c'est que j'utilise peut être le C à tort pour ce genre de choses, il y' a plus simple et plus adapté avec d'autres langages comme le PHP... Mais de toute façon ne crois surtout pas que je vais abandonner le projet comme sa...Je vais continuer jusqu'à ce que je trouve la solution, bon après j'espère seulement que quelqu'un va pouvoir m'aider parce que là je patauge un peu...:( Disons que c'est juste à cette partie que sa bloque, le reste je peux le faire en peu de temps, c'est pas compliqué, et puis après tout c'est mon premier vrai programme ;) je suis certain que le problème vient de la fonction send, au niveau de la taille du tableau mais après...En tout cas merci de ton aide tu m'as pas mal aidé je dois dire ;)
Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
le php intègre en effet la fonction mail .. il y a aussi en C des librairies toutes pretes, mais moi ce que j'aime, c'est faire les choses par poimeme, pour découvrir comment ca fonctionne...
tu pourrais faire exactemetn le meme programme en PHP en utilisant les sockets ...
Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
et si au lieu de tous tes strcat, tu faisait un truc un peu "joli" du genre :

sprintf(sender,"MAIL FROM: <%s>\r\n",expeditor);
de plus, merci de faire un printf de tout ce que tu envoies et recois: si ca se trouve, un simple espace fait merder ta syntaxe ....
Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
printf("%d",strlen("\r\n")); => retourne bien 2

liste des messages à envoyer
EHLO smtp1.tech.numericable.fr\r\n
MAIL FROM: <auteur@yyyy.yyyy>\r\n
RCPT TO: <destinataire@xxxx.xxxx>\r\n
DATA\r\n
Subject: recette de la tartiflette\r\n
Lardons, patates, oeufs et roblochon\r\n
.\r\n
QUIT\r\n

voici le code que je propose ... (pas testé car pas de SMTP dans ma boite)

char buffer[100];
// je te laisse faire les osuvertures de socket

sprintf(buffer,"EHLO %s\r\n","smtp1.tech.numericable.fr");
send(sock,buffer,strlen(buffer),0); //je sais pas a quoi correspond ton 0 ... j'ai pas vérifié

//todo:reception, affichage

sprintf(buffer,"MAIL FROM: <%s>\r\n","bill_gates@microsoft.com");
send(sock,buffer,strlen(buffer),0);

//todo:reception, affichage

sprintf(buffer,"RCPT TO: <%s>\r\n","ton_email@hotmail.fr");
send(sock,buffer,strlen(buffer),0);

//todo:reception, affichage

sprintf(buffer,"DATA\r\nSubject: recette de la tartiflette\r\nLardons, patates, oeufs et oblochon\r\n.\r\n");
send(sock,buffer,strlen(buffer),0);

//todo:reception, affichage

sprintf(buffer,"QUIT\r\n");
send(sock,buffer,strlen(buffer),0);</code>

tu fais ca, en m'affichant tout ce que tu envoies, et tout ce que tu recois .... et tu me postes le résultat...
changes ton adresse de destinataire ... (pas l'adresse d'envoi: ce sera la seule fosi que t'aura un mail de bilou mais attention, il sera classé comme SPAM à coup sur!)
Ok merci bien l'ami c'est très utile ce que tu m'as mis la ;) Au début j'avais hésité à mettre les sprintf mais tout compte fait c'est vrai que sa le fera mieux plutôt que de coder a la bourrin avec des strcat de partout...Du coup je pense que le code sera beaucoup plus aéré et plus simple d'utilisation, je vais tout remodifier ;)

je compte tout recoder ce soir mais je penses finir le programme dans la semaine...Si tout se passe bien je te mettrai au courant et je clôturerai le sujet ;)

Avec tout sa je suis maintenant sûr quant à la manière de m'y prendre, en tout cas merci encore Nabla's, ton aide m'a été précieuse :D
heu et sinon juste une dernière petite question, pour le server smtp je voulais savoir si quelqu'un qui souhaite utiliser mon programme pourra utiliser le server de numericable ou s'il est obligé de passer par celui de son FAI...
Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
j'espère bien que je serai au courant meme si tu galères !
Effectivement je galère comme un malade lol, disons que ca serait plus simple si je faisais comme toi, mais le souci c'est qu'en faisant en sorte que l'utilisateur rentre les données, sa complique énormément le code, et du coup pas moyen de trouver ou est l'erreur...

Bon maintenant le vrai problème c'est que sa coince des le départ, c'est franchement pas évident, dès la ligne "MAIL FROM: <>\r\n" sa coince...et pourtant je fais tout correctement avec les sprintf(); que j'effectue au fur et à mesure de la progression de l'utilisateur à l'avancée du code.


le HELO smtp... Il l'envoie sans problème, sa coince vraiment à l'endroit où il faut envoyer au server le mail source...après il me met que des "bad syntaxe", sa devient rageant surtout quand il s'agit de caractères, c'est assez délicat...:s

Autre problème, disons que c'est la première fois que je programme avec les sockets, je pense que c'est un bon début, mais pour ce qu'il s'agit de la vérification des fautes c'est un peu chaud...D'ailleurs je comprends pas, à chaque impression de la réponse server, il me met des symboles ASCII qui ne sont pas des lettres, bref des symboles bizarres, je pensais que sa venait de la taille de donnée recue avec la fonction recv(); définie par le 3ème paramètre, mais en changeant à chaque fois de taille, cela ne change pas grand chose...


Dernière petite chose avant que j'écrive un roman lol, je sais plus trop mais on dirait que la fonction sprintf() écrit par dessus les anciennes données, du coup cela ne fonctionne plus, par exemple:

au début buff vaut "HELO smtp numericable", apres je lui mets "MAIL FROM: <>" contenant mon adresse source, mais là au moment de l'utilisation du sprintf, le tableau ne contient plus que la dernière saisie, à savoir le: "MAIL FROM: <>";

J'ai fait le test comme sa dans un programme indépendant, pour faire le test, et apparemment la fonction sprintf() écrase les anciennes données ce qui n'est pas tip top...:p

Du coup le truc c'est que j'ai crée plusieurs tableaux comme je l'avais fait et je les ai rempli au fur et à mesure. Mais apparemment rien ne semble avoir changé malgré le fait que j'aie changé ma manière de procéder...:(
Messages postés
12
Date d'inscription
lundi 20 septembre 2010
Statut
Membre
Dernière intervention
28 septembre 2010

Ah oui, voici les logs comme convenu, mais tu verras qu'il n'y a rien d'intéressant dans tout sa:

HELO smtp 
MAIL FROM: <test@hotmail.fr> 
RCPT TO: <test@gmail.com> 
DATA 
SUBJECT: coucou 

FROM: <test@hotmail.fr> 
TO: <test@gmail.com> 
coucou 

. 
QUIT 
Envoi des donnees... 


220 smtp1.tech.numericable.fr ESMTP Pos 
Ù§v?Ý( 
premiere donnee envoyee au server 

250 smtp1.tech.numericable.fr 
vh¯( 

Donnees envoyees au server! 
500 5.5.2 Error: bad syntax 
4o 

Donnees envoyees au server! 
503 5.5.1 Error: need MAIL command 
421 4.7.0 smtp1.tech.numericable.f·v¦ºó 

Donnees envoyees au server! 
r Error: too many errors 
( 

Donnees envoyees au server! 
¹ §v-÷?vT3?têËp 

Donnees envoyees au server! 
?   :.÷v2*÷v 

Donnees envoyees au server! 
(ý( 

Donnees envoyees au server! 
¶Û( 

Donnees envoyees au server! 
¦?·vàíó 

Donnees envoyees au server! 
¦?·vàíó 


Mail envoye avec succes! 


158 octets de donnees ont ete envoyes



c'est exactement ce que sa m'affiche mot pour mot, les données sont toutes envoyées avec succès mais elles sont inexactes à partir de la ligne d'anvoi du "MAIL FROM".
Pour les symboles bizarres je sais juste comment les faire en C mais pour les enlever...:p

Bonne soirée et surtout bon courage, je pense qu'à deux on y arrivera mieux ;)
Messages postés
12
Date d'inscription
lundi 20 septembre 2010
Statut
Membre
Dernière intervention
28 septembre 2010

La première partie concerne ce qui va être envoyé, je l'avais faite pour effectuer une vérification de ce qui coince, tout semble correct mais l'envoi ne marche toujours pas...
Messages postés
12
Date d'inscription
lundi 20 septembre 2010
Statut
Membre
Dernière intervention
28 septembre 2010

bon alors j'ai tout recodé mais cette fois-ci sans rajouter la partie saisie utilisateur, c'est à dire en mettant les adresses mail déjà toutes faites, et sa a marché impécable pour le serveur de numéricable, par contre c'est au niveau de la saisie utilisateur que sa doit bloquer, je vais voir si je peux modifier deux trois trucs, je vais tout réoptimiser rapidement...
Messages postés
12
Date d'inscription
lundi 20 septembre 2010
Statut
Membre
Dernière intervention
28 septembre 2010

C'est bon finalement j'ai réussi à terminer mon programme, j'ai même pu ajouter la saisie utilisateur sans aucun problème ;)

Le seul hic c'est que mon code ne marche pas pour tous les serveurs...:(
Messages postés
18237
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
2 923
Comment se fait il qu'il ne marche pas sur tous les serveurs ?

je viens juste de tilter sur une partie de ton code:

scanf("%s",&expeditor);
==> expeditor c'est surement un tableau de char (char[100]) ... donc c'est un pointeur.... donc, pas besoin de mettre le &
scanf("%s",expeditor);

c'est à cause de ca que t'avais des caractères étranges...
Messages postés
12
Date d'inscription
lundi 20 septembre 2010
Statut
Membre
Dernière intervention
28 septembre 2010

ah ok sans doute alors...non ce que je voulais dire par la c'est que pour mon serveur de numéricable cela marche impecable, en revanche si je me connecte à un autre serveur, la syntaxe devra être différente apparemment car il n'accepte pas les données que je lui envoie, en tout cas j'ai appris pas mal de choses en tout recodant et en sollicitant ton aide, je t'en remercie ;). Pour le cas des "&" j'avais oublié de prendre l'habitude de les enlever pour les tableaux de char, mais c'est vrai que puisqu'il s'agit de pointeurs, le mieux c'est de les retirer...Par contre oui il faudrait que je voie quelle syntaxe adopter pour que ca marche sur n'importe quel autre serveur, bien sur ne demandant pas d'authentification ;)

Par contre pour le sprintf qui écrase les anciennes données stockées dans le tableau tu pourras vérifier, normalement ca fait bien ca...;)
Messages postés
20
Date d'inscription
vendredi 9 avril 2010
Statut
Membre
Dernière intervention
24 juillet 2019
1
salut j'ai le même devoir je connecte bien sur un serveur local que moi même j'ai creé mais jamais je n'ai réussi avec le serveur smtp.je ne sais pas si tu peux m'aidez avec ton code
quelle adresses ip fait usage
j'ai utiliser l'adresse reçu en envoyant le ping sur l'invite mais pas de succes
tu peu m'écrire sur
edwinefam2001@yahoo.fr