Go 发送邮件的两种方式

发布于:2024-06-12 ⋅ 阅读:(140) ⋅ 点赞:(0)

1. 准备邮件内容

邮件内容通常包括发件人、收件人、邮件主题、邮件正文等信息。在Go中,邮件内容通常以明文形式提供,需要遵循一定的邮件格式规范。

2. 配置SMTP服务器

选择一个SMTP服务器来发送邮件。许多邮件服务提供商(如Google的Gmail、Microsoft的Outlook等)都提供了SMTP服务。你需要知道SMTP服务器的地址和端口号。

3.通过标准包net/smtp

package main

import (
	"fmt"
	"log"
	"net/mail"
	"net/smtp"
	"strconv"
	"strings"
)

func main() {
	// 邮件发送者、接收者、SMTP服务器配置
	fromAcc := "xxx@qq.com"
	fromUser := "xxx"
	password := "授权码" // 这不是你的邮箱密码,而是开启SMTP服务后获得的授权码
	smtpServer := "smtp.qq.com"
	smtpPort := 587 // 或465,具体取决于SMTP服务器配置
	// 构建认证信息
	auth := smtp.PlainAuth("", fromAcc, password, smtpServer)

	// 收发件人信息
	from := mail.Address{Name: fromUser, Address: fromAcc}
	to := mail.Address{Name: "收件人名称", Address: "收件人邮箱"}

	// 构建邮件头和正文
	headers := make(map[string]string)
	headers["From"] = from.String()
	headers["To"] = to.String()
	headers["Subject"] = "测试邮件"
	headers["MIME-Version"] = "1.0"
	headers["Content-Type"] = "text/plain; charset=UTF-8"

	var headerBuffer strings.Builder
	for k, v := range headers {
		headerBuffer.WriteString(k + ": " + v + "\r\n")
	}
	headerBuffer.WriteString("\r\n") // 空行分隔邮件头和邮件体
	body := "这是邮件的正文内容。"
	message := headerBuffer.String() + body

	// 发送邮件
	err := smtp.SendMail(smtpServer+":"+strconv.Itoa(smtpPort),
		auth,
		fromAcc,
		[]string{to.Address},
		[]byte(message))
	if err != nil {
		log.Fatalf("发送邮件失败: %v", err)
	}
	fmt.Println("发送邮件成功!")
}

4.通过第三方包gomail

package main

import (
	"crypto/tls"
	"fmt"
	"gopkg.in/gomail.v2"
	"log"
)

func main() {
	// 设置SMTP服务器配置
	mailer := gomail.NewMessage()
	mailer.SetHeader("From", "xxx@qq.com") // 发件人邮箱
	mailer.SetHeader("To", "收件人邮箱")        // 收件人邮箱
	mailer.SetHeader("Subject", "邮箱测试")
	mailer.SetBody("text/html", "邮件正文内容")

	// QQ邮箱SMTP服务器配置
	smtpHost := "smtp.qq.com"
	smtpPort := 587 // 465或587,根据邮箱服务商和是否使用SSL/TLS选择端口
	smtpUser := "xxx@qq.com"
	smtpPass := "授权码" // 这不是你的邮箱密码,而是开启SMTP服务后获得的授权码

	// 构建SMTP客户端
	dialer := gomail.NewDialer(smtpHost, smtpPort, smtpUser, smtpPass)
	dialer.TLSConfig = &tls.Config{InsecureSkipVerify: true} // 忽略证书校验,仅用于测试环境

	// 发送邮件
	if err := dialer.DialAndSend(mailer); err != nil {
		log.Fatal(err)
	}

	fmt.Println("邮件发送成功!")
}