From 0dc0ce3a26371ccf7c31b2c68c4218962cf28647 Mon Sep 17 00:00:00 2001 From: Miles Faciane <39567252+milesfaciane@users.noreply.github.com> Date: Fri, 31 May 2024 12:09:09 -0500 Subject: [PATCH 1/2] Return error when no MX records If LookupMX returns no records, return an Error instead of causing a panic. --- checkmail.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/checkmail.go b/checkmail.go index 712c6bd..6990187 100644 --- a/checkmail.go +++ b/checkmail.go @@ -33,6 +33,7 @@ const forceDisconnectAfter = time.Second * 5 var ( ErrBadFormat = errors.New("invalid format") ErrUnresolvableHost = errors.New("unresolvable host") + ErrNoMXRecord = errors.New("host DNS does not have MX records") emailRegexp = regexp.MustCompile(`(?m)^(((((((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?)|(((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?"((\s? +)?(([!#-[\]-~])|(\\([ -~]|\s))))*(\s? +)?"))?)?(((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?<(((((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?(([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+(\.([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+)*)((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?)|(((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?"((\s? +)?(([!#-[\]-~])|(\\([ -~]|\s))))*(\s? +)?"))@((((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?(([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+(\.([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+)*)((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?)|(((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?\[((\s? +)?([!-Z^-~]))*(\s? +)?\]((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?)))>((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?))|(((((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?(([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+(\.([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+)*)((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?)|(((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?"((\s? +)?(([!#-[\]-~])|(\\([ -~]|\s))))*(\s? +)?"))@((((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?(([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+(\.([A-Za-z0-9!#-'*+\/=?^_\x60{|}~-])+)*)((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?)|(((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?\[((\s? +)?([!-Z^-~]))*(\s? +)?\]((((\s? +)?(\(((\s? +)?(([!-'*-[\]-~]*)|(\\([ -~]|\s))))*(\s? +)?\)))(\s? +)?)|(\s? +))?))))$`) ) @@ -79,6 +80,9 @@ func ValidateHostAndUser(serverHostName, serverMailAddress, email string) error if err != nil { return ErrUnresolvableHost } + if len(mx) == 0 { + return ErrNoMXRecord + } client, err := DialTimeout(fmt.Sprintf("%s:%d", mx[0].Host, 25), forceDisconnectAfter) if err != nil { return NewSmtpError(err) From ddd9be170557a8b0333d8121d234311fd3ca307d Mon Sep 17 00:00:00 2001 From: Miles Faciane <39567252+milesfaciane@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:31:37 -0500 Subject: [PATCH 2/2] Update checkmail.go If there are no mx records, return ErrNoMXRecord. --- checkmail.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/checkmail.go b/checkmail.go index 6990187..84ad6b5 100644 --- a/checkmail.go +++ b/checkmail.go @@ -48,8 +48,10 @@ func ValidateFormat(email string) error { // ValidateMX validate if MX record exists for a domain. func ValidateMX(email string) error { _, host := split(email) - if _, err := net.LookupMX(host); err != nil { + if mx, err := net.LookupMX(host); err != nil { return ErrUnresolvableHost + } else if len(mx) == 0 { + return ErrNoMXRecord } return nil @@ -61,6 +63,8 @@ func ValidateHost(email string) error { mx, err := net.LookupMX(host) if err != nil { return ErrUnresolvableHost + } else if len(mx) == 0 { + return ErrNoMXRecord } client, err := DialTimeout(fmt.Sprintf("%s:%d", mx[0].Host, 25), forceDisconnectAfter) if err != nil { @@ -79,8 +83,7 @@ func ValidateHostAndUser(serverHostName, serverMailAddress, email string) error mx, err := net.LookupMX(host) if err != nil { return ErrUnresolvableHost - } - if len(mx) == 0 { + } else if len(mx) == 0 { return ErrNoMXRecord } client, err := DialTimeout(fmt.Sprintf("%s:%d", mx[0].Host, 25), forceDisconnectAfter)