diff --git a/baked_in.go b/baked_in.go index e8dfb286c..66d9c52f0 100644 --- a/baked_in.go +++ b/baked_in.go @@ -9,6 +9,7 @@ import ( "fmt" "io/fs" "net" + "net/mail" "net/url" "os" "reflect" @@ -1692,6 +1693,10 @@ func isE164(fl FieldLevel) bool { // isEmail is the validation function for validating if the current field's value is a valid email address. func isEmail(fl FieldLevel) bool { + _, err := mail.ParseAddress(fl.Field().String()) + if err != nil { + return false + } return emailRegex().MatchString(fl.Field().String()) } diff --git a/validator_test.go b/validator_test.go index 2f76dc2d9..8efdad541 100644 --- a/validator_test.go +++ b/validator_test.go @@ -8727,6 +8727,20 @@ func TestEmail(t *testing.T) { NotEqual(t, errs, nil) AssertError(t, errs, "", "", "", "", "email") + s = "mail@dotaftercom.com." + errs = validate.Var(s, "email") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "email") + + s = "mail@dotaftercom.co.uk." + errs = validate.Var(s, "email") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "email") + + s = "Foo Bar " + errs = validate.Var(s, "email") + NotEqual(t, errs, nil) + s = "" errs = validate.Var(s, "email") NotEqual(t, errs, nil) @@ -12080,7 +12094,7 @@ func TestExcludedIf(t *testing.T) { test11 := struct { Field1 bool - Field2 *string `validate:"excluded_if=Field1 false"` + Field2 *string `validate:"excluded_if=Field1 false"` }{ Field1: false, Field2: nil,