Index: sink.c =================================================================== RCS file: /home/cvs/debian/fetchmail/sink.c,v retrieving revision 1.35 diff -u -r1.35 sink.c --- sink.c 24 Mar 2002 04:12:29 -0000 1.35 +++ sink.c 6 Apr 2002 17:13:18 -0000 @@ -728,33 +728,36 @@ #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS char errbuf[POPBUFSIZE]; #endif /* EXPLICIT_BOUNCE_ON_BAD_ADDRESS */ - if (handle_smtp_report(ctl, msg) == PS_TRANSIENT) - force_transient_error = 1; - + switch (handle_smtp_report(ctl, msg)) { + case PS_REFUSED: break; + case PS_TRANSIENT: force_transient_error = 1; + /* fallthrough to default! */ + default: #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS #ifdef HAVE_SNPRINTF - snprintf(errbuf, sizeof(errbuf), "%s: %s", - idp->id, smtp_response); + snprintf(errbuf, sizeof(errbuf), "%s: %s", + idp->id, smtp_response); #else - strncpy(errbuf, idp->id, sizeof(errbuf)); - strcat(errbuf, ": "); - strcat(errbuf, smtp_response); + strncpy(errbuf, idp->id, sizeof(errbuf)); + strcat(errbuf, ": "); + strcat(errbuf, smtp_response); #endif /* HAVE_SNPRINTF */ - xalloca(from_responses[*bad_addresses], - char *, - strlen(errbuf)+1); - strcpy(from_responses[*bad_addresses], errbuf); + xalloca(from_responses[*bad_addresses], + char *, + strlen(errbuf)+1); + strcpy(from_responses[*bad_addresses], errbuf); #endif /* EXPLICIT_BOUNCE_ON_BAD_ADDRESS */ - (*bad_addresses)++; - idp->val.status.mark = XMIT_RCPTBAD; - if (outlevel >= O_VERBOSE) - report(stderr, - GT_("%cMTP listener doesn't like recipient address `%s'\n"), - ctl->listener, addr); - } - } + (*bad_addresses)++; + idp->val.status.mark = XMIT_RCPTBAD; + if (outlevel >= O_VERBOSE) + report(stderr, + GT_("%cMTP listener doesn't like recipient address `%s'\n"), + ctl->listener, addr); + } /* switch */ + } /* else */ + } /* if and loop */ #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS /* @@ -779,10 +782,17 @@ if (force_transient_error) { /* do not risk dataloss due to overengineered multidrop * crap. If one of the recipients returned PS_TRANSIENT, - * we return exactly that. + * we return exactly that. And we don't bounce the mail + * either. Yes, some people might get duplicates. So + * what? There is no decent fix for THAT one. */ SMTP_rset(ctl->smtp_socket); /* required by RFC1870 */ return(PS_TRANSIENT); + } + /* All recipients were PS_REFUSED? No bouncing in that case */ + if (!(*bad_addresses)) { + SMTP_rset(ctl->smtp_socket); /* required by RFC1870 */ + return(PS_REFUSED); } if (!run.postmaster[0]) {