[PATCH] cli/insert: do not lose the SMTP envelope

Subject: [PATCH] cli/insert: do not lose the SMTP envelope

Date: Fri, 01 Jan 2016 11:21:19 +0000

To: notmuch@notmuchmail.org

Cc:

From: J Farkas


From: Janos Farkas <chexum+dev@gmail.com>
Subject: [PATCH] cli/insert: do not lose the SMTP envelope

Make sure we store the envelope sender/recipient if provided by
qmail-command(8) in $RPLINE and $DTLINE.
---

I just realised that the messages delivered directly into maildir don't have
the usual envelope addresses that qmail provides.  This is a piece of
information that's important to (at least my) troubleshooting, so I created a
patch that seems to work well, applies cleanly to master (and 0.21), and
provided a NEWS entry should it be necessary.

 NEWS             |  9 +++++++++
 notmuch-insert.c | 28 ++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/NEWS b/NEWS
index 6681699..13d45c8 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,12 @@
+
+
+`notmuch insert` records the envelope addresses if available
+
+  If the caller provides this information as qmail-command(8) does in
+  the RPLINE and DTLINE environment variables, then notmuch insert will
+  record it in the maildir file.
+
+
 Notmuch 0.21 (2015-10-29)
 =========================
 
diff --git a/notmuch-insert.c b/notmuch-insert.c
index 5205c17..ecc0fa0 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -284,6 +284,26 @@ copy_fd (int fdout, int fdin)
 }
 
 /*
+ * Write zero (and LF) terminated string to the output fd.  It's expected to
+ * come from getenv(), so it's not checked for correctness.  NULL or empty
+ * string is ignored, successfully.
+ * Return TRUE on success, FALSE on errors.
+ */
+static notmuch_bool_t
+write_header (int fdout, const char *hdr)
+{
+    ssize_t written,to_write;
+
+    if (hdr && (to_write = strlen (hdr))) {
+        written = write (fdout, hdr, to_write);
+	if (written != to_write)
+	    return FALSE;
+    }
+
+    return TRUE;
+}
+
+/*
  * Write fdin to a new temp file in maildir/tmp, return full path to
  * the file, or NULL on errors.
  */
@@ -297,6 +317,14 @@ maildir_write_tmp (const void *ctx, int fdin, const char *maildir)
     if (fdout < 0)
 	return NULL;
 
+    /* maildir(5) suggests the message should start with a Return-Path
+     * and Delivered-To lines.  qmail-local(8) supplies these.
+     */
+    if (! write_header(fdout, getenv("RPLINE")))
+	goto FAIL;
+    if (! write_header(fdout, getenv("DTLINE")))
+	goto FAIL;
+
     if (! copy_fd (fdout, fdin))
 	goto FAIL;
 
-- 
2.6.3


Thread: