C#使用Office 365发送邮件出现5.7.57错误问题咨询
报错原因
你遇到的5.7.139错误是Office 365租户默认禁用了SMTP身份验证(SMTP AUTH)功能导致的,同时.NET官方已经标记SmtpClient类为过时类型,不推荐在生产环境使用。
解决方法
方案1:启用SMTP AUTH(仅适合测试场景,生产不推荐)
该方案可以兼容你现有的SmtpClient代码,操作步骤如下:
- 登录Microsoft 365管理中心,进入Exchange管理中心
- 依次选择「收件人」>「邮箱」,找到发件账号
admin@xxxxxxxx.in - 进入账号详情页,点击「邮件」选项卡,找到「电子邮件应用」板块的「管理电子邮件应用」
- 勾选「经过身份验证的SMTP」选项后保存配置
- 你也可以通过Exchange Online PowerShell命令单独给该账号开启权限:
Set-CASMailbox -Identity admin@xxxxxxxx.in -SmtpClientAuthenticationDisabled $false - 注意:Office 365 SMTP服务仅支持587端口配合STARTTLS使用,你代码中的465端口并不被官方支持,需要修改代码为
client.Port = 587;
方案2:使用Microsoft Graph API发邮件(生产环境首选)
这是微软官方推荐的邮件发送方案,无需开启SMTP AUTH,安全性和稳定性更高,操作步骤如下:
- 在Azure Active Directory中注册应用,为应用授予
Mail.Send的API权限(可根据业务场景选择委托权限或应用权限),完成权限授予后获取租户ID、应用客户端ID、客户端密钥 - 安装NuGet依赖包:
Microsoft.Graph、Azure.Identity - 参考如下示例代码实现邮件发送:
using Azure.Identity; using Microsoft.Graph; using Microsoft.Graph.Models; using Microsoft.Graph.Users.Item.SendMail; // 初始化Graph服务客户端 var scopes = new[] { "https://graph.microsoft.com/.default" }; var tenantId = "你的Azure AD租户ID"; var clientId = "你注册的应用客户端ID"; var clientSecret = "你注册的应用客户端密钥"; var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); var graphClient = new GraphServiceClient(credential, scopes); // 构造邮件内容 var message = new Message { Subject = "Test Subject", Body = new ItemBody { ContentType = BodyType.Html, Content = "Testing Office365 Email" }, ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "sales@xxxxxxxx.in" } } } }; // 发送邮件 var sendRequest = new SendMailPostRequestBody { Message = message, SaveToSentItems = true }; await graphClient.Users["admin@xxxxxxxx.in"].SendMail.PostAsync(sendRequest);
内容的提问来源于stack exchange,提问作者Doraikumar
相关产品推荐
相关产品推荐

