From 48758136c03b89757f7df1dd26331169c3d4ca02 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 27 Jul 2019 11:19:49 -0400 Subject: [PATCH] Implement sendmail support --- Makefile | 3 +++ commands/compose/send.go | 46 +++++++++++++++++++++++++++++++--------- doc/aerc-config.5.scd | 2 +- doc/aerc-imap.5.scd | 2 +- doc/aerc-sendmail.5.scd | 31 +++++++++++++++++++++++++++ doc/aerc-smtp.5.scd | 2 +- doc/aerc.1.scd | 2 +- 7 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 doc/aerc-sendmail.5.scd diff --git a/Makefile b/Makefile index 4e76dcb..a78ef1c 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,7 @@ DOCS := \ aerc-config.5 \ aerc-imap.5 \ aerc-maildir.5 \ + aerc-sendmail.5 \ aerc-smtp.5 \ aerc-tutorial.7 @@ -61,6 +62,7 @@ install: all install -m644 aerc-config.5 $(MANDIR)/man5/aerc-config.5 install -m644 aerc-imap.5 $(MANDIR)/man5/aerc-imap.5 install -m644 aerc-maildir.5 $(MANDIR)/man5/aerc-maildir.5 + install -m644 aerc-sendmail.5 $(MANDIR)/man5/aerc-sendmail.5 install -m644 aerc-smtp.5 $(MANDIR)/man5/aerc-smtp.5 install -m644 aerc-tutorial.7 $(MANDIR)/man7/aerc-tutorial.7 install -m644 config/accounts.conf $(SHAREDIR)/accounts.conf @@ -81,6 +83,7 @@ uninstall: $(RM) $(MANDIR)/man5/aerc-config.5 $(RM) $(MANDIR)/man5/aerc-imap.5 $(RM) $(MANDIR)/man5/aerc-maildir.5 + $(RM) $(MANDIR)/man5/aerc-sendmail.5 $(RM) $(MANDIR)/man5/aerc-smtp.5 $(RM) $(MANDIR)/man7/aerc-tutorial.7 $(RM) -r $(SHAREDIR) diff --git a/commands/compose/send.go b/commands/compose/send.go index 26df82a..0574075 100644 --- a/commands/compose/send.go +++ b/commands/compose/send.go @@ -6,6 +6,7 @@ import ( "io" "net/mail" "net/url" + "os/exec" "strings" "time" @@ -56,14 +57,16 @@ func (_ Send) Execute(aerc *widgets.Aerc, args []string) error { scheme string auth string = "plain" ) - parts := strings.Split(uri.Scheme, "+") - if len(parts) == 1 { - scheme = parts[0] - } else if len(parts) == 2 { - scheme = parts[0] - auth = parts[1] - } else { - return fmt.Errorf("Unknown transfer protocol %s", uri.Scheme) + if uri.Scheme != "" { + parts := strings.Split(uri.Scheme, "+") + if len(parts) == 1 { + scheme = parts[0] + } else if len(parts) == 2 { + scheme = parts[0] + auth = parts[1] + } else { + return fmt.Errorf("Unknown transfer protocol %s", uri.Scheme) + } } header, rcpts, err := composer.PrepareHeader() @@ -102,7 +105,7 @@ func (_ Send) Execute(aerc *widgets.Aerc, args []string) error { starttls = starttls_ == "yes" } - sendAsync := func() (int, error) { + smtpAsync := func() (int, error) { switch scheme { case "smtp": host := uri.Host @@ -154,7 +157,6 @@ func (_ Send) Execute(aerc *widgets.Aerc, args []string) error { defer conn.Close() } - // TODO: sendmail if saslClient != nil { if err = conn.Auth(saslClient); err != nil { return 0, errors.Wrap(err, "conn.Auth") @@ -180,6 +182,30 @@ func (_ Send) Execute(aerc *widgets.Aerc, args []string) error { return int(ctr.Count()), nil } + sendmailAsync := func() (int, error) { + cmd := exec.Command(uri.Path, rcpts...) + wc, err := cmd.StdinPipe() + if err != nil { + return 0, errors.Wrap(err, "cmd.StdinPipe") + } + defer wc.Close() + go cmd.Run() + ctr := datacounter.NewWriterCounter(wc) + composer.WriteMessage(header, ctr) + return int(ctr.Count()), nil + } + + sendAsync := func() (int, error) { + switch scheme { + case "smtp": + case "smtps": + return smtpAsync() + case "": + return sendmailAsync() + } + return 0, errors.New("Unknown scheme") + } + go func() { aerc.SetStatus("Sending...") nbytes, err := sendAsync() diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd index 592b7af..7282311 100644 --- a/doc/aerc-config.5.scd +++ b/doc/aerc-config.5.scd @@ -417,7 +417,7 @@ following special keys are supported: # SEE ALSO -*aerc*(1) *aerc-imap*(5) *aerc-smtp*(5) *aerc-maildir*(5) +*aerc*(1) *aerc-imap*(5) *aerc-smtp*(5) *aerc-maildir*(5) *aerc-sendmail*(5) # AUTHORS diff --git a/doc/aerc-imap.5.scd b/doc/aerc-imap.5.scd index 4307238..a34855f 100644 --- a/doc/aerc-imap.5.scd +++ b/doc/aerc-imap.5.scd @@ -63,7 +63,7 @@ available: # SEE ALSO -*aerc*(1) *aerc-config*(5) *aerc-smtp*(5) +*aerc*(1) *aerc-config*(5) # AUTHORS diff --git a/doc/aerc-sendmail.5.scd b/doc/aerc-sendmail.5.scd new file mode 100644 index 0000000..90118fb --- /dev/null +++ b/doc/aerc-sendmail.5.scd @@ -0,0 +1,31 @@ +aerc-sendmail(5) + +# NAME + +aerc-sendmail - sendmail configuration for *aerc*(1) + +# SYNOPSIS + +aerc can defer to sendmail for the delivery of outgoing messages. + +# CONFIGURATION + +In accounts.conf (see *aerc-config*(5)), the following sendmail-specific +options are available: + +*outgoing* + /path/to/sendmail + + This should be set to the path to the sendmail binary you wish to use, + which is generally /usr/bin/sendmail. aerc will execute it with a list of + recipients on the command line and pipe the message to deliver to stdin. + +# SEE ALSO + +*aerc*(1) *aerc-config*(5) + +# AUTHORS + +Maintained by Drew DeVault , who is assisted by other open +source contributors. For more information about aerc development, see +https://git.sr.ht/~sircmpwn/aerc. diff --git a/doc/aerc-smtp.5.scd b/doc/aerc-smtp.5.scd index 15e03de..e455001 100644 --- a/doc/aerc-smtp.5.scd +++ b/doc/aerc-smtp.5.scd @@ -51,7 +51,7 @@ available: # SEE ALSO -*aerc*(1) *aerc-config*(5) *aerc-smtp*(5) +*aerc*(1) *aerc-config*(5) # AUTHORS diff --git a/doc/aerc.1.scd b/doc/aerc.1.scd index 7989ad9..8401d64 100644 --- a/doc/aerc.1.scd +++ b/doc/aerc.1.scd @@ -246,7 +246,7 @@ write log messages to that file: # SEE ALSO *aerc-config*(5) *aerc-imap*(5) *aerc-smtp*(5) *aerc-maildir*(5) -*aerc-tutorial*(7) +*aerc-sendmail*(5) *aerc-tutorial*(7) # AUTHORS