]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/smtp/serv_smtpeventclient.c
SMTP-Client: send a message on first failed, or permanently failed attempt & on last...
[citadel.git] / citadel / modules / smtp / serv_smtpeventclient.c
index 3a65977ffc12c1dce78d76c1e9c45b83e7daaa09..90a36b23539f6582b823bd1ec4ce023b834b9562 100644 (file)
@@ -106,7 +106,7 @@ void DeleteSmtpOutMsg(void *v)
        FreeURL(&Msg->Relay);
        FreeStrBuf(&Msg->msgtext);
        FreeAsyncIOContents(&Msg->IO);
-///    memset (Msg, 0, sizeof(SmtpOutMsg)); /* just to be shure... */
+       memset (Msg, 0, sizeof(SmtpOutMsg)); /* just to be shure... */
        free(Msg);
 }
 
@@ -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<<Msg->MyQEntry->Status);
+       }
+
        if ((nRemain > 0) || IDestructQueItem)
                MsgData = SerializeQueueItem(Msg->MyQItem);
        else
@@ -163,6 +170,7 @@ void FinalizeMessageSend(SmtpOutMsg *Msg)
                msg->cm_anon_type = MES_NORMAL;
                msg->cm_format_type = FMT_RFC822;
                msg->cm_fields['M'] = SmashStrBuf(&MsgData);
+               msg->cm_fields['U'] = strdup("QMSG");
                Msg->MyQItem->QueMsgID =
                        CtdlSubmitMsg(msg, NULL, SMTP_SPOOLOUT_ROOM, QP_EADDR);
                EVS_syslog(LOG_DEBUG, "SMTPQ: %ld", Msg->MyQItem->QueMsgID);
@@ -372,6 +380,7 @@ eNextState smtp_resolve_mx_record_done(AsyncIO *IO)
        QueryCbDone(IO);
 
        EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+
        pp = &Msg->Relay;
        while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
                pp = &(*pp)->Next;
@@ -390,13 +399,29 @@ eNextState smtp_resolve_mx_record_done(AsyncIO *IO)
 
                                p = (ParsedURL*) malloc(sizeof(ParsedURL));
                                memset(p, 0, sizeof(ParsedURL));
+                               p->Priority = Msg->CurrMX->priority;
                                p->IsIP = 0;
                                p->Port = DefaultMXPort;
                                p->IPv6 = i == 1;
                                p->Host = Msg->CurrMX->host;
-
-                               *pp = p;
-                               pp = &p->Next;
+                               if (*pp == NULL)
+                                       *pp = p;
+                               else {
+                                       ParsedURL *ppp = *pp;
+
+                                       while ((ppp->Next != NULL) &&
+                                              (ppp->Next->Priority <= p->Priority))
+                                              ppp = ppp->Next;
+                                       if ((ppp == *pp) &&
+                                           (ppp->Priority > p->Priority)) {
+                                               p->Next = *pp;
+                                               *pp = p;
+                                       }
+                                       else {
+                                               p->Next = ppp->Next;
+                                               ppp->Next = p;
+                                       }
+                               }
                        }
                        Msg->CurrMX    = Msg->CurrMX->next;
                }
@@ -419,7 +444,11 @@ eNextState smtp_resolve_mx_record_done(AsyncIO *IO)
                }
                Msg->CXFlags   = Msg->CXFlags & F_DIRECT;
        }
-       *pp = Msg->MyQItem->FallBackHost;
+       if (Msg->MyQItem->FallBackHost != NULL)
+       {
+               Msg->MyQItem->FallBackHost->Next = *pp;
+               *pp = Msg->MyQItem->FallBackHost;
+       }
        Msg->pCurrRelay = Msg->Relay;
        return get_one_mx_host_ip(IO);
 }