整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

每日一库之Go 强大而灵活的电子邮件库:email


击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言

发送邮件是一个很常见的需求:用户邮箱验证、邮箱召回等。Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件。然而这个库比较原始,使用不方便,而且官方声明不再增加新功能。于是乎出现了一些强大的第三方邮件库,今天推荐的这个库就是其中之一。

项目地址:https://github.com/jordan-wright/email,Star 数 1.3k+。

简介

email 包的设计易于使用,但又足够灵活以免受到限制。目的是为开发者提供友好的电子邮件接口。

该包当前支持以下功能:

  • From, To, Bcc, 和 Cc;
  • 邮件地址同时支持 "test@example.com" 和 "First Last test@example.com” 两种形式;
  • 正文支持普通文本和 HTML;
  • 附件支持;
  • 已读回馈;
  • 自定义协议头;
  • 。。。

快速使用

先安装:

$ go get github.com/jordan-wright/email

后使用,使用 Gmail 发送邮件:

e := email.NewEmail()
e.From = "Jordan Wright <test@gmail.com>"
e.To = []string{"test@example.com"}
e.Bcc = []string{"test_bcc@example.com"}
e.Cc = []string{"test_cc@example.com"}
e.Subject = "Awesome Subject"
e.Text = []byte("Text Body is, of course, supported!")
e.HTML = []byte("<h1>Fancy HTML is supported, too!</h1>")
e.Send("smtp.gmail.com:587", smtp.PlainAuth("", "test@gmail.com", "password123", "smtp.gmail.com"))
  • 通过 NewEmail 获取一个 Email 的实例;
  • From 设置发件人;
  • To 设置发给谁,支持多人;
  • Cc 设置抄送人,支持多人;
  • Bcc 设置密抄人,支持多人;
  • Subject 指定邮件标题;
  • Text 指定普通文本邮件正文;
  • HTML 指定 HTML 格式邮件正文;
  • 调用 Email 实例的 Send 方法进行邮件发送:第一个参数是 smtp 地址,第二个参数是 smtp.Auth 实例;

可见该库最终还是使用标准库 net/smtp 进行实际的邮件发送。

注意事项

  • From 中如果包含中文,比如:
e.From = "Go语言中文网<polaris@studygolang.com>”

收到的邮件不会显示发件人,有人提了一个 PR 支持 non-US-ASCII,但还未被 merge;根据该 PR 的提示,我们可以这样解决此问题:

e.From = mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<polaris@studygolang.com>"
  • 如果同时指定 Text 和 HTML,则 Text 的内容会被忽略;
  • 虽然默认情况下会尝试切换到 TLS,但如果想显示使用 TLS,则调用 Email#SendWithTLS 方法,具体代码如下:
tlsConfig := &tls.Config{
 InsecureSkipVerify: true,
  ServerName:         smtpHost,
}
e.SendWithTLS(addr, auth, tlsConfig)
  • 因为 Email 结构体的字段都是导出的,因此可以通过 &email.Email{} 这种形式创建实例,并直接为各个字段赋值;

带附件的邮件

如果邮件中需要带上附件,这个库很方便:

e.AttachFile("test.txt")

也可以是通过 io.Reader 读取文件:

func (e *Email) Attach(r io.Reader, filename string, c string) (a *Attachment, err error)

其中 filename 是放入附件显示的文件名,c 是 Content-Type,如果为空,则使用 application/octet-stream。

重用连接

该库还支持连接池,例如:

p, err := email.NewPool(
  "smtp.qq.com:25",
  4,
  smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))
  • 第 2 个参数 4 表示最多开启 4 个连接

通过 p 的 Send 方法执行发送操作:

p.Send(e, 10e9)

完整例子如下:

package main
import (
 "log"
 "mime"
 "net/smtp"
 "net/textproto"
 "strconv"
 "sync"
 "github.com/jordan-wright/email"
)
func main() {
 var wg sync.WaitGroup
 ch := make(chan *email.Email, 4)
 err := sendEmailByPool(ch, &wg)
 if err != nil {
  panic(err)
 }
 for i := 0; i < 4; i++ {
  wg.Add(1)
  ch <- &email.Email{
   To:      []string{"polaris@studygolang.com"},
   From:    mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<274768166@qq.com>",
   Subject: "Pool" + strconv.Itoa(i),
   HTML:    []byte("<h1>这是 HTML 正文</h1>"),
   Headers: textproto.MIMEHeader{},
  }
 }
 wg.Wait()
 close(ch)
}
func sendEmailByPool(ch <-chan *email.Email, wg *sync.WaitGroup) error {
 p, err := email.NewPool(
  "smtp.qq.com:25",
  4,
  smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))
 if err != nil {
  return err
 }
 for i := 0; i < 4; i++ {
  go func() {
   for e := range ch {
    err := p.Send(e, 10e9)
    if err != nil {
     log.Println("Send Email fail, err:", err)
    } else {
     log.Println("Send Email Successfully!")
    }
    wg.Done()
   }
  }()
 }
 return nil
}

