目录

Go语言使用gomail包发送邮件

一、快速入门

go get 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, "user", "password")
    
    // 发送邮件
    if err := d.DialAndSend(m); err != nil {
        panic(err)
    }
}

二、发送 html 邮件

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", `<h1>你好,我是五岁小孩</h1>
        <p>我正在测试使用gomail发送邮件</p>`)

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

三、发送附件邮件

func sendTicket(email string) error {
    m := gomail.NewMessage()
    
    // 设置发件人别名
    m.SetAddressHeader("From", "support@company.com", "技术支持中心")
    
    // 添加附件(支持多个)
    m.Attach("/var/logs/ticket_12345.log",
        gomail.Rename("问题日志.log"),
        gomail.SetHeader(map[string][]string{
            "Content-ID": {"<logfile>"},
        }),
    )
    
    // 嵌入图片到HTML
    m.Embed("logo.png", gomail.Rename("company_logo"))
    m.SetBody("text/html", `<img src=""> 
        您的问题已受理,日志见附件`)

    return dialer.DialAndSend(m)
}

四、完整代码

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
  }

常见问题

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

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

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

2. 发送报错?

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

3. 发送邮件有限制吗?

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

次,一天多少次