将smtp.go转换为gomail.v2实现以解决StartTLS相关问题

This commit is contained in:
Oganneson 2024-11-26 04:00:05 +08:00
parent a2bc3f470b
commit c85898ebc8
No known key found for this signature in database
GPG Key ID: 343FC4256C7BA76A
3 changed files with 30 additions and 18 deletions

4
go.mod
View File

@ -15,6 +15,7 @@ require (
github.com/google/uuid v1.3.1 github.com/google/uuid v1.3.1
github.com/gorilla/websocket v1.5.0 github.com/gorilla/websocket v1.5.0
github.com/lukasjarosch/go-docx v0.4.7 github.com/lukasjarosch/go-docx v0.4.7
github.com/mattn/go-sqlite3 v1.14.22
github.com/natefinch/lumberjack v2.0.0+incompatible github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/pkoukk/tiktoken-go v0.1.6 github.com/pkoukk/tiktoken-go v0.1.6
github.com/russross/blackfriday/v2 v2.1.0 github.com/russross/blackfriday/v2 v2.1.0
@ -22,7 +23,7 @@ require (
github.com/spf13/viper v1.16.0 github.com/spf13/viper v1.16.0
github.com/volcengine/volc-sdk-golang v1.0.127 github.com/volcengine/volc-sdk-golang v1.0.127
golang.org/x/net v0.15.0 golang.org/x/net v0.15.0
gopkg.in/mail.v2 v2.3.1 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
) )
require ( require (
@ -53,7 +54,6 @@ require (
github.com/leodido/go-urn v1.2.4 // indirect github.com/leodido/go-urn v1.2.4 // indirect
github.com/magiconair/properties v1.8.7 // indirect github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-sqlite3 v1.14.22 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect

4
go.sum
View File

@ -1018,10 +1018,10 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=

View File

@ -2,11 +2,11 @@ package utils
import ( import (
"bytes" "bytes"
"crypto/tls"
"fmt" "fmt"
"gopkg.in/gomail.v2"
"strings" "strings"
"text/template" "text/template"
"gopkg.in/mail.v2"
) )
type SmtpPoster struct { type SmtpPoster struct {
@ -38,34 +38,46 @@ func (s *SmtpPoster) SendMail(to string, subject string, body string) error {
return fmt.Errorf("smtp not configured properly") return fmt.Errorf("smtp not configured properly")
} }
var dialer *mail.Dialer // 创建 gomail 消息对象
var from string message := gomail.NewMessage()
// 根据用户名是否包含"@"来决定发件人地址
var from string
if strings.Contains(s.Username, "@") { if strings.Contains(s.Username, "@") {
dialer = mail.NewDialer(s.Host, s.Port, s.Username, s.Password) // 如果用户名包含"@", 则直接使用 From 作为发件人
from = s.From from = s.From
} else { } else {
dialer = mail.NewDialer(s.Host, s.Port, s.From, s.Password) // 否则,将用户名和 From 组合成发件人的邮箱地址
from = fmt.Sprintf("%s <%s>", s.Username, s.From) from = fmt.Sprintf("%s <%s>", s.Username, s.From)
} }
message := mail.NewMessage()
message.SetHeader("From", from) message.SetHeader("From", from)
message.SetHeader("To", to) message.SetHeader("To", to)
message.SetHeader("Subject", subject) message.SetHeader("Subject", subject)
message.SetBody("text/html", body) message.SetBody("text/html", body)
// 创建 gomail 拨号器
dialer := gomail.NewDialer(s.Host, s.Port, s.Username, s.Password)
// 如果启用TLS协议
if s.Protocol { if s.Protocol {
dialer.StartTLSPolicy = mail.MandatoryStartTLS dialer.TLSConfig = &tls.Config{
InsecureSkipVerify: false, // 禁用不安全的证书验证
ServerName: s.Host, // 设置ServerName为SMTP主机
}
} else { } else {
dialer.StartTLSPolicy = mail.NoStartTLS // 启用SSL时不需要STARTTLS直接进行加密连接
dialer.SSL = true
} }
// outlook STARTTLS policy adapter // 针对Outlook的STARTTLS策略适配器
if strings.Contains(s.Host, "outlook") { if strings.Contains(s.Host, "outlook") {
dialer.StartTLSPolicy = mail.MandatoryStartTLS dialer.TLSConfig = &tls.Config{
InsecureSkipVerify: false,
ServerName: s.Host,
}
} }
// 拨号并发送邮件
if err := dialer.DialAndSend(message); err != nil { if err := dialer.DialAndSend(message); err != nil {
return fmt.Errorf("sent mail failed: %s", err.Error()) return fmt.Errorf("sent mail failed: %s", err.Error())
} }