From ded2dfcfba9d0b30ff8f31086d03833d9bd75457 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Mon, 27 Feb 2012 22:50:38 +0100 Subject: [PATCH] SMTP-Client: decide when to send a bounce or not. --- citadel/modules/smtp/serv_smtpeventclient.c | 7 ++++ citadel/modules/smtp/serv_smtpqueue.c | 36 ++++++++++++++++----- citadel/modules/smtp/smtpqueue.h | 3 ++ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index d1815f91b..7374107d8 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -139,6 +139,13 @@ void FinalizeMessageSend(SmtpOutMsg *Msg) nRemain = CountActiveQueueEntries(Msg->MyQItem); + if (Msg->MyQEntry->Active && + CheckQEntryIsBounce(Msg->MyQEntry)) + { + /* are we casue for a bounce mail? */ + Msg->MyQItem->SendBounceMail = 1; + } + if ((nRemain > 0) || IDestructQueItem) MsgData = SerializeQueueItem(Msg->MyQItem); else diff --git a/citadel/modules/smtp/serv_smtpqueue.c b/citadel/modules/smtp/serv_smtpqueue.c index e9053981e..00b60f8fa 100644 --- a/citadel/modules/smtp/serv_smtpqueue.c +++ b/citadel/modules/smtp/serv_smtpqueue.c @@ -196,6 +196,29 @@ void HFreeQueItem(void *Item) * - 3/4 (transient errors * were experienced and it's time to try again) */ +int CheckQEntryActive(MailQEntry *ThisItem) +{ + if ((ThisItem->Status == 0) || + (ThisItem->Status == 3) || + (ThisItem->Status == 4)) + { + return 1; + } + else + return 0; +} +int CheckQEntryIsBounce(MailQEntry *ThisItem) +{ + if ((ThisItem->Status == 3) || + (ThisItem->Status == 4) || + (ThisItem->Status == 5)) + { + return 1; + } + else + return 0; +} + int CountActiveQueueEntries(OneQueItem *MyQItem) { HashPos *It; @@ -209,9 +232,8 @@ int CountActiveQueueEntries(OneQueItem *MyQItem) while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE)) { MailQEntry *ThisItem = vQE; - if ((ThisItem->Status == 0) || - (ThisItem->Status == 3) || - (ThisItem->Status == 4)) + + if (CheckQEntryActive(ThisItem)) { ActiveDeliveries++; ThisItem->Active = 1; @@ -326,11 +348,6 @@ StrBuf *SerializeQueueItem(OneQueItem *MyQItem) { MailQEntry *ThisItem = vQE; - if (!ThisItem->Active) - { - /* skip already sent ones from the spoolfile. */ - continue; - } StrBufAppendBufPlain(QMessage, HKEY("\nremote|"), 0); StrBufAppendBuf(QMessage, ThisItem->Recipient, 0); StrBufAppendBufPlain(QMessage, HKEY("|"), 0); @@ -478,6 +495,9 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt) syslog(LOG_DEBUG, "smtp_do_bounce() called\n"); + if (!MyQItem->SendBounceMail) + return; + if ( (ev_time() - MyQItem->Submitted) > SMTP_GIVE_UP ) { give_up = 1;/// TODO: replace time by libevq timer get } diff --git a/citadel/modules/smtp/smtpqueue.h b/citadel/modules/smtp/smtpqueue.h index 1b834f9b1..be14ea5b5 100644 --- a/citadel/modules/smtp/smtpqueue.h +++ b/citadel/modules/smtp/smtpqueue.h @@ -42,6 +42,7 @@ typedef struct _mailq_entry { }MailQEntry; typedef struct queueitem { + long SendBounceMail; long MessageID; long QueMsgID; long Submitted; @@ -69,3 +70,5 @@ void RemoveQItem(OneQueItem *MyQItem); int CountActiveQueueEntries(OneQueItem *MyQItem); StrBuf *SerializeQueueItem(OneQueItem *MyQItem); void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt); + +int CheckQEntryIsBounce(MailQEntry *ThisItem); -- 2.30.2