]> code.citadel.org Git - citadel.git/blobdiff - citadel/server/modules/smtp/serv_smtpclient.c
dammit, learn to spell
[citadel.git] / citadel / server / modules / smtp / serv_smtpclient.c
index 85ca6570cb20f20bd3e0fa9a7ffe50198a70334e..edce1f5c387088008f16b42ca651860bb6d42dbb 100644 (file)
@@ -19,7 +19,7 @@
 #include <libcitadel.h>
 #include <curl/curl.h>
 #include "../../sysconfig.h"
-#include "../../citadel.h"
+#include "../../citadel_defs.h"
 #include "../../server.h"
 #include "../../citserver.h"
 #include "../../support.h"
@@ -105,10 +105,10 @@ int smtp_aftersave(struct CtdlMessage *msg, struct recptypes *recps) {
                imsg->cm_magic = CTDLMESSAGE_MAGIC;
                imsg->cm_anon_type = MES_NORMAL;
                imsg->cm_format_type = FMT_RFC822;
-               CM_SetField(imsg, eMsgSubject, HKEY("QMSG"));
-               CM_SetField(imsg, eAuthor, HKEY("Citadel"));
-               CM_SetField(imsg, eJournal, HKEY("do not journal"));
-               CM_SetAsFieldSB(imsg, eMesageText, &SpoolMsg);
+               CM_SetField(imsg, eMsgSubject, "QMSG");
+               CM_SetField(imsg, eAuthor, "Citadel");
+               CM_SetField(imsg, eJournal, "do not journal");
+               CM_SetAsFieldSB(imsg, eMessageText, &SpoolMsg);
                last_queue_job_submitted = CtdlSubmitMsg(imsg, NULL, SMTP_SPOOLOUT_ROOM);
                CM_Free(imsg);
        }
@@ -167,12 +167,6 @@ void trim_response(long response_code, char *response) {
                return;
        }
 
