+ if ((Msg->nRemain > 0) || Msg->IDestructQueItem)
+ Msg->QMsgData = SerializeQueueItem(Msg->MyQItem);
+ else
+ Msg->QMsgData = NULL;
+}
+eNextState FinalizeMessageSend(SmtpOutMsg *Msg)
+{
+ return QueueDBOperation(&Msg->IO, FinalizeMessageSend_DB1);
+}
+
+inline void FinalizeMessageSend_DB_1(AsyncIO *IO)
+{
+ SmtpOutMsg *Msg = IO->Data;
+
+ /*
+ * Uncompleted delivery instructions remain, so delete the old
+ * instructions and replace with the updated ones.
+ */
+ EVS_syslog(LOG_DEBUG, "%ld", Msg->MyQItem->QueMsgID);
+ CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, &Msg->MyQItem->QueMsgID, 1, "");
+}
+eNextState FinalizeMessageSend_DB1(AsyncIO *IO)
+{
+ FinalizeMessageSend_1(IO);
+ FinalizeMessageSend_DB_1(IO);
+ return NextDBOperation(IO, FinalizeMessageSend_DB2);
+}
+
+
+inline void FinalizeMessageSend_DB_2(AsyncIO *IO)
+{
+ SmtpOutMsg *Msg = IO->Data;
+
+ if (Msg->IDestructQueItem)
+ smtpq_do_bounce(Msg->MyQItem, Msg->msgtext);
+}
+eNextState FinalizeMessageSend_DB2(AsyncIO *IO)
+{
+ FinalizeMessageSend_DB_2(IO);
+
+ return NextDBOperation(IO, FinalizeMessageSend_DB3);
+}
+
+
+inline void FinalizeMessageSend_DB_3(AsyncIO *IO)
+{
+ SmtpOutMsg *Msg = IO->Data;
+
+ if (Msg->nRemain > 0)
+ {
+ struct CtdlMessage *msg;
+ msg = malloc(sizeof(struct CtdlMessage));
+ memset(msg, 0, sizeof(struct CtdlMessage));
+ msg->cm_magic = CTDLMESSAGE_MAGIC;
+ msg->cm_anon_type = MES_NORMAL;
+ msg->cm_format_type = FMT_RFC822;
+ msg->cm_fields['M'] = SmashStrBuf(&Msg->QMsgData);
+ msg->cm_fields['U'] = strdup("QMSG");
+ Msg->MyQItem->QueMsgID =
+ CtdlSubmitMsg(msg, NULL, SMTP_SPOOLOUT_ROOM, QP_EADDR);
+ EVS_syslog(LOG_DEBUG, "%ld", Msg->MyQItem->QueMsgID);
+ CtdlFreeMessage(msg);