发送邮件(使用腾讯的IMAP/SMTP服务)

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