package main import ( "fmt" "net/smtp" "strings" ) // ========== 以下变量请根据实际情况设置·开始 ==========// var from = "*********@qq.com" // 发件人邮箱 var password = "****************" // 授权码(注:不是发件人邮箱的登录密码) var addr = "smtp.qq.com:25" // SMTP服务器地址 //========== 以下变量请根据实际情况设置·结束 ==========// // SendMailBatch 发送邮件(使用腾讯的IMAP/SMTP服务) // @param to string 收件人邮箱,多个邮箱之间用“;”隔开 // @param subject string 邮件标题 // @param body string 邮件正文 // @param bodyType string 邮件正文格式,可选值:html|plain func SendMailBatch(to string, subject string, body string, bodyType string) error { // 开始鉴权 host := strings.Split(addr, ":")[0] // 从“域名:端口号”中提取出域名部分 auth := smtp.PlainAuth("", from, password, host) // 邮件格式处理 var contentType string if bodyType == "html" { contentType = "text/html; charset=utf-8" // 邮件格式为HTML } else { contentType = "text/plain; charset=utf-8" // 邮件格式为纯文本 } // 多个收件人邮箱处理,一次过这些收件人邮箱发送邮件 toSlice := strings.Split(to, ";") var builder strings.Builder builder.WriteString(fmt.Sprintf("To: %s \n", to)) // 收件人邮箱 builder.WriteString(fmt.Sprintf("From: %s<%s> \n", from, from)) // 发件人邮箱 builder.WriteString(fmt.Sprintf("Subject: %s \n", subject)) // 邮件标题 builder.WriteString(fmt.Sprintf("Content-Type: %s \n", contentType)) // 内容类型 builder.WriteString(fmt.Sprintf("%s", body)) // 邮件正文 msg := []byte(builder.String()) return smtp.SendMail(addr, auth, from, toSlice, msg) } // SendMailSingle 发送邮件(使用腾讯的IMAP/SMTP服务) // @param to string 收件人邮箱,多个邮箱之间用“;”隔开 // @param subject string 邮件标题 // @param body string 邮件正文 // @param bodyType string 邮件正文格式,可选值:html|plain func SendMailSingle(to string, subject string, body string, bodyType string) (int, int) { // 开始鉴权 host := strings.Split(addr, ":")[0] // 从“域名:端口号”中提取出域名部分 auth := smtp.PlainAuth("", from, password, host) // 邮件格式处理 var contentType string if bodyType == "html" { contentType = "text/html; charset=utf-8" // 邮件格式为HTML } else { contentType = "text/plain; charset=utf-8" // 邮件格式为纯文本 } success := 0 // 发送成功数 fail := 0 // 发送失败数 // 遍历收件人邮箱,单独向每个收件人邮箱发送邮件 toSlice := strings.Split(to, ";") for _, mail := range toSlice { var builder strings.Builder builder.WriteString(fmt.Sprintf("To: %s \n", mail)) // 收件人邮箱 builder.WriteString(fmt.Sprintf("From: %s<%s> \n", from, from)) // 发件人邮箱 builder.WriteString(fmt.Sprintf("Subject: %s \n", subject)) // 邮件标题 builder.WriteString(fmt.Sprintf("Content-Type: %s \n", contentType)) // 内容类型 builder.WriteString(fmt.Sprintf("%s", body)) // 邮件正文 msg := []byte(builder.String()) err := smtp.SendMail(addr, auth, from, []string{mail}, msg) if err != nil { fmt.Printf("向 %+v 发送邮件失败,原因:%+v \n", mail, err.Error()) fail++ } else { fmt.Printf("向 %+v 发送邮件成功 \n", mail) success++ } } return success, fail } func main() { to := "zhangsan@126.com;lisi@qq.com" // 收件人邮箱,多个邮箱之间用“;”隔开 subject := "这是邮件标题" // 邮件标题 // 邮件正文(可使用HTML代码) body := ` <!doctype html> <html> <head> <meta charset="utf-8"> </head> <body> 这是<b style="color:#f00;">邮件</b>正文 </body> </html> ` fmt.Println("正在发送邮件") err := SendMailBatch(to, subject, body, "html") if err != nil { fmt.Println("邮件发送失败:原因:" + err.Error()) } else { fmt.Println("邮件发送成功") } fmt.Println("正在发送邮件") success, fail := SendMailSingle(to, subject, body, "html") fmt.Printf("发送完毕,成功:%+v,失败:%+v \n", success, fail) } //========== 说明 ==========// // 1、需要登录发件人QQ邮箱开启“IMAP/SMTP服务”才能发送邮件。 // 2、SendMailBatch()和SendMailSingle()都支持向多人发送邮件,不同点在于SendMailBatch()只请求一次SMTP服务器,而SendMailSingle()会 // 遍历收件人邮箱,然后每个邮箱都请求一次SMTP服务器实现单独发送。之所以写两种方式是因为SendMailBatch()的方式有个缺点,就是收 // 件人可以看到其他收件人的邮箱,而SendMailSingle()是针对每个邮箱单独发,看不到其他收件人的邮箱。当然,只请求一次SMTP服务器在 // 性能上肯定优于多次请求,可根据实际情况选择使用哪种方式。
Copyright © 2024 码农人生. All Rights Reserved