X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fsmtp%2Fserv_smtpqueue.c;h=fb74ed2ad76d7afc6b31bb0a5e1c133701c79857;hb=9e07e8e851dcb5758feacb349cbb94b15799d632;hp=a9ad37518659a5ec3143d350e847f993bc3b1d17;hpb=ab5c8068bad6fe3134f11c4a930d75da3d26cbfe;p=citadel.git diff --git a/citadel/modules/smtp/serv_smtpqueue.c b/citadel/modules/smtp/serv_smtpqueue.c index a9ad37518..fb74ed2ad 100644 --- a/citadel/modules/smtp/serv_smtpqueue.c +++ b/citadel/modules/smtp/serv_smtpqueue.c @@ -194,7 +194,7 @@ void FreeMailQEntry(void *qv) */ FreeStrBuf(&Q->Recipient); FreeStrBuf(&Q->StatusMessage); - + FreeStrBuf(&Q->AllStatusMessages); memset(Q, 0, sizeof(MailQEntry)); free(Q); } @@ -385,7 +385,10 @@ StrBuf *SerializeQueueItem(OneQueItem *MyQItem) StrBufAppendBufPlain(QMessage, HKEY("|"), 0); StrBufAppendPrintf(QMessage, "%d", ThisItem->Status); StrBufAppendBufPlain(QMessage, HKEY("|"), 0); - StrBufAppendBuf(QMessage, ThisItem->StatusMessage, 0); + if (ThisItem->AllStatusMessages != NULL) + StrBufAppendBuf(QMessage, ThisItem->AllStatusMessages, 0); + else + StrBufAppendBuf(QMessage, ThisItem->StatusMessage, 0); } DeleteHashPos(&It); StrBufAppendBufPlain(QMessage, HKEY("\n"), 0); @@ -512,7 +515,7 @@ StrBuf *smtp_load_msg(OneQueItem *MyQItem, int n, char **Author, char **Address) * instructions for "5" codes (permanent fatal errors) and produce/deliver * a "bounce" message (delivery status notification). */ -void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt) +void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt, ParsedURL *Relay) { static int seq = 0; @@ -563,6 +566,7 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt) { ++num_bounces; + StrBufAppendBufPlain(Msg, HKEY(" "), 0); StrBufAppendBuf(Msg, ThisItem->Recipient, 0); StrBufAppendBufPlain(Msg, HKEY(": "), 0); StrBufAppendBuf(Msg, ThisItem->StatusMessage, 0); @@ -579,6 +583,22 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt) return; } + if ((StrLength(MyQItem->SenderRoom) == 0) && MyQItem->HaveRelay) { + const char *RelayUrlStr = "[not found]"; + /* one message that relaying is broken is enough; no extra room error message. */ + StrBuf *RelayDetails = NewStrBuf(); + + if (Relay != NULL) + RelayUrlStr = ChrPtr(Relay->URL); + + StrBufPrintf(RelayDetails, + "Relaying via %s failed permanently. \n Reason:\n%s\n Revalidate your relay configuration.", + RelayUrlStr, + ChrPtr(Msg)); + CtdlAideMessage(ChrPtr(RelayDetails), "Relaying Failed"); + FreeStrBuf(&RelayDetails); + } + boundary = NewStrBufPlain(HKEY("=_Citadel_Multipart_")); StrBufAppendPrintf(boundary, "%s_%04x%04x", @@ -765,9 +785,10 @@ ParsedURL *LoadRelayUrls(OneQueItem *MyQItem, if (!strcmp(User + 1, Author) || !strcmp(User + 1, Address)) StrBufCutAt(One, 0, User); - else + else { + MyQItem->HaveRelay = 1; continue; - + } } if (!ParseURL(Url, One, DefaultMXPort)) { SMTPC_syslog(LOG_DEBUG, @@ -939,12 +960,54 @@ void smtp_do_procmsg(long msgnum, void *userdata) { int m = MyQItem->ActiveDeliveries; int i = 1; + It = GetNewHashPos(MyQItem->MailQEntries, 0); + Msg = smtp_load_msg(MyQItem, n, &Author, &Address); RelayUrls = LoadRelayUrls(MyQItem, Author, Address); + if ((RelayUrls == NULL) && MyQItem->HaveRelay) { + + while ((i <= m) && + (GetNextHashPos(MyQItem->MailQEntries, + It, &len, &Key, &vQE))) + { + int KeepBuffers = (i == m); + MailQEntry *ThisItem = vQE; + StrBufPrintf(ThisItem->StatusMessage, + "No relay configured matching %s / %s", + (Author != NULL)? Author : "", + (Address != NULL)? Address : ""); + ThisItem->Status = 5; + + nActivated++; + + if (i > 1) n = MsgCount++; + syslog(LOG_INFO, + "SMTPC: giving up on <%ld> <%s> %d / %d \n", + MyQItem->MessageID, + ChrPtr(ThisItem->Recipient), + i, + m); + (*((int*) userdata)) ++; + smtp_try_one_queue_entry(MyQItem, + ThisItem, + Msg, + KeepBuffers, + n, + RelayUrls); + + if (KeepBuffers) HaveBuffers = 1; + + i++; + } + if (Author != NULL) free (Author); + if (Address != NULL) free (Address); + DeleteHashPos(&It); + + return; + } if (Author != NULL) free (Author); if (Address != NULL) free (Address); - It = GetNewHashPos(MyQItem->MailQEntries, 0); while ((i <= m) && (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE)))