diff options
Diffstat (limited to 'networking')
-rw-r--r-- | networking/sendmail.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/networking/sendmail.c b/networking/sendmail.c index 973d712b9..242bb0eaf 100644 --- a/networking/sendmail.c +++ b/networking/sendmail.c @@ -273,6 +273,7 @@ int sendgetmail_main(int argc ATTRIBUTE_UNUSED, char **argv) OPTS_c = 1 << 6, // sendmail: assumed charset OPTS_t = 1 << 7, // sendmail: recipient(s) + OPTS_i = 1 << 8, // sendmail: ignore lone dots in message body (implied) }; const char *options; @@ -288,8 +289,8 @@ int sendgetmail_main(int argc ATTRIBUTE_UNUSED, char **argv) // SENDMAIL // save initial stdin (body or attachements can be piped!) xdup2(STDIN_FILENO, INITIAL_STDIN_FILENO); - opt_complementary = "-2:w+:t:t::"; // count(-t) > 0 - options = "w:U:P:X" "ns:c:t:"; + opt_complementary = "-2:w+:t::"; + options = "w:U:P:X" "ns:c:t:i"; } else { // FETCHMAIL opt_after_connect = NULL; @@ -346,6 +347,29 @@ int sendgetmail_main(int argc ATTRIBUTE_UNUSED, char **argv) // get the sender opt_from = sane(*argv++); + // if no recipients _and_ no body files specified -> enter all-included mode + // i.e. scan stdin for To: and Subject: lines ... + // ... and then use the rest of stdin as message body + if (!opt_recipients && !*argv) { + // fetch recipients and (optionally) subject + char *s; + while ((s = xmalloc_reads(INITIAL_STDIN_FILENO, NULL, NULL)) != NULL) { + if (0 == strncmp("To: ", s, 4)) { + llist_add_to_end(&opt_recipients, s+4); + } else if (0 == strncmp("Subject: ", s, 9)) { + opt_subject = s+9; + opts |= OPTS_s; + } else { + char first = s[0]; + free(s); + if (!first) + break; // empty line + } + } + // order to read body from stdin + *--argv = (char *)"-"; + } + // introduce to server // we should start with modern EHLO if (250 != smtp_checkp("EHLO %s", opt_from, -1)) { |