golang模块化邮箱验证插件go-email-validator的使用
Golang模块化邮箱验证插件go-email-validator的使用
安装
go get -u github.com/go-email-validator/go-email-validator
可用验证器
验证电子邮件格式:username@domain.part
-
语法验证器(syntaxValidator)
NewSyntaxValidator()
- 使用内置库mail.ParseAddressNewSyntaxRegexValidator(emailRegex *regexp.Regexp)
- 基于正则表达式的验证
-
一次性邮件验证器(disposableValidator) 默认基于mailchecker(可替换)
-
角色邮箱验证器(roleValidator) 默认基于role-based-email-addresses(可替换)
-
MX记录验证器(mxValidator)
-
SMTP验证器(smtpValidator)
-
用户名禁用词验证器(banWordsUsernameValidator) 检查用户名中的禁用词
-
邮箱黑名单验证器(blackListEmailsValidator) 阻止列表中的电子邮件
-
域名黑名单验证器(blackListValidator) 阻止黑名单域名
-
域名白名单验证器(whiteListValidator) 只接受白名单中的电子邮件
-
Gravatar验证器(gravatarValidator) 检查gravatar.com上的用户是否存在
使用示例
使用构建器
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() {
// 使用GetDefaultFactories()作为验证器列表创建默认的DepValidator
builder := ev.NewDepBuilder(nil).Build()
/*
要设置另一个初始验证器列表
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("test@evmail.com")))
if !v.IsValid() {
panic("email is invalid")
}
fmt.Println(v)
}
单个验证器
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("some@evmail.here"))) // ev.ValidationResult
if !v.IsValid() {
panic("email is invalid")
}
fmt.Println(v)
}
附加选项
要为不同的验证器设置选项,使用NewInput(..., NewKVOption(ValidatorName, Options))
NewInput(
evmail.FromString("test@evmail.com"),
NewKVOption(SMTPValidatorName, evsmtp.NewOptions(evsmtp.OptionsDTO{
Port: 465,
})),
)
使用函数New...(...)
来创建结构体而不是公开的。
如何扩展
要添加自己的验证器,只需实现ev.Validator
接口。对于没有依赖项的验证器,可以使用结构体ev.AValidatorWithoutDeps
装饰器
- WarningsDecorator 允许将错误移动到警告并更改
ValidationResult
中的IsValid()
结果 - 缓存 基于evcahce.Interface,默认实现使用gocache
CacheDecorator
保存验证器的结果checkerCacheRandomRCPT
用于缓存RandomRCPTs请求
注意:要使用msgpack,您应该有导出的字段或实现自定义编码/解码
日志
包使用zap。默认级别是zap.ErrorLevel。
常见问题
大多数互联网服务提供商阻止出站SMTP请求
StackOverflow线程可能会有所帮助。
在telnet中检查SMTP
telnet
OPEN gmail-smtp-in.l.google.com 25
EHLO localhost
MAIL FROM: <user@example.org>
rcpt to: <some.email@gmail.com>
quit
一些邮件提供商可能会将您的IP放入垃圾邮件过滤器
例如:
更多关于golang模块化邮箱验证插件go-email-validator的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang模块化邮箱验证插件go-email-validator的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用go-email-validator进行邮箱验证
go-email-validator是一个功能强大的Go语言模块,用于验证电子邮件地址的有效性。它提供了多种验证方式,包括格式验证、MX记录验证、SMTP验证等。
安装
首先,使用go get命令安装该模块:
go get github.com/AfterShip/email-verifier
基本使用
1. 简单格式验证
package main
import (
"fmt"
"github.com/AfterShip/email-verifier"
)
func main() {
verifier := emailverifier.NewVerifier()
// 简单验证邮箱格式
email := "example@gmail.com"
ret, err := verifier.ParseAddress(email)
if err != nil {
fmt.Printf("%s 不是有效的邮箱格式: %v\n", email, err)
return
}
fmt.Printf("邮箱格式有效: %s\n", ret.ValidFormat)
fmt.Printf("用户名部分: %s\n", ret.Username)
fmt.Printf("域名部分: %s\n", ret.Domain)
}
2. 检查MX记录
func checkMXRecord() {
verifier := emailverifier.NewVerifier()
email := "example@gmail.com"
// 检查MX记录
ret, err := verifier.CheckMX(email)
if err != nil {
fmt.Printf("检查MX记录失败: %v\n", err)
return
}
if ret.HasMXRecord {
fmt.Printf("%s 有MX记录\n", email)
} else {
fmt.Printf("%s 没有MX记录\n", email)
}
}
3. 完整验证流程
func fullValidation() {
verifier := emailverifier.NewVerifier()
email := "example@gmail.com"
// 执行完整验证
ret := verifier.Verify(email)
if !ret.Reachable {
fmt.Printf("%s 不可达\n", email)
return
}
fmt.Printf("验证结果:\n")
fmt.Printf("格式有效: %t\n", ret.Syntax.Valid)
fmt.Printf("有MX记录: %t\n", ret.MX.HasMXRecord)
fmt.Printf("有A记录: %t\n", ret.MX.HasARecord)
fmt.Printf("SMTP验证: %t\n", ret.SMTP != nil)
fmt.Printf("一次性邮箱: %t\n", ret.Disposable)
fmt.Printf("免费邮箱: %t\n", ret.Free)
}
高级配置
1. 自定义超时设置
func withTimeout() {
verifier := emailverifier.NewVerifier().
EnableSMTPCheck().
EnableAutoUpdateDisposable().
EnableGravatarCheck().
SetSMTPTimeout(10 * time.Second) // 设置SMTP验证超时时间
email := "example@gmail.com"
ret := verifier.Verify(email)
fmt.Printf("验证结果: %+v\n", ret)
}
2. 禁用某些验证
func disableChecks() {
verifier := emailverifier.NewVerifier().
DisableSMTPCheck(). // 禁用SMTP验证
DisableGravatarCheck() // 禁用Gravatar检查
email := "example@gmail.com"
ret := verifier.Verify(email)
fmt.Printf("验证结果: %+v\n", ret)
}
3. 验证一次性邮箱
func checkDisposable() {
verifier := emailverifier.NewVerifier()
email := "example@mailinator.com"
ret := verifier.Verify(email)
if ret.Disposable {
fmt.Printf("%s 是一次性邮箱\n", email)
} else {
fmt.Printf("%s 不是一次性邮箱\n", email)
}
}
实际应用示例
下面是一个完整的邮箱验证服务示例:
package main
import (
"fmt"
"net/http"
"github.com/AfterShip/email-verifier"
)
var verifier = emailverifier.NewVerifier().
EnableSMTPCheck().
EnableAutoUpdateDisposable()
func validateEmailHandler(w http.ResponseWriter, r *http.Request) {
email := r.URL.Query().Get("email")
if email == "" {
http.Error(w, "请提供email参数", http.StatusBadRequest)
return
}
ret := verifier.Verify(email)
if !ret.Syntax.Valid {
fmt.Fprintf(w, "邮箱格式无效")
return
}
if !ret.MX.HasMXRecord {
fmt.Fprintf(w, "邮箱域名没有MX记录")
return
}
if ret.Disposable {
fmt.Fprintf(w, "检测到一次性邮箱")
return
}
fmt.Fprintf(w, "邮箱验证通过")
}
func main() {
http.HandleFunc("/validate", validateEmailHandler)
fmt.Println("服务启动在 :8080")
http.ListenAndServe(":8080", nil)
}
注意事项
- SMTP验证可能会被某些邮件服务器阻止,因为它看起来像垃圾邮件行为
- 验证过程可能需要较长时间(特别是SMTP验证)
- 对于批量验证,建议限制并发请求数量
- 某些企业邮箱可能需要特殊配置才能验证
go-email-validator提供了灵活的配置选项,可以根据实际需求启用或禁用特定的验证步骤,平衡验证准确性和性能。