Revert "SMTP-Client: move the client-shutdown procedure into the DB-Thread; we musn...
[citadel.git] / citadel / modules / smtp / serv_smtpeventclient.c
index 3f3dcd3d0004c605fd0b5db2f41975b34fc3f859..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
@@ -152,7 +159,7 @@ void FinalizeMessageSend(SmtpOutMsg *Msg)
        CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, &Msg->MyQItem->QueMsgID, 1, "");
 
        if (IDestructQueItem)
-               smtpq_do_bounce(Msg->MyQItem,Msg->msgtext);
+               smtpq_do_bounce(Msg->MyQItem, Msg->msgtext);
 
        if (nRemain > 0)
        {
@@ -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;
@@ -379,7 +388,6 @@ eNextState smtp_resolve_mx_record_done(AsyncIO *IO)
        if ((IO->DNS.Query->DNSStatus == ARES_SUCCESS) &&
            (IO->DNS.Query->VParsedDNSReply != NULL))
        { /* ok, we found mx records. */
-               Msg->IO.ErrMsg = Msg->MyQEntry->StatusMessage;
 
                Msg->CurrMX
                        = Msg->AllMX
@@ -391,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;
                }
@@ -420,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);
 }
@@ -478,6 +506,8 @@ SmtpOutMsg *new_smtp_outmsg(OneQueItem *MyQItem,
                     SMTP_C_Timeout,
                     SMTP_C_Shutdown);
 
+       Msg->IO.ErrMsg = Msg->MyQEntry->StatusMessage;
+
        return Msg;
 }
 
@@ -561,7 +591,7 @@ void SMTPSetTimeout(eNextState NextTCPState, SmtpOutMsg *Msg)
                        /* if we're sending a huge message,
                         * we need more time.
                         */
-                       Timeout += StrLength(Msg->msgtext) / 1024;
+                       Timeout += StrLength(Msg->msgtext) / 512;
                }
                break;
        case eReadMessage:
@@ -571,7 +601,7 @@ void SMTPSetTimeout(eNextState NextTCPState, SmtpOutMsg *Msg)
                         * some mailservers take a nap before accepting
                         * the message content inspection and such.
                         */
-                       Timeout += StrLength(Msg->msgtext) / 1024;
+                       Timeout += StrLength(Msg->msgtext) / 512;
                }
                break;
        case eSendDNSQuery:
@@ -631,7 +661,10 @@ eNextState SMTP_C_Timeout(AsyncIO *IO)
        Msg->MyQEntry->Status = 4;
        EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        StrBufPlain(IO->ErrMsg, CKEY(ReadErrors[Msg->State]));
-       return FailOneAttempt(IO);
+       if (Msg->State > eRCPT)
+               return eAbort;
+       else
+               return FailOneAttempt(IO);
 }
 eNextState SMTP_C_ConnFail(AsyncIO *IO)
 {