Files
be.ems/lib/email/email.go
2025-07-02 17:22:35 +08:00

84 lines
2.2 KiB
Go

package email
import (
"crypto/tls"
"fmt"
"net/smtp"
"strconv"
"strings"
"gopkg.in/gomail.v2"
)
type EmailConfig struct {
Enabled bool `yaml:"enabled"` // 是否启用邮件发送
Host string `yaml:"host"`
Port int `yaml:"port"`
Username string `yaml:"username"`
Password string `yaml:"password"`
TLSSkipVerify bool `yaml:"tlsSkipVerify"`
From string `yaml:"from"`
To []string `yaml:"to"`
Subject string `yaml:"subject"`
Body string `yaml:"body"`
}
// 简单邮件发送函数
// 该函数使用标准库的 smtp 包发送邮件
// 注意:此函数不支持 TLS 加密,建议使用 gomail 包发送邮件以支持 TLS 和其他高级功能
// gomail 包的使用示例见 SendEmailWithGomail 函数
func SendEmail(email EmailConfig) error {
username := email.Username
from := email.From
password := email.Password
to := strings.Join(email.To, ",") // 将多个收件人用逗号连接
subject := email.Subject
body := email.Body
smtpHost := email.Host
smtpPort := email.Port
msg := "From: " + from + "\n" +
"To: " + to + "\n" +
"Subject: " + subject + "\n\n" +
body
auth := smtp.PlainAuth(from, username, password, smtpHost)
return smtp.SendMail(smtpHost+":"+strconv.Itoa(smtpPort), auth, from, []string{to}, []byte(msg))
}
func SendEmailWithGomail(email EmailConfig) error {
m := gomail.NewMessage()
m.SetHeader("From", email.From)
m.SetHeader("To", email.To...)
m.SetHeader("Subject", email.Subject)
m.SetBody("text/plain", email.Body)
d := gomail.NewDialer(email.Host, email.Port, email.Username, email.Password)
// 配置 TLS
d.TLSConfig = &tls.Config{
InsecureSkipVerify: email.TLSSkipVerify,
}
// gomail 会自动处理 STARTTLS
if err := d.DialAndSend(m); err != nil {
fmt.Printf("Failed to DialAndSend:%v", err)
return err
}
return nil
}
// RemoveDuplicateEmails 去除重复的邮箱地址
func RemoveDuplicateEmails(emails []string) []string {
emailMap := make(map[string]struct{})
var uniqueEmails []string
for _, email := range emails {
if _, exists := emailMap[email]; !exists {
emailMap[email] = struct{}{}
uniqueEmails = append(uniqueEmails, email)
}
}
return uniqueEmails
}