update: 2026-03-28 20:59
This commit is contained in:
65
infogenie-backend-go/internal/service/email.go
Normal file
65
infogenie-backend-go/internal/service/email.go
Normal file
@@ -0,0 +1,65 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user