繁体   English   中英

无法使用 c# SmtpClient 从 Office 365 发送电子邮件

[英]Unable to send email from Office 365 using c# SmtpClient

尝试使用 SmtpClient 从我在 c# 中的 winforms 应用程序发送电子邮件。 通过这篇 MS 文章,它应该可以工作。 我搜索了许多论坛等,但没有找到任何解决方案。 该错误消息似乎表明客户端未通过身份验证。 密码是正确的,我已经以这个用户的身份登录了密码,没问题。 2FA 已开启,但 htis 不应该妨碍它吗?

我检查过的东西都到位了

  1. 启用 SSL
  2. 来自电子邮件和用户电子邮件是相同的
  3. 587端口
  4. 我在 Outlook 中有这个帐户,它发送得很好
  5. 防火墙没有阻止这个端口。 我有其他代码使用与非 O365 主机完全相同的代码,它工作得很好

代码

            var userName = "user@domain.onmicrosoft.com";
            var password = "password";
            var msg = new MailMessage();
            msg.To.Add(new MailAddress("user@gmail.com"));
            msg.From = new MailAddress(userName);
            msg.Subject = "Test Office 365 Account";
            msg.Body = "Testing email using Office 365 account.";
            msg.IsBodyHtml = true;

            var client = new SmtpClient{
                Host = "smtp.office365.com",
                Credentials = new System.Net.NetworkCredential(userName, password),
                Port = 587,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                EnableSsl = true
            };

            client.Send(msg);

例外

  • SMTP 服务器需要安全连接或客户端未通过身份验证。 服务器响应为:5.7.57 SMTP; 在 MAIL FROM 期间,客户端未通过身份验证发送匿名邮件

MAIL KIT 实现(建议 vasily.sib)

var message = new MimeMessage();
        message.From.Add(new MailboxAddress("Test User", "user@domain.onmicrosoft.com"));
        message.To.Add(new MailboxAddress("Gmail User", "testuser@gmail.com"));
        message.Subject = "test";

        message.Body = new TextPart("plain")
        {
            Text = @"test"
        };

        var client = new SmtpClient(new ProtocolLogger("imap.log"));


        // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;

        client.Connect("smtp.office365.com", 587, SecureSocketOptions.Auto); //this is fine and it connects

        var clientAuthenticationMechanisms = client.AuthenticationMechanisms;
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        // Note: only needed if the SMTP server requires authentication
        client.Authenticate("user@domain.onmicrosoft.com", "password"); // this is where it fails with Authentication Failure

        client.Send(message);
        client.Disconnect(true);

邮件套件日志输出

Connected to smtp://smtp.office365.com:587/?starttls=when-available
S: 220 SYCP282CA0015.outlook.office365.com Microsoft ESMTP MAIL Service ready at Mon, 25 Nov 2019 04:49:36 +0000
C: EHLO [192.168.2.50]
S: 250-SYCP282CA0015.outlook.office365.com Hello [58.6.92.82]
S: 250-SIZE 157286400
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-STARTTLS
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 SMTP server ready
C: EHLO [192.168.2.50]
S: 250-SYCP282CA0015.outlook.office365.com Hello [58.6.92.82]
S: 250-SIZE 157286400
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-AUTH LOGIN XOAUTH2
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250 SMTPUTF8
C: AUTH LOGIN
REMOVED BASE64 DATA (password, login)
S: 535 5.7.3 Authentication unsuccessful [SYCP282CA0015.AUSP282.PROD.OUTLOOK.COM]

解决了。 正是 2FA 阻止了它的发生。 关掉它,它起作用了

我今天遇到了同样的问题。 Office365 也需要 TLS 连接。 因此,您应该将以下代码添加到您的代码中

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM