golang模块化邮箱验证插件go-email-validator的使用

Golang模块化邮箱验证插件go-email-validator的使用

安装

go get -u github.com/go-email-validator/go-email-validator

可用验证器

验证电子邮件格式:username@domain.part

  1. 语法验证器(syntaxValidator)

    • NewSyntaxValidator() - 使用内置库mail.ParseAddress
    • NewSyntaxRegexValidator(emailRegex *regexp.Regexp) - 基于正则表达式的验证
  2. 一次性邮件验证器(disposableValidator) 默认基于mailchecker(可替换)

  3. 角色邮箱验证器(roleValidator) 默认基于role-based-email-addresses(可替换)

  4. MX记录验证器(mxValidator)

  5. SMTP验证器(smtpValidator)

  6. 用户名禁用词验证器(banWordsUsernameValidator) 检查用户名中的禁用词

  7. 邮箱黑名单验证器(blackListEmailsValidator) 阻止列表中的电子邮件

  8. 域名黑名单验证器(blackListValidator) 阻止黑名单域名

  9. 域名白名单验证器(whiteListValidator) 只接受白名单中的电子邮件

  10. 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

装饰器

  1. WarningsDecorator 允许将错误移动到警告并更改ValidationResult中的IsValid()结果
  2. 缓存 基于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放入垃圾邮件过滤器

例如:

  1. hotmail.com

更多关于golang模块化邮箱验证插件go-email-validator的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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)
}

注意事项

  1. SMTP验证可能会被某些邮件服务器阻止,因为它看起来像垃圾邮件行为
  2. 验证过程可能需要较长时间(特别是SMTP验证)
  3. 对于批量验证,建议限制并发请求数量
  4. 某些企业邮箱可能需要特殊配置才能验证

go-email-validator提供了灵活的配置选项,可以根据实际需求启用或禁用特定的验证步骤,平衡验证准确性和性能。

回到顶部