66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
package service
|
|
|
|
// 邮件服务模块
|
|
// SSO 重构后,验证码发送/验证已由认证中心处理
|
|
// 此文件仅保留通用工具函数,如有需要可用于未来的邮件通知功能
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"net/smtp"
|
|
|
|
"infogenie-backend/config"
|
|
)
|
|
|
|
// SendNotificationEmail 发送通知邮件(预留,供未来使用)
|
|
func SendNotificationEmail(to, subject, htmlBody string) error {
|
|
return sendSMTPMail(to, subject, htmlBody)
|
|
}
|
|
|
|
func sendSMTPMail(to, subject, htmlBody string) error {
|
|
cfg := config.Cfg.Mail
|
|
from := cfg.Username
|
|
|
|
headers := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\nMIME-Version: 1.0\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n",
|
|
from, to, subject)
|
|
msg := headers + htmlBody
|
|
|
|
addr := fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)
|
|
|
|
tlsConfig := &tls.Config{
|
|
ServerName: cfg.Host,
|
|
}
|
|
|
|
conn, err := tls.Dial("tcp", addr, tlsConfig)
|
|
if err != nil {
|
|
return fmt.Errorf("TLS连接失败: %w", err)
|
|
}
|
|
|
|
client, err := smtp.NewClient(conn, cfg.Host)
|
|
if err != nil {
|
|
return fmt.Errorf("SMTP客户端创建失败: %w", err)
|
|
}
|
|
defer client.Quit()
|
|
|
|
auth := smtp.PlainAuth("", cfg.Username, cfg.Password, cfg.Host)
|
|
if err := client.Auth(auth); err != nil {
|
|
return fmt.Errorf("SMTP认证失败: %w", err)
|
|
}
|
|
|
|
if err := client.Mail(from); err != nil {
|
|
return err
|
|
}
|
|
if err := client.Rcpt(to); err != nil {
|
|
return err
|
|
}
|
|
|
|
w, err := client.Data()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if _, err := w.Write([]byte(msg)); err != nil {
|
|
return err
|
|
}
|
|
return w.Close()
|
|
}
|