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)
{
QueryCbDone(IO);
EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
- pp = &Msg->Relay;
- while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
- pp = &(*pp)->Next;
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
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 (Msg->Relay == NULL)
+ Msg->Relay = p;
+ else {
+ ParsedURL *pp = Msg->Relay;
+
+ while ((pp->Next != NULL) &&
+ (pp->Next->Priority <= p->Priority))
+ pp = pp->Next;
+ if ((pp == Msg->Relay) &&
+ (pp->Priority > p->Priority)) {
+ p->Next = Msg->Relay;
+ Msg->Relay = p;
+ }
+ else {
+ p->Next = pp->Next;
+ pp->Next = p;
+ }
+ }
}
Msg->CurrMX = Msg->CurrMX->next;
}
Msg->CXFlags = Msg->CXFlags & F_HAVE_MX;
}
else { /* else fall back to the plain hostname */
+ pp = &Msg->Relay;
+ while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
+ pp = &(*pp)->Next;
int i;
for (i = 0; i < 2; i++) {
ParsedURL *p;
SMTP_C_Timeout,
SMTP_C_Shutdown);
+ Msg->IO.ErrMsg = Msg->MyQEntry->StatusMessage;
+
return 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:
* 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:
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)
{