diff options
author | Philip Hazel <ph10@hermes.cam.ac.uk> | 2006-03-01 16:07:16 +0000 |
---|---|---|
committer | Philip Hazel <ph10@hermes.cam.ac.uk> | 2006-03-01 16:07:16 +0000 |
commit | 75def545d117dbbceecc720827c6042144512aa0 (patch) | |
tree | 36292842b59a65fbd30d252134c3cecf4f7cf496 /src | |
parent | f90d018c03bbf7d8ac2cd50d33b47bdd7a4bcdf1 (diff) |
Bugs in temporary error message handling for smtp in lmtp mode.
Diffstat (limited to 'src')
-rw-r--r-- | src/src/deliver.c | 21 | ||||
-rw-r--r-- | src/src/transports/smtp.c | 14 |
2 files changed, 20 insertions, 15 deletions
diff --git a/src/src/deliver.c b/src/src/deliver.c index dda4897b9..0cb0132c4 100644 --- a/src/src/deliver.c +++ b/src/src/deliver.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/deliver.c,v 1.29 2006/02/21 16:24:19 ph10 Exp $ */ +/* $Cambridge: exim/src/src/deliver.c,v 1.30 2006/03/01 16:07:16 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -4299,15 +4299,15 @@ introducing newlines. All lines are indented by 4; the initial printing position must be set before calling. This function used always to print the error. Nowadays we want to restrict it -to cases such as SMTP errors from a remote host, and errors from :fail: and -filter "fail". We no longer pass other information willy-nilly in bounce and -warning messages. Text in user_message is always output; text in message only -if the af_pass_message flag is set. +to cases such as LMTP/SMTP errors from a remote host, and errors from :fail: +and filter "fail". We no longer pass other information willy-nilly in bounce +and warning messages. Text in user_message is always output; text in message +only if the af_pass_message flag is set. Arguments: addr the address f the FILE to print on - s some leading text + t some leading text Returns: nothing */ @@ -4316,14 +4316,11 @@ static void print_address_error(address_item *addr, FILE *f, uschar *t) { int count = Ustrlen(t); -uschar *s = (addr->user_message != NULL)? addr->user_message : addr->message; +uschar *s = testflag(addr, af_pass_message)? addr->message : NULL; -if (addr->user_message != NULL) - s = addr->user_message; -else +if (s == NULL) { - if (!testflag(addr, af_pass_message) || addr->message == NULL) return; - s = addr->message; + if (addr->user_message != NULL) s = addr->user_message; else return; } fprintf(f, "\n %s", t); diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index 345fb951b..9b204e064 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/transports/smtp.c,v 1.23 2006/02/28 12:42:47 ph10 Exp $ */ +/* $Cambridge: exim/src/src/transports/smtp.c,v 1.24 2006/03/01 16:07:16 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -1574,7 +1574,8 @@ if (!ok) ok = TRUE; else /* LMTP - if the response fails badly (e.g. timeout), use it for all the remaining addresses. Otherwise, it's a return code for just the one - address. */ + address. For temporary errors, add a retry item for the address so that + it doesn't get tried again too soon. */ if (lmtp) { @@ -1584,7 +1585,14 @@ if (!ok) ok = TRUE; else if (errno != 0 || buffer[0] == 0) goto RESPONSE_FAILED; addr->message = string_sprintf("LMTP error after %s: %s", big_buffer, string_printing(buffer)); - addr->transport_return = (buffer[0] == '5')? FAIL : DEFER; + setflag(addr, af_pass_message); /* Allow message to go to user */ + if (buffer[0] == '5') + addr->transport_return = FAIL; + else + { + addr->transport_return = DEFER; + retry_add_item(addr, addr->address_retry_key, 0); + } continue; } completed_address = TRUE; /* NOW we can set this flag */ |