我已经检查了StackOverflow,找不到任何问题回答如何在Go语言中验证电子邮件。
经过一番研究,我根据自己的需要找出并解决了这个问题。
我有一个regex和Go函数,它们工作得很好:
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)吗?
发布于 2021-03-14 11:42:35
标准库内置了电子邮件解析和验证,只需使用:mail.ParseAddress()。
一个简单的“有效”测试:
func valid(email string) bool {
_, err := mail.ParseAddress(email)
return err == nil
}测试它:
for _, email := range []string{
"good@exmaple.com",
"bad-example",
} {
fmt.Printf("%18s valid: %t\n", email, valid(email))
}哪个输出(在围棋游乐场上尝试):
good@exmaple.com valid: true
bad-example valid: false注:
net/mail包实现并遵循RFC 5322规范(以及RFC 6532的扩展)。这意味着一个看似糟糕的电子邮件地址,如bad-example@t被接受和分析的包,因为它是有效的,根据规范。t可能是一个有效的本地域名,它不一定必须是公共域。net/mail不检查地址的域部分是否是公共域,也不检查它是否是现有的、可访问的公共域。
发布于 2021-05-25 10:26:00
上面来自@icza的方法很好,但是,如果我们在登录/注册表单验证中使用它,许多人将输入一个部分或不正确的电子邮件地址,这将在生产中创建一堆无效记录。而且,谁知道我们会因此而被杀呢。
因此,我使用regex解决方案来验证标准电子邮件()。
这里是代码:
func isEmailValid(e string) bool {
emailRegex := regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`)
return emailRegex.MatchString(e)
}测试用例:
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发布于 2021-07-01 19:34:17
方法实现示例:
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的位置相同。
type EmailInputRegistration struct {
Email string
}然后用于处理错误:
func (in EmailInputRegistration) Validate() error {
if !emailRegexp.MatchString(in.Email) {
return fmt.Errorf("%w: email invalid", ErrValidation)
}
//any other exception handling...
return nil
}理想情况下,这个EmailInputRegistration应该重新分解,以包括注册所需的所有数据,如电子邮件、用户、密码等。
https://stackoverflow.com/questions/66624011
复制相似问题