首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何验证Go中的电子邮件地址

如何验证Go中的电子邮件地址
EN

Stack Overflow用户
提问于 2021-03-14 11:32:38
回答 4查看 27.6K关注 0票数 42

我已经检查了StackOverflow,找不到任何问题回答如何在Go语言中验证电子邮件。

经过一番研究,我根据自己的需要找出并解决了这个问题。

我有一个regexGo函数,它们工作得很好:

代码语言:javascript
复制
import (
    "fmt"
    "regexp"
)

func main() {
    fmt.Println(isEmailValid("test44@gmail.com")) // true
    fmt.Println(isEmailValid("test$@gmail.com")) // true -- expected "false" 
}


// isEmailValid checks if the email provided is valid by regex.
func isEmailValid(e string) bool {
    emailRegex := regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
    return emailRegex.MatchString(e)
}

问题是,接受我不想要的特殊字符,。我尝试使用其他语言的"regex“表达式中的一些,但它在调试中抛出了错误”未知转义“

有人能给我一个好的正则表达式或任何与GoLang一起工作的快速解决方案(pkg)吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-03-14 11:42:35

标准库内置了电子邮件解析和验证,只需使用:mail.ParseAddress()

一个简单的“有效”测试:

代码语言:javascript
复制
func valid(email string) bool {
    _, err := mail.ParseAddress(email)
    return err == nil
}

测试它:

代码语言:javascript
复制
for _, email := range []string{
    "good@exmaple.com",
    "bad-example",
} {
    fmt.Printf("%18s valid: %t\n", email, valid(email))
}

哪个输出(在围棋游乐场上尝试):

代码语言:javascript
复制
  good@exmaple.com valid: true
       bad-example valid: false

注:

net/mail包实现并遵循RFC 5322规范(以及RFC 6532的扩展)。这意味着一个看似糟糕的电子邮件地址,如bad-example@t被接受和分析的包,因为它是有效的,根据规范。t可能是一个有效的本地域名,它不一定必须是公共域。net/mail不检查地址的域部分是否是公共域,也不检查它是否是现有的、可访问的公共域。

票数 85
EN

Stack Overflow用户

发布于 2021-05-25 10:26:00

上面来自@icza的方法很好,但是,如果我们在登录/注册表单验证中使用它,许多人将输入一个部分或不正确的电子邮件地址,这将在生产中创建一堆无效记录。而且,谁知道我们会因此而被杀呢。

因此,我使用regex解决方案来验证标准电子邮件()。

这里是代码:

代码语言:javascript
复制
func isEmailValid(e string) bool {
    emailRegex := regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`)
    return emailRegex.MatchString(e)
}

测试用例:

代码语言:javascript
复制
fmt.Println(isEmailValid("test44@gmail.com"))         // true 
fmt.Println(isEmailValid("bad-email"))               // false
fmt.Println(isEmailValid("test44$@gmail.com"))      // false
fmt.Println(isEmailValid("test-email.com"))        // false
fmt.Println(isEmailValid("test+email@test.com"))  // true
票数 11
EN

Stack Overflow用户

发布于 2021-07-01 19:34:17

方法实现示例:

代码语言:javascript
复制
var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")

这个包与我创建struct的位置相同。

代码语言:javascript
复制
type EmailInputRegistration struct {
    Email           string
}

然后用于处理错误:

代码语言:javascript
复制
func (in EmailInputRegistration) Validate() error {
    if !emailRegexp.MatchString(in.Email) {
        return fmt.Errorf("%w: email invalid", ErrValidation)
    }
    //any other exception handling...

    return nil
}

理想情况下,这个EmailInputRegistration应该重新分解,以包括注册所需的所有数据,如电子邮件、用户、密码等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66624011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档