golang无需发送邮件即可验证邮箱地址的插件库email-verifier的使用

Golang无需发送邮件即可验证邮箱地址的插件库email-verifier的使用

简介

email-verifier是一个Go语言库,用于在不发送任何电子邮件的情况下验证电子邮件地址。

功能特性

  • 电子邮件地址验证:验证字符串是否包含有效的电子邮件
  • 通过SMTP进行电子邮件验证查找:对传递的电子邮件执行验证(默认启用catchAll检测)
  • MX记录验证:检查给定域名的DNS MX记录
  • 其他验证:包括免费电子邮件提供商检查、角色账户验证、一次性电子邮件地址(DEA)验证
  • 电子邮件可达性:检查发送电子邮件到该地址的可信度

安装

使用go get安装这个包:

go get -u github.com/AfterShip/email-verifier

使用示例

基本用法

使用Verify方法验证电子邮件地址:

package main

import (
	"fmt"
	
	emailverifier "github.com/AfterShip/email-verifier"
)

var (
	verifier = emailverifier.NewVerifier()
)

func main() {
	email := "example@exampledomain.org"

	ret, err := verifier.Verify(email)
	if err != nil {
		fmt.Println("verify email address failed, error is: ", err)
		return
	}
	if !ret.Syntax.Valid {
		fmt.Println("email address syntax is invalid")
		return
	}

	fmt.Println("email validation result", ret)
	/*
		result is:
		{
			"email":"example@exampledomain.org",
			"disposable":false,
			"reachable":"unknown",
			"role_account":false,
			"free":false,
			"syntax":{
			"username":"example",
				"domain":"exampledomain.org",
				"valid":true
			},
			"has_mx_records":true,
			"smtp":null,
			"gravatar":null
		}
	*/
}

电子邮件验证查找

使用CheckSMTP通过SMTP执行电子邮件验证查找:

var (
    verifier = emailverifier.
        NewVerifier().
        EnableSMTPCheck()
)

func main() {
    domain := "domain.org"
    username := "username"
    ret, err := verifier.CheckSMTP(domain, username)
    if err != nil {
        fmt.Println("check smtp failed: ", err)
        return
    }

    fmt.Println("smtp validation result: ", ret)
}

如果要禁用catchAll检查,可以使用DisableCatchAllCheck()开关(仅在启用SMTP验证时有效):

verifier = emailverifier.
        NewVerifier().
        EnableSMTPCheck().
        DisableCatchAllCheck()

使用SOCKS5代理验证电子邮件

支持设置SOCKS5代理来验证电子邮件,proxyURI格式应为:socks5://user:password@127.0.0.1:1080?timeout=5s

var (
    verifier = emailverifier.
        NewVerifier().
        EnableSMTPCheck().
    	Proxy("socks5://user:password@127.0.0.1:1080?timeout=5s")
)

func main() {
    domain := "domain.org"
    username := "username"
    ret, err := verifier.CheckSMTP(domain, username)
    if err != nil {
        fmt.Println("check smtp failed: ", err)
        return
    }

    fmt.Println("smtp validation result: ", ret)
}

其他验证

检查电子邮件域是否为一次性域:

var (
    verifier = emailverifier.
        NewVerifier().
        EnableAutoUpdateDisposable()
)

func main() {
    domain := "domain.org"
    if verifier.IsDisposable(domain) {
        fmt.Printf("%s is a disposable domain\n", domain)
        return
    }
    fmt.Printf("%s is not a disposable domain\n", domain)
}

域名拼写建议

检查电子邮件域中的拼写错误:

func main() {
    domain := "gmai.com"
    suggestion := verifier.SuggestDomain(domain) 
    // suggestion should be `gmail.com`
    if suggestion != "" {
        fmt.Printf("domain %s is misspelled, right domain is %s. \n", domain, suggestion)
        return 
    }
    fmt.Printf("domain %s has no possible misspellings. \n", domain)
}

注意事项

  • 大多数ISP会阻止通过端口25发出的SMTP请求以防止垃圾邮件
  • 当使用Verify()方法时,默认不启用域拼写检查,可以使用EnableDomainSuggest()启用
  • 可以通过初始化验证器使用EnableAutoUpdateDisposable()每天自动更新一次性域列表

