目录

Go语言使用 gomail 库发送邮件

在现代软件开发中,邮件发送功能几乎成为了每个应用的标配。无论是用户注册验证、通知提醒还是营销推广,邮件都扮演着不可或缺的角色。作为一门高效、简洁的编程语言,Go为邮件发送提供了强大的库支持。本文将重点介绍如何使用 gomail 这个优秀的库,在Go应用中实现邮件的发送功能。

一、gomail 简介与安装

gomail是一个专门为Go语言设计的邮件发送库,它提供了简洁的API和丰富的功能,包括HTML邮件支持、附件添加、嵌入式图片等功能。相比于Go语言标准库中的net/smtp包,gomail的接口更加友好,使用起来更加便捷

在开始之前,我们需要先安装gomail库。可以使用以下命令获取最新版本

go get gopkg.in/gomail.v2

安装完成后,在Go代码中通过import语句引入gomail包:

import "gopkg.in/gomail.v2"

二、实现基础的邮件发送

package main

import (
    "gopkg.in/gomail.v2"
)

func main() {
    m := gomail.NewMessage()
    
    // 发件人/收件人/主题
    m.SetHeader("From", "admin@yourdomain.com") 
    m.SetHeader("To", "user@example.com")
    m.SetHeader("Subject", "Go邮件测试")
    
    // 正文内容(支持HTML)
    m.SetBody("text/html", `你好,我是五岁小孩,我正在测试使用gomail发送邮件`)

    // 连接SMTP服务器
    d := gomail.NewDialer("smtp.exmail.qq.com", 465, "username", "password")
    
    // 发送邮件
    if err := d.DialAndSend(m); err != nil {
        panic(err)
    }
}

如上所示,发送邮件的基本流程包括:创建邮件消息对象、设置邮件头信息(发件人、收件人、主题等)、设置邮件正文、配置SMTP服务器信息,最后执行发送操作

⚠️注意:username 和 password 是不同邮箱提供的账号密码,需要从邮箱账号设置中获取,如 QQ 邮箱,则需要登录 QQ 邮箱,从设置中获取生成密码(非账号登录密码),其他邮箱获取账号密码的方法雷同

不同的邮箱服务商有不同的SMTP服务器设置。下面是一些常见邮箱的SMTP配置信息,仅供大家参考:

邮箱类型 SMTP服务器 端口 认证要求
QQ邮箱 smtp.qq.com 465/587 使用授权码而非密码
163邮箱 smtp.163.com 25/465/587 密码或客户端授权码
126邮箱 smtp.126.com 25/465 密码或客户端授权码
企业邮箱 smtp.exmail.qq.com 465 使用邮箱密码

重要提示:部分邮箱等需要额外安全认证的服务,需要使用授权码而不是邮箱密码进行SMTP认证。授权码需要在邮箱设置中生成获取

三、发送 HTML 格式邮件

除了纯文本邮件,gomail同样支持发送HTML格式的邮件,这对于发送富文本内容(如营销邮件、新闻通讯等)非常有用。

package main

import (
    "log"
    "gopkg.in/gomail.v2"
)

func main() {
    m := gomail.NewMessage()
    m.SetHeader("From", "sender@example.com")
    m.SetHeader("To", "recipient@example.com")
    m.SetHeader("Subject", "HTML邮件测试")
    
    // HTML邮件内容
    htmlBody := `
    <html>
    <body>
        <h1>欢迎订阅我们的新闻通讯</h1>
        <p>这是一封<strong>HTML格式</strong>的测试邮件。</p>
        <p><a href="https://example.com">点击访问我们的网站</a></p>
        <p style="color: #ff6600;">此邮件由Go程序自动发送</p>
    </body>
    </html>
    `
    
    m.SetBody("text/html", htmlBody)
    
    d := gomail.NewDialer("smtp.163.com", 25, "your_email@163.com", "your_password")
    
    if err := d.DialAndSend(m); err != nil {
        log.Fatal("发送邮件失败:", err)
    }
    
    log.Println("HTML邮件发送成功!")
}

注意,这里我们使用了SetBody方法,并将第一个参数设置为"text/html",表示这是一个HTML格式的邮件内容

四、发送带附件的邮件

在实际应用中,我们经常需要发送带有附件的邮件,例如发送报表、文档或图片等。

package main

import (
    "log"
    "gopkg.in/gomail.v2"
)

