One of the changes I made in 2.05 for handling temporary errors was a
stupid idea. My brain was definitely switched off at the time. When
sending a message over SMTP, if RCPT TO receives a 4xx error, I arranged
for that address to be put on a retry list so that it isn't tried again
too often (previously this didn't happen, so it retried at every queue
run). So far, so good. I think that is the right thing to do.
However, I then considered 4xx errors for MAIL FROM, DATA, and ".", and
this is where I had the brainstorm. What I did was to make Exim put
*all* recipients on the retry lists for any of those errors. This is
definitely a Bad Thing, because it means that one message with, say, a
dodgy sender address (causing 4xx to MAIL FROM), can cause delays to
other messages for the same recipients.
The patch (below) cuts out this bit of stupidity, while leaving in the
retrying for addresses that get 4xx errors after RCPT TO.
I will have to go back to the drawing board and think about MAIL FROM.
There *are* common cases of 4xx errors for that: from our local logs I
see things like
421 service not available, closing channel
451 SMTP-MAIL: died on signal 9
452 Cannot write to message file
452 Not enough disk space
and after the end of the data (i.e. after ">"):
452 Requested action not taken: insufficient storage
An idea that has just come to me is the possibility of basing the
retrying on the combination of message id and remote IP address for
these cases, using the retry rules for the remote host. I'll look into
that.
Apologies for any problems this may have caused.
Philip
--
Philip Hazel University of Cambridge Computing Service,
ph10@??? Cambridge, England. Phone: +44 1223 334714.
*** ../Releases/exim-2.05/src/transports/smtp.c Thu Oct 8 11:00:12 1998
--- src/transports/smtp.c Fri Oct 16 15:08:05 1998
***************
*** 1434,1441 ****
--- 1434,1443 ----
{
if (host->next != NULL) log_write(0, LOG_MAIN, "%s", message);
fprintf(message_log, "%s %s\n", tod_stamp(tod_log), message);
+ /*
for (addr = addrlist; addr != NULL; addr = addr->next)
retry_add_item(addr, (addr->local)? "D" : "R", TRUE, NULL, FALSE);
+ */
}
}
}
--
*** Exim information can be found at
http://www.exim.org/ ***