更多关于golang无需发送邮件即可验证邮箱地址的插件库email-verifier的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang无需发送邮件即可验证邮箱地址的插件库email-verifier的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用email-verifier库验证邮箱地址

email-verifier是一个Go语言库,用于在不发送实际邮件的情况下验证邮箱地址的有效性。它通过检查DNS记录、SMTP服务器响应等方式来验证邮箱是否存在。

安装

首先安装email-verifier库:

go get github.com/AfterShip/email-verifier

基本使用

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/AfterShip/email-verifier/verifier"
)

func main() {
	// 创建验证器实例
	verifier := verifier.NewVerifier()
	
	// 设置超时时间
	verifier = verifier.EnableSMTPCheck().
		EnableDomainSuggest().
		EnableAutoUpdateDisposable().
		EnableGravatarCheck().
		SetSMTPTimeout(10 * time.Second)
	
	// 验证邮箱地址
	ret, err := verifier.Verify("example@gmail.com")
	if err != nil {
		log.Fatal(err)
	}
	
	// 检查结果
	if !ret.Syntax.Valid {
		fmt.Println("邮箱地址语法无效")
		return
	}
	
	fmt.Printf("验证结果: %+v\n", ret)
	
	if ret.Reachable == verifier.ReachableYes {
		fmt.Println("邮箱地址有效且可接收邮件")
	} else if ret.Reachable == verifier.ReachableUnknown {
		fmt.Println("无法确定邮箱地址是否有效")
	} else {
		fmt.Println("邮箱地址无效或不存在")
	}
}

主要功能

  1. 语法验证:检查邮箱地址格式是否正确
  2. 域名验证:检查域名是否存在MX记录
  3. SMTP验证:与邮件服务器通信验证邮箱是否存在
  4. 一次性邮箱检测:检测是否为临时/一次性邮箱
  5. Gravatar检查:检查邮箱是否关联了Gravatar头像

高级配置

// 自定义DNS解析器
verifier := verifier.NewVerifier().
	SetDNSResolver("8.8.8.8:53")

// 禁用SMTP检查(仅检查语法和DNS)
verifier = verifier.DisableSMTPCheck()

// 设置并发限制
verifier = verifier.SetConcurrency(10)

// 设置自定义HTTP客户端
verifier = verifier.SetHTTPClient(&http.Client{
	Timeout: 5 * time.Second,
})

结果解析

验证结果包含多个字段:

type Result struct {
	Email       string        // 验证的邮箱地址
	Syntax      SyntaxResult  // 语法验证结果
	DNS         DNSResult     // DNS验证结果
	SMTP        SMTPResult    // SMTP验证结果
	Reachable   ReachableType // 是否可达
	Gravatar    GravatarResult // Gravatar检查结果
	Disposable  bool          // 是否一次性邮箱
	RoleAccount bool          // 是否为角色账户(如admin@, support@)
	Free        bool          // 是否为免费邮箱服务
}

实际应用示例

func ValidateEmail(email string) (bool, error) {
	verifier := verifier.NewVerifier().
		EnableSMTPCheck().
		SetSMTPTimeout(5 * time.Second)
	
	ret, err := verifier.Verify(email)
	if err != nil {
		return false, fmt.Errorf("验证失败: %v", err)
	}
	
	// 基本有效性检查
	if !ret.Syntax.Valid || ret.Disposable || ret.Reachable == verifier.ReachableNo {
		return false, nil
	}
	
	// 对于不确定的情况,可以认为是有效的
	return true, nil
}

注意事项

  1. SMTP验证可能被某些邮件服务器阻止
  2. 验证结果并非100%准确
  3. 频繁验证可能会被邮件服务器视为滥用
  4. 对于重要场景,仍建议使用发送验证码的方式

email-verifier库提供了一种轻量级的邮箱验证方式,适合在用户注册等场景下快速过滤无效邮箱地址,减少垃圾注册和无效用户。

回到顶部