Client smtp en C tout simple erreur 554 5.6.0

Résolu/Fermé
archi12 Messages postés 26 Date d'inscription lundi 13 février 2006 Statut Membre Dernière intervention 26 mai 2016 - 11 févr. 2011 à 21:23
archi12 Messages postés 26 Date d'inscription lundi 13 février 2006 Statut Membre Dernière intervention 26 mai 2016 - 12 févr. 2011 à 10:47
Bonjour,

je ne sais pas si je suis sur le bon forum ?

pourquoi ce petit prog declenche une erreur
host back1h-mail02-02.me-wanadoo.net[10.223.143.72] said: 554
5.6.0 Message contains invalid header ?

alors que le serveur dit
250 2.0.0 6k5t1g0064yclF203k5tQ2 mail accepted for delivery

?????

merci de votre aide

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>

#define FALSE 0
#define TRUE !FALSE
#define BUFFSIZE 4096

char smtp_buff[BUFFSIZE];
int ber; // error flag
int smtp_sock;
char provider[] = "smtp.wanado.fr";

int recv_smtp(){
int i, received, point, end_char;
char c;
char buff_tempo[BUFFSIZE];
if (!ber){
printf(" waiting receive from %s\n", provider);
point = 0;
//received = 1;
memset(smtp_buff, 0, sizeof(smtp_buff));
end_char = FALSE;
while (!end_char){
memset(buff_tempo, 0, sizeof(buff_tempo));
if ((received = recv(smtp_sock, buff_tempo, sizeof(buff_tempo), 0)) < 0) {
printf("!! failed to receive\n");
ber = TRUE; // set error flag
}
else{
if (received > 0){
for (i=0; i < received; i++){
c = buff_tempo[i];
smtp_buff[point] = c;
if (c == '\n') end_char = TRUE;
point++;
}
}
}
}
printf("%d bytes received\n%s\n", point, smtp_buff);
}
return 0;
}

int send_smtp(char *param){
printf("send_smtp-->\n%s", param);
if (!ber){
if (send(smtp_sock, param, strlen(param), 0) != strlen(param)) {
printf("!! mismatch in number of send bytes");
ber = TRUE; // set error flag
}
}
return 0;
}

int main (int argc, char *argv[]){
struct sockaddr_in smtp_struct;
int get_ip_flag, nbtries, fin_receive;
char c;
struct hostent *he;
int smtp_port = 25; // where we want to connect
char smtp_helo[] = "HELO itsme\r\n";
char smtp_mail_from[] = "MAIL FROM: <xxxxx.xxxxx@wanadoo.fr>\r\n";
char smtp_rcpt_to[] = "RCPT TO: <yyyyy.yyyyy@wanadoo.fr>\r\n";
char smtp_data[] = "DATA\r\n";
char smtp_subject[] = "Subject: ici le sujet\r\n";
char smtp_text[] = "ici le texte\r\n";
char smtp_end_text[] = "\r\n.\r\n"; // on termine par CR LF . CR LF
char smtp_quit[] = "QUIT\r\n";

ber = FALSE; // reset error flag

get_ip_flag = FALSE;
while (!get_ip_flag){
printf("gethostbyname: try to get IP for %s\n", provider);
he = gethostbyname(provider);
if (!he){
herror("gethostbyname");
ber = FALSE;
printf("going to sleep 5 seconds\n");
sleep(5); /* sleep 5 seconds */
}
else {
printf("we got it !\n");
get_ip_flag = TRUE;
}
}
memcpy(&smtp_struct.sin_addr, he->h_addr_list[0], he->h_length);
printf("returned by gethostbyname: %s\n", inet_ntoa(smtp_struct.sin_addr));

/* create the smtp TCP socket */
if((smtp_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
printf("!! failed to create smtp socket\n");
ber = TRUE; // !! set error flag
}

/* construct the smtp sockaddr_in structure */
if (!ber){
memset(&smtp_struct, 0, sizeof(smtp_struct)); /* clear struct */
smtp_struct.sin_family = AF_INET; /* Internet/IP */
memcpy(&smtp_struct.sin_addr, he->h_addr_list[0], he->h_length);
smtp_struct.sin_port = htons(smtp_port); /* smtp port */
}

/* establish connection to smtp */
if (!ber){
nbtries = 5;
get_ip_flag = FALSE;
while (nbtries > 0 && !get_ip_flag){
printf(" (%i) - try to connect to %s\n", nbtries, provider);
if (connect (smtp_sock,
(struct sockaddr *) &smtp_struct,
sizeof(smtp_struct)) < 0){
printf("!! failed to connect to %s\n", provider);
nbtries--;
printf("going to sleep\n");
sleep(5); /* 5 seconds */
}
else {
printf("success !\n");
get_ip_flag = TRUE;
}
}
if (!get_ip_flag) ber = TRUE;
}

recv_smtp(); /* 220 'server domain' Service Ready */

printf("smtp_helo >%s<\n", smtp_helo);
//
send_smtp(smtp_helo);
fin_receive = FALSE;
while(!fin_receive){
memset(smtp_buff, 0, sizeof(smtp_buff));
recv_smtp(); /* <--- receive till "250 " server domain OK */
if(strstr(smtp_buff, "250 ") != NULL) fin_receive = TRUE;
}
//
send_smtp(smtp_mail_from);
recv_smtp(); /* <--- 250 OK */
//
send_smtp(smtp_rcpt_to);
recv_smtp(); /* <--- 250 OK */
//
send_smtp(smtp_data);
recv_smtp(); /* <--- 354 start mail input, end with . */
//
send_smtp(smtp_subject);
//recv_smtp(); /* no answer here */
//
send_smtp(smtp_text);
//recv_smtp(); /* no answer here */
//
send_smtp(smtp_end_text);
recv_smtp(); /* <--- 250 OK */
//
send_smtp(smtp_quit);
recv_smtp(); /* <--- 221 server closing connection */
//
printf("close smtp socket\n");
close(smtp_sock);

//-------------------------------------------------
printf("*** smtp - exiting\n");
return 0;
}




2 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
12 févr. 2011 à 09:47
Bonjour,
J'ai testé votre prog et il fonctionne sur mon fai cependant je ne peux le tester sur wanadoo mon ip est rejetée par le filtre anti-spam. Après le HELO le serveur doit vous renvoyer des infos avec les "250-" jetez-y un oeil
0
archi12 Messages postés 26 Date d'inscription lundi 13 février 2006 Statut Membre Dernière intervention 26 mai 2016
12 févr. 2011 à 10:47
Bonjour,
Merci pour votre réponse rapide.
Comme vous le dites, le pb est bien autour du filtre anti_spam de wanadoo.
J'ai bien les infos "250-" apres le EHLO, mais ne sais pas trop quoi en faire. J'ai essayé avec l'ancienne methode HELO, mais meme resultat. J'ai bien peur que de me l'envoyer à moimeme soit le pb. pourtant ca marche avec Evolution !?
Je vais essayer avec un autre FAI.
Merci encore. A+
0