#include "smtpqueue.h"
#include "smtp_clienthandlers.h"
+int SMTPClientDebugEnabled = 0;
const unsigned short DefaultMXPort = 25;
void DeleteSmtpOutMsg(void *v)
{
SmtpOutMsg *Msg = v;
AsyncIO *IO = &Msg->IO;
- EV_syslog(LOG_DEBUG, "SMTP: %s Aborting\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s Exit\n", __FUNCTION__);
/* these are kept in our own space and free'd below */
Msg->IO.ConnectMe = NULL;
eNextState FinalizeMessageSend_DB1(AsyncIO *IO);
eNextState FinalizeMessageSend_DB2(AsyncIO *IO);
eNextState FinalizeMessageSend_DB3(AsyncIO *IO);
+eNextState FinalizeMessageSend_DB4(AsyncIO *IO);
/******************************************************************************
* So, we're finished with sending (regardless of success or failure) *
******************************************************************************/
inline void FinalizeMessageSend_1(AsyncIO *IO)
{
+ const char *Status;
SmtpOutMsg *Msg = IO->Data;
+
+ if (Msg->MyQEntry->Status == 2)
+ Status = "Delivery successful.";
+ else if (Msg->MyQEntry->Status == 5)
+ Status = "Delivery failed permanently; giving up.";
+ else
+ Status = "Delivery failed temporarily; will retry later.";
+
+ EVS_syslog(LOG_INFO,
+ "%s Time[%fs] Recipient <%s> @ <%s> (%s) Status message: %s\n",
+ Status,
+ Msg->IO.Now - Msg->IO.StartIO,
+ Msg->user,
+ Msg->node,
+ Msg->name,
+ ChrPtr(Msg->MyQEntry->StatusMessage));
+
+
Msg->IDestructQueItem = DecreaseQReference(Msg->MyQItem);
Msg->nRemain = CountActiveQueueEntries(Msg->MyQItem);
* Uncompleted delivery instructions remain, so delete the old
* instructions and replace with the updated ones.
*/
- EVS_syslog(LOG_DEBUG, "SMTPQD: %ld", Msg->MyQItem->QueMsgID);
+ EVS_syslog(LOG_DEBUG, "%ld", Msg->MyQItem->QueMsgID);
CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, &Msg->MyQItem->QueMsgID, 1, "");
}
eNextState FinalizeMessageSend_DB1(AsyncIO *IO)
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);
+ EVS_syslog(LOG_DEBUG, "%ld", Msg->MyQItem->QueMsgID);
CtdlFreeMessage(msg);
}
else {
"");
FreeStrBuf(&Msg->QMsgData);
}
+ DecreaseShutdownDeliveries(Msg->MyQItem);
}
eNextState FinalizeMessageSend_DB3(AsyncIO *IO)
{
+ SmtpOutMsg *Msg = IO->Data;
FinalizeMessageSend_DB_3(IO);
- return eAbort;
+ if (!Msg->IDestructQueItem)
+ return eAbort;
+ return NextDBOperation(IO, FinalizeMessageSend_DB4);
+}
+
+eNextState FinalizeMessageSend_DB4(AsyncIO *IO)
+{
+ int Done;
+ SmtpOutMsg *Msg = IO->Data;
+
+ Done = GetShutdownDeliveries(Msg->MyQItem);
+ if (!Done)
+ return NextDBOperation(IO, FinalizeMessageSend_DB4);
+ else
+ return eAbort;
}
eNextState FinalizeMessageSend_DB(AsyncIO *IO)
Msg->pCurrRelay = Msg->pCurrRelay->Next;
if (Msg->pCurrRelay == NULL) {
- EVS_syslog(LOG_DEBUG, "SMTP: %s Aborting\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s Aborting\n", __FUNCTION__);
return eAbort;
}
if (Msg->pCurrRelay->IsIP) {
- EVS_syslog(LOG_DEBUG, "SMTP: %s connecting IP\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s connecting IP\n", __FUNCTION__);
return mx_connect_ip(IO);
}
else {
EVS_syslog(LOG_DEBUG,
- "SMTP: %s resolving next MX Record\n",
+ "%s resolving next MX Record\n",
__FUNCTION__);
return get_one_mx_host_ip(IO);
}
if (Msg->mx_host == NULL)
Msg->mx_host = "<no MX-Record>";
- EVS_syslog(LOG_DEBUG,
- "SMTP client[%ld]: connecting to %s [%s]:%d ...\n",
- Msg->n,
+ EVS_syslog(LOG_INFO,
+ "connecting to %s [%s]:%d ...\n",
Msg->mx_host,
buf,
Msg->IO.ConnectMe->Port);
{
SmtpOutMsg *Msg = IO->Data;
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
IO->ConnectMe = Msg->pCurrRelay;
Msg->State = eConnectMX;
struct hostent *hostent;
QueryCbDone(IO);
+ EVS_syslog(LOG_DEBUG, "%s Time[%fs]\n",
+ __FUNCTION__,
+ IO->Now - IO->DNS.Start);
hostent = Msg->HostLookup.VParsedDNSReply;
if ((Msg->HostLookup.DNSStatus == ARES_SUCCESS) &&
addr->sin_port = htons(DefaultMXPort);
}
Msg->mx_host = Msg->pCurrRelay->Host;
+ if (Msg->HostLookup.VParsedDNSReply != NULL) {
+ Msg->HostLookup.DNSReplyFree(Msg->HostLookup.VParsedDNSReply);
+ Msg->HostLookup.VParsedDNSReply = NULL;
+ }
return mx_connect_ip(IO);
}
- else
+ else {
+ if (Msg->HostLookup.VParsedDNSReply != NULL) {
+ Msg->HostLookup.DNSReplyFree(Msg->HostLookup.VParsedDNSReply);
+ Msg->HostLookup.VParsedDNSReply = NULL;
+ }
return FailOneAttempt(IO);
+ }
}
eNextState get_one_mx_host_ip(AsyncIO *IO)
* - one of the mx'es
*/
- InitC_ares_dns(IO);
-
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
EVS_syslog(LOG_DEBUG,
- "SMTP client[%ld]: looking up %s-Record %s : %d ...\n",
- Msg->n,
+ "looking up %s-Record %s : %d ...\n",
(Msg->pCurrRelay->IPv6)? "aaaa": "a",
Msg->pCurrRelay->Host,
Msg->pCurrRelay->Port);
QueryCbDone(IO);
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s Time[%fs]\n",
+ __FUNCTION__,
+ IO->Now - IO->DNS.Start);
pp = &Msg->Relay;
while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
{
SmtpOutMsg * Msg = IO->Data;
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
/* start resolving MX records here. */
if (!QueueQuery(ns_t_mx,
Msg->node,
{
SmtpOutMsg *Msg;
- syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ SMTPC_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
Msg = new_smtp_outmsg(MyQItem, MyQEntry, MsgCount);
if (KeepMsgText) Msg->msgtext = MsgText;
sizeof(((CitContext *)
Msg->IO.CitContext)->cs_host));
- syslog(LOG_DEBUG, "SMTP Starting: [%ld] <%s> CC <%d> \n",
- Msg->MyQItem->MessageID,
- ChrPtr(Msg->MyQEntry->Recipient),
- ((CitContext*)Msg->IO.CitContext)->cs_pid);
+ SMTPC_syslog(LOG_DEBUG, "Starting: [%ld] <%s> CC <%d> \n",
+ Msg->MyQItem->MessageID,
+ ChrPtr(Msg->MyQEntry->Recipient),
+ ((CitContext*)Msg->IO.CitContext)->cs_pid);
if (Msg->pCurrRelay == NULL)
QueueEventContext(&Msg->IO,
resolve_mx_records);
double Timeout = 0.0;
AsyncIO *IO = &Msg->IO;
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
switch (NextTCPState) {
case eSendFile:
}
eNextState SMTP_C_DispatchReadDone(AsyncIO *IO)
{
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
SmtpOutMsg *Msg = IO->Data;
eNextState rc;
}
eNextState SMTP_C_DispatchWriteDone(AsyncIO *IO)
{
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
SmtpOutMsg *Msg = IO->Data;
eNextState rc;
{
SmtpOutMsg *Msg = IO->Data;
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
return FinalizeMessageSend(Msg);
}
eNextState SMTP_C_TerminateDB(AsyncIO *IO)
{
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
return FinalizeMessageSend_DB(IO);
}
eNextState SMTP_C_Timeout(AsyncIO *IO)
SmtpOutMsg *Msg = IO->Data;
Msg->MyQEntry->Status = 4;
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
StrBufPlain(IO->ErrMsg, CKEY(ReadErrors[Msg->State]));
if (Msg->State > eRCPT)
return eAbort;
SmtpOutMsg *Msg = IO->Data;
Msg->MyQEntry->Status = 4;
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
StrBufPlain(IO->ErrMsg, CKEY(ReadErrors[Msg->State]));
return FailOneAttempt(IO);
}
{
SmtpOutMsg *Msg = IO->Data;
Msg->MyQEntry->Status = 4;
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
return FailOneAttempt(IO);
}
eNextState SMTP_C_Shutdown(AsyncIO *IO)
{
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__);
SmtpOutMsg *Msg = IO->Data;
Msg->MyQEntry->Status = 3;
return Finished;
}
+void LogDebugEnableSMTPClient(const int n)
+{
+ SMTPClientDebugEnabled = n;
+}
+
CTDL_MODULE_INIT(smtp_eventclient)
{
+ if (!threading)
+ CtdlRegisterDebugFlagHook(HKEY("smtpeventclient"), LogDebugEnableSMTPClient, &SMTPClientDebugEnabled);
return "smtpeventclient";
}