Commit a5edd905 authored by Alberto Bertogli's avatar Alberto Bertogli

queue: Make DSN tidier, especially in handling multi-line errors

This patch contains some changes to generate tidier DSNs, which should
make them slightly more readable.

In particular, it also makes it able to handle multi-line errors much
better than before.
parent cac1e161
......@@ -3,6 +3,7 @@ package queue
import (
"bytes"
"net/mail"
"strings"
"text/template"
"time"
)
......@@ -84,8 +85,18 @@ type dsnInfo struct {
Boundary string
}
// indent s with the given number of spaces.
func indent(sp int, s string) string {
pad := strings.Repeat(" ", sp)
return strings.Replace(s, "\n", "\n"+pad, -1)
}
var dsnTemplate = template.Must(
template.New("dsn").Parse(
template.New("dsn").Funcs(
template.FuncMap{
"indent": indent,
"trim": strings.TrimSpace,
}).Parse(
`From: Mail Delivery System <postmaster-dsn@{{.OurDomain}}>
To: <{{.Destination}}>
Subject: Mail delivery failed: returning message to sender
......@@ -108,17 +119,17 @@ Content-Transfer-Encoding: 8bit
Delivery of your message to the following recipient(s) failed permanently:
{{range .FailedTo -}} - {{.}}
{{- end}}
{{range .FailedTo}} - {{.}}
{{end}}
Technical details:
{{- range .FailedRecipients}}
- "{{.Address}}" ({{.Type}}) failed permanently with error:
{{.LastFailureMessage}}
{{.LastFailureMessage | trim | indent 4}}
{{- end}}
{{- range .PendingRecipients}}
- "{{.Address}}" ({{.Type}}) failed repeatedly and timed out, last error:
{{.LastFailureMessage}}
{{.LastFailureMessage | trim | indent 4}}
{{- end}}
......@@ -134,14 +145,16 @@ Original-Recipient: utf-8; {{.OriginalAddress}}
Final-Recipient: utf-8; {{.Address}}
Action: failed
Status: 5.0.0
Diagnostic-Code: smtp; {{.LastFailureMessage}}
{{end}}
Diagnostic-Code: smtp; {{.LastFailureMessage | trim | indent 4}}
{{end -}}
{{range .PendingRecipients -}}
Original-Recipient: utf-8; {{.OriginalAddress}}
Final-Recipient: utf-8; {{.Address}}
Action: failed
Status: 4.0.0
Diagnostic-Code: smtp; {{.LastFailureMessage}}
Diagnostic-Code: smtp; {{.LastFailureMessage | trim | indent 4}}
{{end}}
--{{.Boundary}}
......
......@@ -7,6 +7,17 @@ import (
"testing"
)
const multilineErr = `550 5.7.1 [11:22:33:44::1] Our system has detected that this
5.7.1 message is likely unsolicited mail. To reduce the amount of spam sent
5.7.1 to BlahMail, this message has been blocked. Please visit
5.7.1 https://support.blah/mail/?p=UnsolicitedMessageError
5.7.1 for more information. a1b2c3a1b2c3a1b.123 - bsmtp`
const data = `Message-ID: <msgid-123@zaraza>
Data ñaca.
`
func TestDSN(t *testing.T) {
item := &Item{
Message: Message{
......@@ -16,12 +27,14 @@ func TestDSN(t *testing.T) {
Rcpt: []*Recipient{
{"poe@rcpt", Recipient_EMAIL, Recipient_FAILED,
"oh! horror!", "ñaca@africa.org"},
{"muchos@rcpt", Recipient_EMAIL, Recipient_FAILED,
multilineErr, "pepe@africa.org"},
{"newman@rcpt", Recipient_EMAIL, Recipient_PENDING,
"oh! the humanity!", "ñaca@africa.org"},
{"ant@rcpt", Recipient_EMAIL, Recipient_SENT,
"", "negra@sosa.org"},
},
Data: []byte("data ñaca"),
Data: []byte(data),
},
}
......@@ -42,9 +55,9 @@ To: <from@from.org>
Subject: Mail delivery failed: returning message to sender
Message-ID: <chasquid-dsn-???????????@dsnDomain>
Date: *
In-Reply-To: *
References: *
X-Failed-Recipients: ñaca@africa.org,
In-Reply-To: <msgid-123@zaraza>
References: <msgid-123@zaraza>
X-Failed-Recipients: pepe@africa.org, ñaca@africa.org,
Auto-Submitted: auto-replied
MIME-Version: 1.0
Content-Type: multipart/report; report-type=delivery-status;
......@@ -59,11 +72,19 @@ Content-Transfer-Encoding: 8bit
Delivery of your message to the following recipient(s) failed permanently:
- pepe@africa.org
- ñaca@africa.org
Technical details:
- "poe@rcpt" (EMAIL) failed permanently with error:
oh! horror!
- "muchos@rcpt" (EMAIL) failed permanently with error:
550 5.7.1 [11:22:33:44::1] Our system has detected that this
5.7.1 message is likely unsolicited mail. To reduce the amount of spam sent
5.7.1 to BlahMail, this message has been blocked. Please visit
5.7.1 https://support.blah/mail/?p=UnsolicitedMessageError
5.7.1 for more information. a1b2c3a1b2c3a1b.123 - bsmtp
- "newman@rcpt" (EMAIL) failed repeatedly and timed out, last error:
oh! the humanity!
......@@ -81,6 +102,16 @@ Action: failed
Status: 5.0.0
Diagnostic-Code: smtp; oh! horror!
Original-Recipient: utf-8; pepe@africa.org
Final-Recipient: utf-8; muchos@rcpt
Action: failed
Status: 5.0.0
Diagnostic-Code: smtp; 550 5.7.1 [11:22:33:44::1] Our system has detected that this
5.7.1 message is likely unsolicited mail. To reduce the amount of spam sent
5.7.1 to BlahMail, this message has been blocked. Please visit
5.7.1 https://support.blah/mail/?p=UnsolicitedMessageError
5.7.1 for more information. a1b2c3a1b2c3a1b.123 - bsmtp
Original-Recipient: utf-8; ñaca@africa.org
Final-Recipient: utf-8; newman@rcpt
Action: failed
......@@ -88,12 +119,16 @@ Status: 4.0.0
Diagnostic-Code: smtp; oh! the humanity!
--???????????
Content-Type: message/rfc822
Content-Description: Undelivered Message
Content-Transfer-Encoding: 8bit
data ñaca
Message-ID: <msgid-123@zaraza>
Data ñaca.
--???????????--
`
......
......@@ -23,6 +23,7 @@ Delivery of your message to the following recipient(s) failed permanently:
- fail@testserver
Technical details:
- "false" (PIPE) failed permanently with error:
exit status 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment