Format the Reporting-MTA in DSN messages per the spec.
authorRobert Sesek <rsesek@bluestatic.org>
Sat, 6 Jun 2020 18:46:43 +0000 (14:46 -0400)
committerRobert Sesek <rsesek@bluestatic.org>
Sat, 6 Jun 2020 18:46:43 +0000 (14:46 -0400)
smtp/conn.go
smtp/relay.go
smtp/relay_test.go
smtp/server.go

index 55117999a92eda46f60f37cf65deb6770ed25ef0..9d807d437e9fcf9148928c483c21cb25952b8a8d 100644 (file)
@@ -510,17 +510,7 @@ func (conn *connection) handleSendAs(env *Envelope) {
 }
 
 func (conn *connection) getReceivedInfo(envelope Envelope) []byte {
-       rhost, _, err := net.SplitHostPort(conn.remoteAddr.String())
-       if err != nil {
-               rhost = conn.remoteAddr.String()
-       }
-
-       rhosts, err := net.LookupAddr(rhost)
-       if err == nil {
-               rhost = fmt.Sprintf("%s [%s]", rhosts[0], rhost)
-       }
-
-       base := fmt.Sprintf("Received: from %s (%s)\r\n        ", conn.ehlo, rhost)
+       base := fmt.Sprintf("Received: from %s (%s)\r\n        ", conn.ehlo, lookupRemoteHost(conn.remoteAddr))
 
        with := "SMTP"
        if conn.esmtp {
index 81a91e3e449f740a52df00300ddab81a304570a7..ae90fe5be01bf6d7b3c66e1f00b6bef663b01ed8 100644 (file)
@@ -136,11 +136,7 @@ func deliverRelayFailure(server Server, env Envelope, log *zap.Logger, to, error
        fmt.Fprintf(sw, "Original-Envelope-ID: %s\n", env.ID)
        fmt.Fprintf(sw, "Reporting-UA: %s\n", env.EHLO)
        if env.RemoteAddr != nil {
-               rhosts, err := net.LookupAddr(env.RemoteAddr.String())
-               if err == nil {
-                       fmt.Fprintf(sw, "Reporting-MTA: %s\n", rhosts[0])
-               }
-               fmt.Fprintf(sw, "X-Remote-Address: %s\n", env.RemoteAddr)
+               fmt.Fprintf(sw, "Reporting-MTA: dns; %s\n", lookupRemoteHost(env.RemoteAddr))
        }
        fmt.Fprintf(sw, "Date: %s\n", env.Received.Format(time.RFC1123Z))
 
index e486e8271950c74c9856ed0b9f0e1d50153e8213..1934173d3d1e740cf224bd6e2618d5b3ed3c218e 100644 (file)
@@ -191,12 +191,7 @@ func TestDeliveryFailureMessage(t *testing.T) {
                t.Errorf("Missing %q in %q", expected, contentStr)
        }
 
-       expected = "Reporting-MTA: localhost\n"
-       if !strings.Contains(contentStr, expected) {
-               t.Errorf("Missing %q in %q", expected, contentStr)
-       }
-
-       expected = "X-Remote-Address: 127.0.0.1\n"
+       expected = "Reporting-MTA: dns; localhost [127.0.0.1]\n"
        if !strings.Contains(contentStr, expected) {
                t.Errorf("Missing %q in %q", expected, contentStr)
        }
index 3b0fdfa8bf6f5f9835b97b09203d21b64f12c65a..b991a227e502e8bbf576419b42dad930d4a1a823 100644 (file)
@@ -71,6 +71,23 @@ func generateEnvelopeId(prefix string, t time.Time) string {
        return fmt.Sprintf("%s.%d.%x", prefix, t.UnixNano(), idBytes)
 }
 
+// lookupRemoteHost attempts to reverse look-up the provided IP address. On
+// success, it returns the hostname and the IP as formatted for a receive
+// trace. If the lookup fails, it just returns the original IP.
+func lookupRemoteHost(addr net.Addr) string {
+       rhost, _, err := net.SplitHostPort(addr.String())
+       if err != nil {
+               rhost = addr.String()
+       }
+
+       rhosts, err := net.LookupAddr(rhost)
+       if err == nil {
+               rhost = fmt.Sprintf("%s [%s]", rhosts[0], rhost)
+       }
+
+       return rhost
+}
+
 type Server interface {
        Name() string
        TLSConfig() *tls.Config