📚 go-email-validator - Awesome Go Library for Email
Modular email validator for syntax, disposable, smtp, etc... checking.
Detailed Description of go-email-validator
Library under development (Interfaces may be changed slightly)
Demo on rapidapi.com
Install
go get -u github.com/go-email-validator/go-email-validator
Available validators
-
NewSyntaxValidator()
- mail.ParseAddress from built-in libraryNewSyntaxRegexValidator(emailRegex *regexp.Regexp)
- validation based on regular expression
-
disposableValidator based on mailchecker by default (set is replaceable)
-
roleValidator bases on role-based-email-addresses by default (set is replaceable)
-
to use proxy connection, DialFunc need to be changed in Checker. There is evsmtp.H12IODial, implementing for h12w.
-
banWordsUsernameValidator looks for banned words in username
-
blackListEmailsValidator blocked emails from list
-
blackListValidator blocked emails with domains from black list
-
whiteListValidator accepts only emails from white list
-
gravatarValidator check existing of user on gravatar.com
Usage
With builder
package main
import (
"fmt"
"github.com/go-email-validator/go-email-validator/pkg/ev"
"github.com/go-email-validator/go-email-validator/pkg/ev/evmail"
)
func main() {
// create defaults DepValidator with GetDefaultFactories() as list of validators
builder := ev.NewDepBuilder(nil).Build()
/*
to set another list of initial validators
builder := NewDepBuilder(&ValidatorMap{
ev.ValidatorName: ev.Validator,
}).Build()
*/
// builder.Set(ev.ValidatorName, NewValidator()) builder
// builder.Has(names ...ev.ValidatorName) bool
// builder.Delete(names ...ev.ValidatorName) bool
validator := builder.Build()
v := validator.Validate(NewInput(evmail.FromString("[email protected]")))
if !v.IsValid() {
panic("email is invalid")
}
fmt.Println(v)
}
Single validator
package main
import (
"fmt"
"github.com/go-email-validator/go-email-validator/pkg/ev"
"github.com/go-email-validator/go-email-validator/pkg/ev/evmail"
)
func main() {
var v = ev.NewSyntaxValidator().Validate(ev.NewInput(evmail.FromString("[email protected]"))) // ev.ValidationResult
if !v.IsValid() {
panic("email is invalid")
}
fmt.Println(v)
}
Addition options
To set options for different validators, use NewInput(..., NewKVOption(ValidatorName, Options))
NewInput(
evmail.FromString("[email protected]"),
NewKVOption(SMTPValidatorName, evsmtp.NewOptions(evsmtp.OptionsDTO{
Port: 465,
})),
)
Use function New...(...) to create structure instead of public.
How to extend
To add own validator, just implement ev.Validator interface. For validator without dependencies, you can use structure ev.AValidatorWithoutDeps
Decorators
- WarningsDecorator allows moving errors to warnings and change result of
IsValid()
in ValidationResult. - Cache based on evcahce.Interface, default realization is done for gocache.
- CacheDecorator saves result of validator. For caching, you can implement
evcache.Interface
or use gocache implementation byevcache.NewCache
. See Test_Cache as example. - checkerCacheRandomRCPT for caching of RandomRCPTs request. See Test_checkerCacheRandomRCPT_RandomRCPT_RealCache as example.
- CacheDecorator saves result of validator. For caching, you can implement
Notice, to use msgpack you should have exported fields or implement custom encoding/decoding (doc)
Logger
Package use zap.
To use logging see in log package. Default level is zap.ErrorLevel.
Addition
- For running workflow locally use act
FAQ
Most Internet Service Providers block outgoing SMTP request.
The StackOverflow thread could be helpful.
To check smtp in telnet
telnet
OPEN gmail-smtp-in.l.google.com 25
EHLO localhost
MAIL FROM: <[email protected]>
rcpt to: <[email protected]>
quit
Some mail providers could put your ip in spam filter.
For example:
- hotmail.com
Roadmap
- Tests
- Add functional tests
- Find way to compare functions in tests
- Add binary release
- Check in spamhaus
- Add misspelled email
- Add DKIM checking
- Add linter in pre-hook and ci
- Do full thread safe library
- Copy features from truemail