Files
InfoGenie/infogenie-backend-go/internal/service/email.go
2026-03-28 20:59:52 +08:00

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()
}