diff --git a/libnetwork/resolver.go b/libnetwork/resolver.go index 83382b645b..64c73e53b7 100644 --- a/libnetwork/resolver.go +++ b/libnetwork/resolver.go @@ -224,6 +224,22 @@ func createRespMsg(query *dns.Msg) *dns.Msg { return resp } +func (r *resolver) handleMXQuery(name string, query *dns.Msg) (*dns.Msg, error) { + addrv4, _ := r.backend.ResolveName(name, types.IPv4) + addrv6, _ := r.backend.ResolveName(name, types.IPv6) + + if addrv4 == nil && addrv6 == nil { + return nil, nil + } + + // We were able to resolve the name. Respond with an empty list with + // RcodeSuccess/NOERROR so that email clients can treat it as "implicit MX" + // [RFC 5321 Section-5.1] and issue a Type A/AAAA query for the name. + + resp := createRespMsg(query) + return resp, nil +} + func (r *resolver) handleIPQuery(name string, query *dns.Msg, ipType int) (*dns.Msg, error) { var addr []net.IP var ipv6Miss bool @@ -357,6 +373,8 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) { resp, err = r.handleIPQuery(name, query, types.IPv4) case dns.TypeAAAA: resp, err = r.handleIPQuery(name, query, types.IPv6) + case dns.TypeMX: + resp, err = r.handleMXQuery(name, query) case dns.TypePTR: resp, err = r.handlePTRQuery(name, query) case dns.TypeSRV: