- our trigger to evaluate whether to bounce a message used to be whether its still active. Instead that it has to be whether it was active and isn't active anymore.
Msg->IDestructQueItem = DecreaseQReference(Msg->MyQItem);
Msg->IDestructQueItem = DecreaseQReference(Msg->MyQItem);
- Msg->nRemain = CountActiveQueueEntries(Msg->MyQItem);
+ Msg->nRemain = CountActiveQueueEntries(Msg->MyQItem, 0);
if (Msg->MyQEntry->Active &&
if (Msg->MyQEntry->Active &&
+ !Msg->MyQEntry->StillActive &&
CheckQEntryIsBounce(Msg->MyQEntry))
{
/* are we casue for a bounce mail? */
CheckQEntryIsBounce(Msg->MyQEntry))
{
/* are we casue for a bounce mail? */
-int CountActiveQueueEntries(OneQueItem *MyQItem)
+int CountActiveQueueEntries(OneQueItem *MyQItem, int before)
It = GetNewHashPos(MyQItem->MailQEntries, 0);
while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
{
It = GetNewHashPos(MyQItem->MailQEntries, 0);
while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
{
MailQEntry *ThisItem = vQE;
if (CheckQEntryActive(ThisItem))
{
ActiveDeliveries++;
MailQEntry *ThisItem = vQE;
if (CheckQEntryActive(ThisItem))
{
ActiveDeliveries++;
+ Active = 0;
+ if (before)
+ ThisItem->Active = Active;
+ else
+ ThisItem->StillActive = Active;
}
DeleteHashPos(&It);
return ActiveDeliveries;
}
DeleteHashPos(&It);
return ActiveDeliveries;
DeleteHashPos(&It);
MyQItem->NotYetShutdownDeliveries =
DeleteHashPos(&It);
MyQItem->NotYetShutdownDeliveries =
- MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem);
+ MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem, 1);
/* failsafe against overload:
* will we exceed the limit set?
/* failsafe against overload:
* will we exceed the limit set?
}MailQEntry;
typedef struct queueitem {
}MailQEntry;
typedef struct queueitem {
void DecreaseShutdownDeliveries(OneQueItem *MyQItem);
int GetShutdownDeliveries(OneQueItem *MyQItem);
void RemoveQItem(OneQueItem *MyQItem);
void DecreaseShutdownDeliveries(OneQueItem *MyQItem);
int GetShutdownDeliveries(OneQueItem *MyQItem);
void RemoveQItem(OneQueItem *MyQItem);
-int CountActiveQueueEntries(OneQueItem *MyQItem);
+int CountActiveQueueEntries(OneQueItem *MyQItem, int before);
StrBuf *SerializeQueueItem(OneQueItem *MyQItem);
void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt);
StrBuf *SerializeQueueItem(OneQueItem *MyQItem);
void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt);