int MsgCount = 0;
int run_queue_now = 0; /* Set to 1 to ignore SMTP send retry times */
+void RegisterQItemHandler(const char *Key, long Len, QItemHandler H)
+{
+ QItemHandlerStruct *HS = (QItemHandlerStruct*)malloc(sizeof(QItemHandlerStruct));
+ HS->H = H;
+ Put(QItemHandlers, Key, Len, HS, NULL);
+}
+
+
+
void smtp_try_one_queue_entry(OneQueItem *MyQItem,
MailQEntry *MyQEntry,
StrBuf *MsgText,
return IDestructQueItem;
}
+void DecreaseShutdownDeliveries(OneQueItem *MyQItem)
+{
+ pthread_mutex_lock(&ActiveQItemsLock);
+ MyQItem->NotYetShutdownDeliveries--;
+ pthread_mutex_unlock(&ActiveQItemsLock);
+}
+
+int GetShutdownDeliveries(OneQueItem *MyQItem)
+{
+ int DestructNow;
+
+ pthread_mutex_lock(&ActiveQItemsLock);
+ DestructNow = MyQItem->ActiveDeliveries == 0;
+ pthread_mutex_unlock(&ActiveQItemsLock);
+ return DestructNow;
+}
void RemoveQItem(OneQueItem *MyQItem)
{
long len;
StrBufExtract_NextToken(Token, Line, &pItemPart, '|');
if (GetHash(QItemHandlers, SKEY(Token), &vHandler))
{
- QItemHandler H;
- H = (QItemHandler) vHandler;
- H(Item, Line, &pItemPart);
+ QItemHandlerStruct *HS;
+ HS = (QItemHandlerStruct*) vHandler;
+ HS->H(Item, Line, &pItemPart);
}
}
FreeStrBuf(&Line);
StrBufAppendBufPlain(QMessage, HKEY("\nattempted|"), 0);
StrBufAppendPrintf(QMessage, "%ld",
- MyQItem->ReattemptWhen);
+ time(NULL) /*ctdl_ev_now()*/ + MyQItem->Retry);
It = GetNewHashPos(MyQItem->MailQEntries, 0);
while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
{
Item->Retry =
StrBufExtractNext_int(Line, Pos, '|');
- Item->Retry *= 2;
+ if (Item->Retry == 0)
+ Item->Retry = SMTP_RETRY_INTERVAL;
+ else
+ Item->Retry *= 2;
}
if (MyQItem->SendBounceMail == 0)
return;
- now = ev_time();
+ now = time (NULL); //ev_time();
if ( (now - MyQItem->Submitted) > SMTP_GIVE_UP ) {
give_up = 1;
}
/* Attach the original message */
- StrBufAppendBufPlain(BounceMB, HKEY("--"), 0);
+ StrBufAppendBufPlain(BounceMB, HKEY("\r\n--"), 0);
StrBufAppendBuf(BounceMB, boundary, 0);
StrBufAppendBufPlain(BounceMB, HKEY("\r\n"), 0);
StrBufAppendBufPlain(BounceMB,
* Called by smtp_do_queue() to handle an individual message.
*/
void smtp_do_procmsg(long msgnum, void *userdata) {
+ time_t now;
int mynumsessions = num_sessions;
struct CtdlMessage *msg = NULL;
char *instr = NULL;
/*
* Postpone delivery if we've already tried recently.
*/
+ now = time(NULL);
if ((MyQItem->ReattemptWhen != 0) &&
- (time(NULL) < MyQItem->ReattemptWhen) &&
+ (now < MyQItem->ReattemptWhen) &&
(run_queue_now == 0))
{
- syslog(LOG_DEBUG, "SMTP client: Retry time not yet reached.\n");
+ syslog(LOG_DEBUG, "SMTP client: Retry time not yet reached. %ld seconds left.", MyQItem->ReattemptWhen - now);
It = GetNewHashPos(MyQItem->MailQEntries, 0);
pthread_mutex_lock(&ActiveQItemsLock);
}
DeleteHashPos(&It);
+ MyQItem->NotYetShutdownDeliveries =
MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem);
/* failsafe against overload:
QItemHandlers = NewHash(0, NULL);
- Put(QItemHandlers, HKEY("msgid"), QItem_Handle_MsgID, reference_free_handler);
- Put(QItemHandlers, HKEY("envelope_from"), QItem_Handle_EnvelopeFrom, reference_free_handler);
- Put(QItemHandlers, HKEY("retry"), QItem_Handle_retry, reference_free_handler);
- Put(QItemHandlers, HKEY("attempted"), QItem_Handle_Attempted, reference_free_handler);
- Put(QItemHandlers, HKEY("remote"), QItem_Handle_Recipient, reference_free_handler);
- Put(QItemHandlers, HKEY("bounceto"), QItem_Handle_BounceTo, reference_free_handler);
- Put(QItemHandlers, HKEY("source_room"), QItem_Handle_SenderRoom, reference_free_handler);
- Put(QItemHandlers, HKEY("submitted"), QItem_Handle_Submitted, reference_free_handler);
+ RegisterQItemHandler(HKEY("msgid"), QItem_Handle_MsgID);
+ RegisterQItemHandler(HKEY("envelope_from"), QItem_Handle_EnvelopeFrom);
+ RegisterQItemHandler(HKEY("retry"), QItem_Handle_retry);
+ RegisterQItemHandler(HKEY("attempted"), QItem_Handle_Attempted);
+ RegisterQItemHandler(HKEY("remote"), QItem_Handle_Recipient);
+ RegisterQItemHandler(HKEY("bounceto"), QItem_Handle_BounceTo);
+ RegisterQItemHandler(HKEY("source_room"), QItem_Handle_SenderRoom);
+ RegisterQItemHandler(HKEY("submitted"), QItem_Handle_Submitted);
+
smtp_init_spoolout();
CtdlRegisterEVCleanupHook(smtp_evq_cleanup);