feat: add Docker deployment and Microsoft OAuth support
This commit is contained in:
66
mengpost-backend/services/microsoft.go
Normal file
66
mengpost-backend/services/microsoft.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"mengpost-backend/models"
|
||||
)
|
||||
|
||||
// 微软个人邮箱常见后缀(Outlook / Hotmail / Live 等).
|
||||
var microsoftConsumerSuffixes = []string{
|
||||
"@outlook.com",
|
||||
"@hotmail.com",
|
||||
"@live.com",
|
||||
"@msn.com",
|
||||
}
|
||||
|
||||
// IsMicrosoftConsumerEmail 判断是否为消费者微软邮箱(非 Exchange 自建域).
|
||||
func IsMicrosoftConsumerEmail(email string) bool {
|
||||
e := strings.ToLower(strings.TrimSpace(email))
|
||||
for _, suf := range microsoftConsumerSuffixes {
|
||||
if strings.HasSuffix(e, suf) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IMAPTLSConfig 为 IMAP TLS 握手提供 ServerName(微软等场景与证书一致).
|
||||
func IMAPTLSConfig(acc *models.Account) *tls.Config {
|
||||
if acc == nil || !acc.UseTLS {
|
||||
return nil
|
||||
}
|
||||
sn := acc.IMAPHost
|
||||
if IsMicrosoftConsumerEmail(acc.Email) && strings.EqualFold(acc.IMAPHost, "outlook.office365.com") {
|
||||
sn = "outlook.office365.com"
|
||||
}
|
||||
return &tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
ServerName: sn,
|
||||
}
|
||||
}
|
||||
|
||||
// SMTPTLSConfig 发信使用 587 STARTTLS 时校验证书(微软 smtp.office365.com).
|
||||
func SMTPTLSConfig(acc *models.Account) *tls.Config {
|
||||
if acc == nil || !IsMicrosoftConsumerEmail(acc.Email) {
|
||||
return nil
|
||||
}
|
||||
if strings.EqualFold(acc.SMTPHost, "smtp.office365.com") {
|
||||
return &tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
ServerName: "smtp.office365.com",
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// WrapMicrosoftMailErr 为微软邮箱附加常见配置说明(IMAP 开关、基础认证与 OAuth).
|
||||
func WrapMicrosoftMailErr(email string, err error) error {
|
||||
if err == nil || !IsMicrosoftConsumerEmail(email) {
|
||||
return err
|
||||
}
|
||||
hint := "(微软邮箱:网页端需开启 IMAP;OAuth 账户无需应用密码。若仍失败请检查令牌是否过期、Azure 权限是否含 IMAP。)"
|
||||
return fmt.Errorf("%w %s", err, hint)
|
||||
}
|
||||
Reference in New Issue
Block a user