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