-       char *t = malloc(strlen(response));
-       if (!t) {
-               return;
-       }
-       t[0] = 0;
-
        char *p;
        for (p = response; *p != 0; ++p) {
                if ( (*p != '\n') && (!isprint(*p)) ) {         // expunge any nonprintables except for newlines
@@ -275,7 +269,7 @@ int smtp_attempt_delivery(long msgid, char *recp, char *envelope_from, char *sou
                        // Construct an SMTP URL in the form of:
                        //      smtp[s]://target_host/source_host
                        // This looks weird but libcurl uses that last part to set our name for EHLO or HELO.
-                       // We check for "smtp://" and "smtps://" because the admin may have put those prefixes in a smart-host entry.
+                       // We check for "smtp://" and "smtps://" because an admin may have put those prefixes in a smart-host entry
                        // If there is no prefix we add "smtp://"
                        extract_token(try_this_mx, mxes, i, '|', (sizeof try_this_mx - 7));
                        snprintf(smtp_url, sizeof smtp_url,
@@ -333,8 +327,8 @@ void smtp_process_one_msg(long qmsgnum) {
                return;
        }
 
-       instr = msg->cm_fields[eMesageText];
-       msg->cm_fields[eMesageText] = NULL;
+       instr = msg->cm_fields[eMessageText];
+       msg->cm_fields[eMessageText] = NULL;
        CM_Free(msg);
 
        // if the queue job message has any CRLF's convert them to LF's
@@ -359,18 +353,12 @@ void smtp_process_one_msg(long qmsgnum) {
        char cfgline[SIZ];
        for (i = 0; i < num_tokens(instr, '\n'); ++i) {
                extract_token(cfgline, instr, i, '\n', sizeof cfgline);
-               if (!strncasecmp(cfgline, HKEY("msgid|")))
-                       msgid = atol(&cfgline[6]);
-               if (!strncasecmp(cfgline, HKEY("submitted|")))
-                       submitted = atol(&cfgline[10]);
-               if (!strncasecmp(cfgline, HKEY("attempted|")))
-                       attempted = atol(&cfgline[10]);
-               if (!strncasecmp(cfgline, HKEY("bounceto|")))
-                       bounceto = strdup(&cfgline[9]);
-               if (!strncasecmp(cfgline, HKEY("envelope_from|")))
-                       envelope_from = strdup(&cfgline[14]);
-               if (!strncasecmp(cfgline, HKEY("source_room|")))
-                       source_room = strdup(&cfgline[12]);
+               if (!strncasecmp(cfgline, HKEY("msgid|")))              msgid = atol(&cfgline[6]);
+               if (!strncasecmp(cfgline, HKEY("submitted|")))          submitted = atol(&cfgline[10]);
+               if (!strncasecmp(cfgline, HKEY("attempted|")))          attempted = atol(&cfgline[10]);
+               if (!strncasecmp(cfgline, HKEY("bounceto|")))           bounceto = strdup(&cfgline[9]);
+               if (!strncasecmp(cfgline, HKEY("envelope_from|")))      envelope_from = strdup(&cfgline[14]);
+               if (!strncasecmp(cfgline, HKEY("source_room|")))        source_room = strdup(&cfgline[12]);
        }
 
        int should_try_now = 0;
@@ -518,7 +506,10 @@ void smtp_do_queue(int type_of_queue_run) {
        doing_smtpclient = 1;
        end_critical_section(S_SMTPQUEUE);
 
-       syslog(LOG_DEBUG, "smtpclient: start queue run , last_queue_job_processed=%ld , last_queue_job_submitted=%ld", last_queue_job_processed, last_queue_job_submitted);
+       syslog(LOG_DEBUG, "smtpclient: start %s queue run , last_queue_job_processed=%ld , last_queue_job_submitted=%ld",
+               (type_of_queue_run == QUICK_QUEUE_RUN ? "quick" : "full"),
+               last_queue_job_processed, last_queue_job_submitted
+       );
 
        if (CtdlGetRoom(&CC->room, SMTP_SPOOLOUT_ROOM) != 0) {
                syslog(LOG_WARNING, "smtpclient: cannot find room <%s>", SMTP_SPOOLOUT_ROOM);
@@ -536,8 +527,8 @@ void smtp_do_queue(int type_of_queue_run) {
 
        // Put the queue in memory so we can close the db cursor
        CtdlForEachMessage(
-               (type_of_queue_run == QUICK_QUEUE_RUN ? MSGS_GT : MSGS_ALL),                    // quick = new jobs; full = all jobs
-               (type_of_queue_run == QUICK_QUEUE_RUN ? last_queue_job_processed : 0),          // quick = new jobs; full = all jobs
+               (type_of_queue_run == QUICK_QUEUE_RUN ? MSGS_GT : MSGS_ALL),            // quick = new jobs; full = all jobs
+               (type_of_queue_run == QUICK_QUEUE_RUN ? last_queue_job_processed : 0),  // quick = new jobs; full = all jobs
                NULL,
                SPOOLMIME,              // Searching for Content-type of SPOOLIME will give us only queue instruction messages
                NULL,
@@ -546,24 +537,32 @@ void smtp_do_queue(int type_of_queue_run) {
        );
 
        // We are ready to run through the queue now.
+       syslog(LOG_DEBUG, "smtpclient: %d messages to be processed", array_len(smtp_queue));
        for (i = 0; i < array_len(smtp_queue); ++i) {
                long m;
                memcpy(&m, array_get_element_at(smtp_queue, i), sizeof(long));
                smtp_process_one_msg(m);
-               last_queue_job_processed = m;
        }
 
        array_free(smtp_queue);
+       last_queue_job_processed = last_queue_job_submitted;
        doing_smtpclient = 0;
-       syslog(LOG_DEBUG, "smtpclient: end queue run , last_queue_job_processed=%ld , last_queue_job_submitted=%ld", last_queue_job_processed, last_queue_job_submitted);
+       syslog(LOG_DEBUG, "smtpclient: end %s queue run , last_queue_job_processed=%ld , last_queue_job_submitted=%ld",
+               (type_of_queue_run == QUICK_QUEUE_RUN ? "quick" : "full"),
+               last_queue_job_processed, last_queue_job_submitted
+       );
 }
 
 
+// The "full" queue run goes through the entire queue, attempting delivery for newly submitted messages,
+// retrying failed deliveries periodically, and handling undeliverable messages.
 void smtp_do_queue_full(void) {
        smtp_do_queue(FULL_QUEUE_RUN);
 }
 
 
+// The "quick" queue run only handles newly submitted messages, allowing them to be delivered immediately
+// instead of waiting for the next "full" queue run.
 void smtp_do_queue_quick(void) {
        if (last_queue_job_submitted > last_queue_job_processed) {
                smtp_do_queue(QUICK_QUEUE_RUN);