]> source.dussan.org Git - gitea.git/commitdiff
Add settings to allow different SMTP envelope from address (#17479)
authorzeripath <art27@cantab.net>
Fri, 19 Nov 2021 15:35:20 +0000 (15:35 +0000)
committerGitHub <noreply@github.com>
Fri, 19 Nov 2021 15:35:20 +0000 (23:35 +0800)
* Add settings to allow different SMTP envelope from address

Sometimes it may be advisable to hide or alias the from address on an SMTP mail
envelope. This PR adds two new options to the mailer to allow setting of an overriding
from address.

Fix #17477

Signed-off-by: Andrew Thornton <art27@cantab.net>
custom/conf/app.example.ini
docs/content/doc/advanced/config-cheat-sheet.en-us.md
modules/setting/mailer.go
services/mailer/mailer.go

index 9643e396b698445345cd7bd312e209d7a14654ab..233e8981cb89880d6cb259c7d508a54ffbe8e394 100644 (file)
@@ -1457,6 +1457,9 @@ PATH =
 ;; Mail from address, RFC 5322. This can be just an email address, or the `"Name" <email@example.com>` format
 ;FROM =
 ;;
+;; Sometimes it is helpful to use a different address on the envelope. Set this to use ENVELOPE_FROM as the from on the envelope. Set to `<>` to send an empty address.
+;ENVELOPE_FROM =
+;;
 ;; Mailer user name and password
 ;; Please Note: Authentication is only supported when the SMTP server communication is encrypted with TLS (this can be via STARTTLS) or `HOST=localhost`.
 ;USER =
index a087b253e99ace665febaf0779b46c60415ac4d3..ae4f7541700a9d284f46932553ddb1fdae3698eb 100644 (file)
@@ -606,6 +606,7 @@ Define allowed algorithms and their minimum key length (use -1 to disable a type
   - Otherwise if `IS_TLS_ENABLED=false` and the server supports `STARTTLS` this will be used. Thus if `STARTTLS` is preferred you should set `IS_TLS_ENABLED=false`.
 - `FROM`: **\<empty\>**: Mail from address, RFC 5322. This can be just an email address, or
    the "Name" \<email@example.com\> format.
+- `ENVELOPE_FROM`: **\<empty\>**: Address set as the From address on the SMTP mail envelope. Set to `<>` to send an empty address.
 - `USER`: **\<empty\>**: Username of mailing user (usually the sender's e-mail address).
 - `PASSWD`: **\<empty\>**: Password of mailing user.  Use \`your password\` for quoting if you use special characters in the password.
    - Please note: authentication is only supported when the SMTP server communication is encrypted with TLS (this can be via `STARTTLS`) or `HOST=localhost`. See [Email Setup]({{< relref "doc/usage/email-setup.en-us.md" >}}) for more information.
index d2fac440ac08c46ac96ca44c44b16bd215ebfdc7..1bcd63a914bd156d5d08eb33f148fdaa2dd31317 100644 (file)
@@ -16,13 +16,15 @@ import (
 // Mailer represents mail service.
 type Mailer struct {
        // Mailer
-       Name            string
-       From            string
-       FromName        string
-       FromEmail       string
-       SendAsPlainText bool
-       MailerType      string
-       SubjectPrefix   string
+       Name                 string
+       From                 string
+       EnvelopeFrom         string
+       OverrideEnvelopeFrom bool `ini:"-"`
+       FromName             string
+       FromEmail            string
+       SendAsPlainText      bool
+       MailerType           string
+       SubjectPrefix        string
 
        // SMTP sender
        Host              string
@@ -73,6 +75,7 @@ func newMailService() {
                SendmailTimeout: sec.Key("SENDMAIL_TIMEOUT").MustDuration(5 * time.Minute),
        }
        MailService.From = sec.Key("FROM").MustString(MailService.User)
+       MailService.EnvelopeFrom = sec.Key("ENVELOPE_FROM").MustString("")
 
        if sec.HasKey("ENABLE_HTML_ALTERNATIVE") {
                log.Warn("ENABLE_HTML_ALTERNATIVE is deprecated, use SEND_AS_PLAIN_TEXT")
@@ -93,6 +96,21 @@ func newMailService() {
        MailService.FromName = parsed.Name
        MailService.FromEmail = parsed.Address
 
+       switch MailService.EnvelopeFrom {
+       case "":
+               MailService.OverrideEnvelopeFrom = false
+       case "<>":
+               MailService.EnvelopeFrom = ""
+               MailService.OverrideEnvelopeFrom = true
+       default:
+               parsed, err = mail.ParseAddress(MailService.EnvelopeFrom)
+               if err != nil {
+                       log.Fatal("Invalid mailer.ENVELOPE_FROM (%s): %v", MailService.EnvelopeFrom, err)
+               }
+               MailService.OverrideEnvelopeFrom = true
+               MailService.EnvelopeFrom = parsed.Address
+       }
+
        if MailService.MailerType == "" {
                MailService.MailerType = "smtp"
        }
index fae8d473e3419f9244b14a33263c0f2c9df86876..0c0c6266276a1968021e27836055a34440c1d57d 100644 (file)
@@ -210,8 +210,14 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error {
                }
        }
 
-       if err = client.Mail(from); err != nil {
-               return fmt.Errorf("Mail: %v", err)
+       if opts.OverrideEnvelopeFrom {
+               if err = client.Mail(opts.EnvelopeFrom); err != nil {
+                       return fmt.Errorf("Mail: %v", err)
+               }
+       } else {
+               if err = client.Mail(from); err != nil {
+                       return fmt.Errorf("Mail: %v", err)
+               }
        }
 
        for _, rec := range to {
@@ -242,7 +248,12 @@ func (s *sendmailSender) Send(from string, to []string, msg io.WriterTo) error {
        var closeError error
        var waitError error
 
-       args := []string{"-f", from, "-i"}
+       envelopeFrom := from
+       if setting.MailService.OverrideEnvelopeFrom {
+               envelopeFrom = setting.MailService.EnvelopeFrom
+       }
+
+       args := []string{"-f", envelopeFrom, "-i"}
        args = append(args, setting.MailService.SendmailArgs...)
        args = append(args, to...)
        log.Trace("Sending with: %s %v", setting.MailService.SendmailPath, args)