总结

通过上面的介绍,你应该掌握了该库的使用,该库是不是满足了你对发邮件的需求?

最后附上一个完整的带附件的发邮件程序:

package main
import (
 "log"
 "mime"
 "net/smtp"
 "strings"
 "github.com/jordan-wright/email"
)
func main() {
 sendEmail("测试第三方 email 库", "xuxinhua@studygolang.com")
}
func sendEmail(subject string, tos ...string) error {
 e := email.NewEmail()
 smtpUsername := "274768166@qq.com"
 e.From = mime.QEncoding.Encode("UTF-8", "Go语言中文网") + "<274768166@qq.com>"
 e.To = tos
 e.Subject = subject
 e.HTML = []byte("<h1>HTML 正文</h1>")
 e.AttachFile("zap.log")
 auth := smtp.PlainAuth("", smtpUsername, "password", "smtp.qq.com")
 err := e.Send("smtp.qq.com:25", auth)
 if err != nil {
  log.Println("Send Mail to", strings.Join(tos, ","), "error:", err)
  return err
 }
 log.Println("Send Mail to", strings.Join(tos, ","), "Successfully")
 return nil
}
  • 测试时注意将发件人、收件人和密码改为你自己的。

这个适合初学者的指南中,你将学习如何创建一个响应式电子邮件模板。你将跟随逐步说明以及代码片段设计一个在任何设备上都看起来很棒的电子邮件模板。

这个项目非常适合渴望掌握电子邮件设计基础的新手!

(本文视频讲解:java567.com)

、为什么需要表单验证?

表单是Web开发中常用的交互元素,用户通过表单提交数据给后端进行处理。然而,用户输入的数据不可靠,因此需要进行表单验证,确保用户输入的数据符合预期。

二、基本的表单验证规则

必填字段:确保用户填写了必填字段,如用户名、密码等。

格式验证:验证用户输入的数据格式是否正确,如邮箱、手机号、日期等。

长度验证:验证用户输入的数据长度是否符合要求,如密码长度、字符数等。

数字范围验证:验证用户输入的数字是否在指定范围内,如年龄、价格等。

一致性验证:验证两个或多个输入字段的值是否一致,如密码确认、邮箱确认等。

三、使用JavaScript进行表单验证的步骤

1、获取表单元素:

const form = document.getElementById('myForm');

2、监听表单提交事件:

form.addEventListener('submit', function(event) {
 event.preventDefault(); // 阻止表单的默认提交行为
 // 表单验证逻辑
});

3、编写验证函数:

function validateForm() {
 // 获取表单字段的值
 const username = document.getElementById('username').value;
 const email = document.getElementById('email').value;
 // 必填字段验证
 if (username === '' || email === '') {
 alert('用户名和邮箱不能为空!');
 return false;
 }
 // 邮箱格式验证
 const emailRegex = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
 if (!emailRegex.test(email)) {
 alert('请输入正确的邮箱格式!');
 return false;
 }
 // 其他验证逻辑...
 return true; // 表单验证通过
}

4、表单验证:

form.addEventListener('submit', function(event) {
 event.preventDefault(); // 阻止表单的默认提交行为
 if (validateForm()) {
 form.submit(); // 提交表单
 }
});

5、错误提示:

<form id="myForm">
  <label for="username">用户名:</label>
  <input type="text" id="username" required>
  <br>
  <label for="email">邮箱:</label>
  <input type="email" id="email" required>
  <br>
  <button type="submit">提交</button>
</form>

在以上示例中,我们通过JavaScript实现了对用户名和邮箱字段的表单验证。在提交表单时,会先调用validateForm函数进行验证,如果验证通过则提交表单,否则提示错误信息。

四、常用的表单验证技巧

使用正则表达式进行格式验证,如邮箱、手机号等。

使用HTML5表单验证属性,如required、pattern、min、max等。

使用第三方表单验证插件,如jQuery Validation等,简化表单验证的编写。

五、表单验证的优化与提升

实时验证:使用input或change事件实时验证用户输入,及时提醒用户输入错误。

提示友好:使用合适的提示方式,如文字提示、图标提示等,让用户易于理解和操作。

全局验证:在表单提交之前对整个表单进行验证,确保所有字段的正确性。

客户端与服务器端验证:前端表单验证只是为了提高用户体验和减少无效请求,真正的安全性还需要服务器端验证。

通过以上步骤和技巧,你可以使用JavaScript轻松实现表单验证,为用户提供安全智能的交互体验!不仅能提高用户满意度,也能让你在前端开发领域脱颖而出!快来学习吧!

六、总结

表单验证在Web开发中扮演着重要的角色,通过JavaScript的灵活运用,可以实现各种表单验证需求。合理的表单验证不仅能提升用户体验,还能保障数据的准确性和安全性。希望本文能够帮助你掌握JavaScript表单验证的基本技巧和优化方法,打造安全智能的用户交互体验!