config: add option for SMTP HELO/EHLO local domain

Expose go-smtp functionality for setting the domain name as a config
option. This allows aerc to communicate with SMTP servers with strict
antispam measures without relying on sendmail.

In theory, this should be set to a fully qualified domain name, but some
servers simply forbid the use of "localhost", so it is reasonable to let
the user set whatever value works for them.

For comparison, this is equivalent to the functionality of the "domain"
option of msmtp.

Signed-off-by: Karel D. Kopecký <kdk@freeshell.de>
Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
Karel D. Kopecký
2023-01-29 23:16:31 +01:00
committed by Robin Jarry
parent 9a69dcc333
commit c10cb370bb
3 changed files with 22 additions and 2 deletions

View File

@@ -11,6 +11,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Add a `msglist_answered` style for answered messages.
- Compose `Format=Flowed` messages with `format-flowed=true` in `aerc.conf`.
- Add a `trimSignature` function to the templating engine.
- Change local domain name for SMTP with `smtp-domain=example.com` in
`aerc.conf`
### Changed

View File

@@ -93,6 +93,10 @@ func (Send) Execute(aerc *widgets.Aerc, args []string) error {
if starttls_, ok := config.Params["smtp-starttls"]; ok {
starttls = starttls_ == "yes"
}
var domain string
if domain_, ok := config.Params["smtp-domain"]; ok {
domain = domain_
}
ctx := sendCtx{
uri: uri,
scheme: scheme,
@@ -100,6 +104,7 @@ func (Send) Execute(aerc *widgets.Aerc, args []string) error {
starttls: starttls,
from: config.From,
rcpts: rcpts,
domain: domain,
}
warn, err := composer.ShouldWarnAttachment()
@@ -236,6 +241,7 @@ type sendCtx struct {
starttls bool
from *mail.Address
rcpts []*mail.Address
domain string
}
func newSendmailSender(ctx sendCtx) (io.WriteCloser, error) {
@@ -393,7 +399,7 @@ func newSmtpSender(ctx sendCtx) (io.WriteCloser, error) {
)
switch ctx.scheme {
case "smtp":
conn, err = connectSmtp(ctx.starttls, ctx.uri.Host)
conn, err = connectSmtp(ctx.starttls, ctx.uri.Host, ctx.domain)
case "smtps":
conn, err = connectSmtps(ctx.uri.Host)
default:
@@ -437,7 +443,7 @@ func newSmtpSender(ctx sendCtx) (io.WriteCloser, error) {
return s.w, nil
}
func connectSmtp(starttls bool, host string) (*smtp.Client, error) {
func connectSmtp(starttls bool, host string, domain string) (*smtp.Client, error) {
serverName := host
if !strings.ContainsRune(host, ':') {
host += ":587" // Default to submission port
@@ -448,6 +454,12 @@ func connectSmtp(starttls bool, host string) (*smtp.Client, error) {
if err != nil {
return nil, errors.Wrap(err, "smtp.Dial")
}
if domain != "" {
err := conn.Hello(domain)
if err != nil {
return nil, errors.Wrap(err, "Hello")
}
}
if sup, _ := conn.Extension("STARTTLS"); sup {
if !starttls {
err := errors.New("STARTTLS is supported by this server, " +

View File

@@ -64,6 +64,12 @@ are available:
Default: _false_
*smtp-domain* = _<domain>_
Local domain name to use in the HELO/EHLO SMTP command. Set this to a fully
qualified domain name if the server requires it as an antispam measure.
Default: _localhost_
# SEE ALSO
*aerc*(1) *aerc-accounts*(5)