func main() {
    m := gomail.NewMessage()
    m.SetHeader("From", "sender@example.com")
    m.SetHeader("To", "recipient@example.com")
    m.SetHeader("Subject", "带附件的测试邮件")
    m.SetBody("text/plain", "这封邮件包含一个附件,请查收。")
    
    // 添加附件
    m.Attach("/path/to/your/file.pdf")
    
    d := gomail.NewDialer("smtp.qq.com", 465, "your_email@qq.com", "your_auth_code")
    
    if err := d.DialAndSend(m); err != nil {
        log.Fatal("发送邮件失败:", err)
    }
    
    log.Println("带附件的邮件发送成功!")
}

使用Attach方法可以轻松添加附件,只需要提供文件的路径即可。gomail会自动处理文件的MIME类型识别和编码工作

五、进阶:封装可复用代码

import (
  	"errors"
  	"fmt"
  	"gopkg.in/gomail.v2"
  )
  
  //定义邮箱服务器连接信息,如果是阿里邮箱 pass填密码,qq邮箱填授权码
  type MailConfig struct {
  	Host string `json:"Host"` //邮箱服务器地址
  	Port int    `json:"Port"` //邮箱服务器端口
  	User string `json:"User"` //邮箱账号
  	Pass string `json:"Pass"` //邮箱密码 如果是阿里邮箱 Pass填密码,qq邮箱填授权码
  	SSL  bool   `json:"SSL"`  //SSL加密传输,端口==465是默认为true
  }
  
  //mailConfig 邮件配置MailConfig 不能为空
  //mailFrom 邮件发送方 默认MailConfig账号
  //mailTo 接收邮箱 不能为空
  //subject 主题
  //message 发送消息
  func SendMail(mailConfig *MailConfig, mailFrom string, mailTo []string, subject string, message string) error {
  	//默认邮件来自配置邮箱
  	if IsEmpty(mailFrom) {
  		mailFrom = mailConfig.User
  	}
  	//接收消息的邮箱不能为空
  	if len(mailTo) <= 0 {
  		return errors.New("mailTo:接收消息的邮箱不能为空")
  	}
  	m := gomail.NewMessage()
  	m.SetHeader("From", m.FormatAddress(mailConfig.User, mailFrom)) //这种方式可以添加别名,
  	m.SetHeader("To", mailTo...)                                    //发送给多个用户
  	m.SetHeader("Subject", subject)                                 //设置邮件主题
  	m.SetBody("text/html", message)                                 //设置邮件正文
  	//SSL加密
  	if mailConfig.SSL {
  		mailConfig.Port = 465
  	}
  	//连接
  	dialer := gomail.NewDialer(mailConfig.Host, mailConfig.Port, mailConfig.User, mailConfig.Pass)
  
  	//发送
  	erBySend := dialer.DialAndSend(m)
  	if erBySend != nil {
  		fmt.Printf("base package SendMail send error:%v", erBySend.Error())
  		//error
  		return erBySend
  	}
  	//success
  	return nil
  }

这个封装后的函数支持发送给多个收件人、可选择HTML或纯文本格式、支持添加多个附件,更加简洁,更加适合在生产环境中使用

⚠️注意:代码仅供参考,建议大家自行封装发送邮件函数

常见问题

1. 邮箱服务的密码应该填写什么?

邮箱密码 如果是阿里邮箱 Pass填密码,qq邮箱填授权码

以 qq 邮箱为例,打开qq邮箱的设置,可以看到邮箱服务 SMTP 配置,包含服务器地址、端口、加密方式、密码

2. 发送报错?

以实际报错为准,大部分的错误都是 smtp 配置写错,还有就是发送太频繁,不同的邮箱都会有邮件数量限制

3. 发送邮件有限制吗?

具体以不同邮箱的说明为准,比如 qq 邮箱就有限制一分钟多少次,一天多少次

总结

通过本文的介绍,相信大家已经了解了如何使用Go语言的gomail库来发送邮件。gomail提供了简洁而强大的API,支持文本邮件、HTML邮件、附件发送等功能,能够满足大多数应用场景的需求。

在实际项目中,可以根据具体需求对邮件发送功能进行进一步的封装和优化,例如添加模板支持、异步发送、发送状态追踪等功能。

邮件发送虽然看似简单,但在生产环境中需要考虑很多细节问题,如错误处理、性能优化、反垃圾邮件策略等。

希望本文能为你在Go项目中实现邮件发送功能提供有益的参考。

提示:本文中的代码示例仅供参考,在实际使用时请替换为真实的邮箱服务器配置和账户信息。

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/go-gomail-mail/

备用原文链接: https://blog.fiveyoboy.com/articles/go-gomail-mail/