【问题标题】:Using MailKit to send through Outlook.com使用 MailKit 通过 Outlook.com 发送
【发布时间】:2019-07-03 17:56:31
【问题描述】:

我正在尝试使用 MailKit 通过我的 Outlook.com 电子邮件地址发送电子邮件。

我遵循了我在网上看到的所有示例,这就是我所拥有的:

public async Task SendEmailAsync(string email, string subject, string htmlmessage)
{
    var message = new MimeMessage();
    message.From.Add(new MailboxAddress("Service Account", "me@outlook.com"));
    message.To.Add(new MailboxAddress("First Last", email));
    message.Subject = subject;
    message.Body = new TextPart(TextFormat.Html)
    {
        Text = htmlMessage
    };

    using (var client = new SmtpClient())
    {
        //Have tried both false and true    
        client.Connect("smtp-mail.outlook.com", 587, false);
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.Authenticate("me@outlook.com", "mypassword");
        await client.SendAsync(message);
        client.Disconnect(true);
    }

    return;
}

如果我在client.Connect() 上将useSSL 参数设置为true,我会收到此错误:

An error occurred while attempting to establish an SSL or TLS connection

如果我将useSSL 参数设置为false,我会收到此错误:

AuthenticationException: AuthenticationInvalidCredentials: 5.7.3 Authentication unsuccessful

我做错了什么?

更新

根据@jstedfast 的建议添加了ProtocolLogger,结果如下:

Connected to smtp://smtp-mail.outlook.com:587/?starttls=when-available
S: 220 BN6PR11CA0009.outlook.office365.com Microsoft ESMTP MAIL Service ready at Sun, 10 Feb 2019 03:26:30 +0000
C: EHLO [192.168.1.12]
S: 250-BN6PR11CA0009.outlook.office365.com Hello [73.175.143.94]
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.1.12]
S: 250-BN6PR11CA0009.outlook.office365.com Hello [73.175.143.94]
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
S: 334 ************
C: ****************
S: 334 ************
C: ****************
S: 535 5.7.3 Authentication unsuccessful [BN6PR11CA0009.namprd11.prod.outlook.com]

顺便说一句,我用* 注释掉了一些东西。我不确定那是什么,是否敏感。

【问题讨论】:

    标签: asp.net-core mailkit outlook.com


    【解决方案1】:

    看起来好像代码本身可以工作。但是,请注意,如果您将帐户设置为需要 2FA,您将收到上面的错误消息,表明您的凭据无效。请务必禁用 2FA!

    【讨论】:

    • 那么 Pop3/SMTP 不支持 2FA?
    【解决方案2】:

    这样试试:

    client.Connect("smtp-mail.outlook.com", 587);
    client.UseDefaultCredentials = false;    
    client.Credentials = new System.Net.NetworkCredential(From, Password);
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.EnableSsl = true;
    

    你也可以试试client.ConnectType = SmtpConnectType.ConnectSSLAuto;


    对于 MailKit

    client.Connect("smtp-mail.outlook.com", 587, SecureSocketOptions.StartTls);
    client.Authenticate("me@outlook.com", "mypassword");
    

    【讨论】:

    • 您是在使用 MailKit 还是在使用 MS SmtpClient?我在 MailKit 客户端上没有看到任何 UseDefaultCredentials
    • 是的,这是默认设置。我将检查 mailkit 的等效配置。我会让你知道的
    • 尝试了您的 MailKit 示例并得到了这个 AuthenticationException: AuthenticationInvalidCredentials: 5.7.3 Authentication unsuccessful [BN6PR06CA0060.namprd06.prod.outlook.com] 我确实将我的凭据从我的代码剪切并粘贴到 Outlook.com 登录中,以验证我的凭据是否正确。
    • 您正在使用端口 578,这意味着 TLS 而不是 SSL (487)。你必须使用emailClient.Connect("smtp-mail.outlook.com", 587, MailKit.Security.SecureSocketOptions.StartTls);
    【解决方案3】:

    AuthenticationException 错误表示服务器拒绝您的用户名和/或密码。

    也许用户名应该是me 而不是me@outlook.com

    尝试获取协议日志并查看正在使用哪种类型的身份验证机制。

    https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog

    【讨论】:

    • 查看我的更新,结果来自ProtocolLogger。我不是任何 SMTP 方面的专家,所以日志对我来说意义不大。
    • * 输出的 2 个字符串(这很好,因为这是敏感信息)是 base64 编码的用户名和密码字符串。假设这些字符串是正确的,那么这意味着服务器不允许您的帐户进行身份验证。一些网络邮件服务器要求您首先从相同的 IP 地址通过网络登录。这可能是问题吗?如果不是这样,那么您可能需要在您的帐户设置中为您的帐户启用 SMTP(例如,GMail 需要这样做)。
    • 好电话!所以,是的,他们为Let devices and apps use POP 设置了一些设置——我必须设置这些设置。他们还显示了 SMTP 设置 Server name: smtp.office365.com, Port: 587, Encryption method: STARTTLS。我更新了我的设置以反映对服务器名称的更改,但我不确定如何处理加密方法。根据上面的输出,似乎发生了与 STARTTLS 相关的事情。
    • 您可以使用client.Connect (host, port, SecureSocketOptions.StartTls); 来强制执行 STARTTLS。默认情况下,传递falseSecureSocketOptions.StartTlsWhenAvailable 相同,顾名思义,只要服务器支持它就会升级到STARTTLS。
    • 所以我想我明白了。我在 Outlook 帐户上启用了 2FA。我还在 Gmail 上启用了它,并得到了同样的无效帐户错误。我在 Gmail 上禁用了 2FA 并发送电子邮件没问题。我猜它与 Outlook 相同。感谢您的所有帮助!
    【解决方案4】:

    我自己一直在为一个新的交换在线帐户(没有 2FA)而苦苦挣扎。该帐户是针对客户的,因此我没有在电子邮件客户端中配置该帐户。经过多次尝试,我将该帐户添加到我的 Outlook 客户端并发送了一封测试电子邮件。之后问题就解决了。希望这将有助于其他人解决问题。

    【讨论】:

      【解决方案5】:

      如果您遇到的问题是因为 2FA(2 因素身份验证),您应该转到 Microsoft 设置,在高级设置中,您可以在收到“应用密码”后请求“应用密码”,您应该使用它而不是您的电子邮件密码,对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 2018-01-05
        • 2023-03-18
        • 2017-04-30
        • 1970-01-01
        • 2020-11-05
        • 2016-10-17
        相关资源
        最近更新 更多