]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/smtp/serv_smtpqueue.c
SMTP-client: when serializing, make next now+Retry
[citadel.git] / citadel / modules / smtp / serv_smtpqueue.c
index c4b46142a250eef6e7653c256bf0b4d9117ecd9a..b2c0ea2338af6ada31000619b344bb59d3091104 100644 (file)
@@ -161,17 +161,28 @@ void RemoveQItem(OneQueItem *MyQItem)
 void FreeMailQEntry(void *qv)
 {
        MailQEntry *Q = qv;
+/*
+       syslog(LOG_DEBUG, "---------------%s--------------", __FUNCTION__);
+       cit_backtrace();
+*/
        FreeStrBuf(&Q->Recipient);
        FreeStrBuf(&Q->StatusMessage);
+
+       memset(Q, 0, sizeof(MailQEntry));
        free(Q);
 }
 void FreeQueItem(OneQueItem **Item)
 {
+/*
+       syslog(LOG_DEBUG, "---------------%s--------------", __FUNCTION__);
+       cit_backtrace();
+*/
        DeleteHash(&(*Item)->MailQEntries);
        FreeStrBuf(&(*Item)->EnvelopeFrom);
        FreeStrBuf(&(*Item)->BounceTo);
        FreeStrBuf(&(*Item)->SenderRoom);
        FreeURL(&(*Item)->URL);
+       memset(*Item, 0, sizeof(OneQueItem));
        free(*Item);
        Item = NULL;
 }
@@ -185,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;
@@ -198,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;
@@ -308,18 +341,13 @@ StrBuf *SerializeQueueItem(OneQueItem *MyQItem)
 
        StrBufAppendBufPlain(QMessage, HKEY("\nattempted|"), 0);
        StrBufAppendPrintf(QMessage, "%ld",
-                          MyQItem->ReattemptWhen);
+                          ctdl_ev_now() + MyQItem->Retry);
 
        It = GetNewHashPos(MyQItem->MailQEntries, 0);
        while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
        {
                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);
@@ -394,7 +422,10 @@ void QItem_Handle_retry(OneQueItem *Item, StrBuf *Line, const char **Pos)
 {
        Item->Retry =
                StrBufExtractNext_int(Line, Pos, '|');
-       Item->Retry *= 2;
+       if (Item->Retry == 0)
+               Item->Retry = SMTP_RETRY_INTERVAL;
+       else
+               Item->Retry *= 2;
 }
 
 
@@ -455,36 +486,46 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt)
        StrBuf *Msg = NULL;
        StrBuf *BounceMB;
        struct recptypes *valid;
+       time_t now;
 
        HashPos *It;
        void *vQE;
        long len;
        const char *Key;
 
+       int first_attempt = 0;
        int successful_bounce = 0;
        int num_bounces = 0;
        int give_up = 0;
 
        syslog(LOG_DEBUG, "smtp_do_bounce() called\n");
 
-       if ( (ev_time() - MyQItem->Submitted) > SMTP_GIVE_UP ) {
-               give_up = 1;/// TODO: replace time by libevq timer get
+       if (MyQItem->SendBounceMail == 0)
+               return;
+
+       now = ev_time();
+
+       if ( (now - MyQItem->Submitted) > SMTP_GIVE_UP ) {
+               give_up = 1;
+       }
+
+       if (MyQItem->Retry == SMTP_RETRY_INTERVAL) {
+               first_attempt = 1;
        }
 
        /*
         * Now go through the instructions checking for stuff.
         */
+       Msg = NewStrBufPlain(NULL, 1024);
        It = GetNewHashPos(MyQItem->MailQEntries, 0);
        while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
        {
                MailQEntry *ThisItem = vQE;
-               if ((ThisItem->Status == 5) || /* failed now? */
-                   ((give_up == 1) &&
-                    (ThisItem->Status != 2)))
+               if ((ThisItem->Active && (ThisItem->Status == 5)) || /* failed now? */
+                   ((give_up == 1) && (ThisItem->Status != 2)) ||
+                   ((first_attempt == 1) && (ThisItem->Status != 2)))
                        /* giving up after failed attempts... */
                {
-                       if (num_bounces == 0)
-                               Msg = NewStrBufPlain(NULL, 1024);
                        ++num_bounces;
 
                        StrBufAppendBuf(Msg, ThisItem->Recipient, 0);
@@ -1061,7 +1102,7 @@ CTDL_MODULE_INIT(smtp_queu)
                Put(QItemHandlers, HKEY("submitted"), QItem_Handle_Submitted, reference_free_handler);
                smtp_init_spoolout();
 
-               CtdlRegisterCleanupHook(smtp_evq_cleanup);
+               CtdlRegisterEVCleanupHook(smtp_evq_cleanup);
 
                CtdlRegisterProtoHook(cmd_smtp, "SMTP", "SMTP utility commands");
                CtdlRegisterSessionHook(smtp_do_queue, EVT_TIMER);