Files
new-api/common/email.go

90 lines
2.3 KiB
Go
Raw Normal View History

2023-04-22 20:39:27 +08:00
package common
import (
2023-05-13 18:57:27 +08:00
"crypto/tls"
2023-05-13 21:41:52 +08:00
"encoding/base64"
"fmt"
"net/smtp"
"strings"
2023-12-13 16:51:19 +08:00
"time"
)
2023-04-22 20:39:27 +08:00
2024-12-04 22:08:47 +08:00
func generateMessageID() (string, error) {
2024-12-07 00:14:46 +08:00
split := strings.Split(SMTPFrom, "@")
2024-12-04 22:08:47 +08:00
if len(split) < 2 {
return "", fmt.Errorf("invalid SMTP account")
}
2024-12-07 00:14:46 +08:00
domain := strings.Split(SMTPFrom, "@")[1]
2024-12-04 22:08:47 +08:00
return fmt.Sprintf("<%d.%s@%s>", time.Now().UnixNano(), GetRandomString(12), domain), nil
2024-08-16 16:16:38 +08:00
}
2023-04-22 20:39:27 +08:00
func SendEmail(subject string, receiver string, content string) error {
2024-12-07 00:14:46 +08:00
if SMTPFrom == "" { // for compatibility
SMTPFrom = SMTPAccount
}
2024-12-04 22:08:47 +08:00
id, err2 := generateMessageID()
if err2 != nil {
return err2
}
2024-09-04 19:44:29 +08:00
if SMTPServer == "" && SMTPAccount == "" {
return fmt.Errorf("SMTP 服务器未配置")
}
2023-05-13 21:41:52 +08:00
encodedSubject := fmt.Sprintf("=?UTF-8?B?%s?=", base64.StdEncoding.EncodeToString([]byte(subject)))
mail := []byte(fmt.Sprintf("To: %s\r\n"+
"From: %s<%s>\r\n"+
"Subject: %s\r\n"+
2023-12-13 16:51:19 +08:00
"Date: %s\r\n"+
2024-08-16 16:16:38 +08:00
"Message-ID: %s\r\n"+ // 添加 Message-ID 头
"Content-Type: text/html; charset=UTF-8\r\n\r\n%s\r\n",
2024-12-04 22:08:47 +08:00
receiver, SystemName, SMTPFrom, encodedSubject, time.Now().Format(time.RFC1123Z), id, content))
auth := smtp.PlainAuth("", SMTPAccount, SMTPToken, SMTPServer)
addr := fmt.Sprintf("%s:%d", SMTPServer, SMTPPort)
to := strings.Split(receiver, ";")
2023-05-13 18:57:27 +08:00
var err error
2024-03-28 12:18:11 +08:00
if SMTPPort == 465 || SMTPSSLEnabled {
2023-05-13 18:57:27 +08:00
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: SMTPServer,
}
conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", SMTPServer, SMTPPort), tlsConfig)
if err != nil {
return err
}
client, err := smtp.NewClient(conn, SMTPServer)
if err != nil {
return err
}
defer client.Close()
if err = client.Auth(auth); err != nil {
return err
}
if err = client.Mail(SMTPFrom); err != nil {
return err
}
receiverEmails := strings.Split(receiver, ";")
for _, receiver := range receiverEmails {
if err = client.Rcpt(receiver); err != nil {
return err
}
}
w, err := client.Data()
if err != nil {
return err
}
_, err = w.Write(mail)
if err != nil {
return err
}
err = w.Close()
if err != nil {
return err
}
2024-12-07 00:14:46 +08:00
} else if isOutlookServer(SMTPAccount) || SMTPServer == "smtp.azurecomm.net" {
auth = LoginAuth(SMTPAccount, SMTPToken)
2024-12-07 00:14:46 +08:00
err = smtp.SendMail(addr, auth, SMTPFrom, to, mail)
2023-05-13 18:57:27 +08:00
} else {
2024-12-07 00:14:46 +08:00
err = smtp.SendMail(addr, auth, SMTPFrom, to, mail)
2023-05-13 18:57:27 +08:00
}
2023-04-22 20:39:27 +08:00
return err
}