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

Unable to send email from Office 365 using c# SmtpClient

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

我检查过的东西都在适当的地方

  • 启用S??Sl
  • 来自电子邮件和用户电子邮件是相同的
  • 587端口
  • 我有这个帐户,前景很好
  • 防火墙没有阻止此端口。我还有其他代码使用与非O365主机完全相同的代码,并且工作正常
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
                var userName ="[email protected]";
                var password ="password";
                var msg = new MailMessage();
                msg.To.Add(new MailAddress("[email protected]"));
                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期间发送匿名邮件

    邮件工具包的实施(建议vasily.sib)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    var message = new MimeMessage();
            message.From.Add(new MailboxAddress("Test User","[email protected]"));
            message.To.Add(new MailboxAddress("Gmail User","[email protected]"));
            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("[email protected]","password"); // this is where it fails with Authentication Failure

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

    邮件工具包日志输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    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阻止了它的发生。关闭它,它起作用了