diff -urN msmtp-0.6.2.orig/src/esmtp.c msmtp-0.6.2/src/esmtp.c --- msmtp-0.6.2.orig/src/esmtp.c 2003-11-14 00:06:10 +0600 +++ msmtp-0.6.2/src/esmtp.c 2003-12-05 14:26:35 +0600 @@ -862,7 +862,7 @@ if ((fd = open_socket(server, port)) < 0) { add_error_line("cannot connect to SMTP server"); - error_code = EX_UNAVAILABLE; + error_code = EX_TEMPFAIL; goto exit; } /* start TLS encryption for TLS-only servers (no STARTTLS) if wanted */ @@ -879,7 +879,7 @@ if (smtp_get_response(fd, &tls, 220) != 220) { add_error_line("cannot get initial ok message from SMTP server"); - error_code = EX_UNAVAILABLE; + error_code = EX_TEMPFAIL; goto close_exit; } /* start smtp session */ @@ -919,11 +919,29 @@ error_code = EX_IOERR; goto close_exit; } - if (smtp_get_response(fd, &tls, 250) != 250) + if ((error_code = smtp_get_response(fd, &tls, 250)) != 250) { add_error_line("line `MAIL FROM:<%s>' not accepted by SMTP server", from); - error_code = EX_DATAERR; + switch (error_code) { + case 451: + case 452: + error_code = EX_TEMPFAIL; + break; + case 503: + error_code = EX_SOFTWARE; + break; + case 550: + error_code = EX_NOPERM; + break; + case 552: + case 553: + error_code = EX_UNAVAILABLE; + break; + default: + error_code = EX_PROTOCOL; + break; + } goto close_exit; } for (i = 0; i < rcptc; i++) @@ -933,11 +951,35 @@ error_code = EX_IOERR; goto close_exit; } - if (smtp_get_response(fd, &tls, 250) != 250) + if ((error_code = smtp_get_response(fd, &tls, 250)) != 250) { + switch (error_code) { + case 251: // not actually an error + continue; + case 450: + case 451: + case 452: + error_code = EX_TEMPFAIL; + break; + case 503: + error_code = EX_SOFTWARE; + break; + case 550: + error_code = EX_NOPERM; + break; + case 551: + error_code = EX_NOUSER; + break; + case 552: + case 553: + error_code = EX_UNAVAILABLE; + break; + default: + error_code = EX_PROTOCOL; + break; + } add_error_line("line `RCPT TO:<%s>' not accepted by SMTP server", rcptv[i]); - error_code = EX_DATAERR; goto close_exit; } } @@ -947,10 +989,23 @@ error_code = EX_IOERR; goto close_exit; } - if (smtp_get_response(fd, &tls, 354) != 354) + if ((error_code = smtp_get_response(fd, &tls, 354)) != 354) { + switch (error_code) { + case 451: + error_code = EX_TEMPFAIL; + break; + case 503: + error_code = EX_SOFTWARE; + break; + case 554: + error_code = EX_DATAERR; + break; + default: + error_code = EX_PROTOCOL; + break; + } add_error_line("SMTP server does not accept the mail"); - error_code = EX_DATAERR; goto close_exit; } /* Copy the mail from mailf to fd, converting '\n' to '\r\n' and a leading @@ -1029,10 +1084,24 @@ error_code = EX_IOERR; goto close_exit; } - if (smtp_get_response(fd, &tls, 250) != 250) + if ((error_code = smtp_get_response(fd, &tls, 250)) != 250) { + switch (error_code) { + case 451: + case 452: + error_code = EX_TEMPFAIL; + break; + case 552: + error_code = EX_UNAVAILABLE; + break; + case 554: + error_code = EX_DATAERR; + break; + default: + error_code = EX_PROTOCOL; + break; + } add_error_line("SMTP server did not accept the mail"); - error_code = EX_DATAERR; goto close_exit; }