X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fsmtp%2Fserv_smtpqueue.c;h=c128fd49026fe728627dbe8d147b4fb4b3959bdb;hb=79a538293acb62e5ecf5b09574d6bd5d58b03eca;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..c128fd490 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, @@ -808,7 +829,7 @@ void smtp_do_procmsg(long msgnum, void *userdata) { StrBuf *Msg =NULL; if (mynumsessions > max_sessions_for_outbound_smtp) { - SMTPC_syslog(LOG_DEBUG, + SMTPC_syslog(LOG_INFO, "skipping because of num jobs %d > %d max_sessions_for_outbound_smtp", mynumsessions, max_sessions_for_outbound_smtp); @@ -919,13 +940,23 @@ void smtp_do_procmsg(long msgnum, void *userdata) { (((MyQItem->ActiveDeliveries * 2) < max_sessions_for_outbound_smtp))) { /* abort delivery for another time. */ - SMTPC_syslog(LOG_DEBUG, + SMTPC_syslog(LOG_INFO, "SMTP Queue: skipping because of num jobs %d + %ld > %d max_sessions_for_outbound_smtp", mynumsessions, MyQItem->ActiveDeliveries, max_sessions_for_outbound_smtp); - FreeQueItem(&MyQItem); + It = GetNewHashPos(MyQItem->MailQEntries, 0); + pthread_mutex_lock(&ActiveQItemsLock); + { + if (GetHashPosFromKey(ActiveQItems, + LKEY(MyQItem->MessageID), + It)) + { + DeleteEntryFromHash(ActiveQItems, It); + } + } + pthread_mutex_unlock(&ActiveQItemsLock); return; } @@ -939,12 +970,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)))