使用 MailKit 通过 Outlook.com 发送
Using MailKit to send through Outlook.com
我正在尝试使用 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]
顺便说一句,我用 *
注释掉了一些东西。我不确定那是什么,是否敏感。
这样试试:
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");
AuthenticationException
错误表示服务器拒绝您的用户名and/or密码。
也许用户名应该是 me
而不是 me@outlook.com
?
尝试获取协议日志并查看正在使用的身份验证机制类型。
https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog
看起来好像代码本身有效。但是请注意,如果您已将帐户设置为需要 2FA,您将收到上面的错误消息,表明您的凭据无效。请务必禁用 2FA!
我自己一直在为一个新的 exchange 在线帐户(没有 2FA)而苦苦挣扎。该帐户用于客户,因此我没有在我的电子邮件客户端中配置该帐户。经过多次尝试后,我将该帐户添加到我的 Outlook 客户端并发送了一封测试电子邮件。之后问题就解决了。希望这会帮助其他人解决问题。
如果您遇到的问题是因为 2FA(双因素身份验证),您应该转到 Microsoft 设置,在高级设置中,您可以在收到“应用密码”后请求它,您应该使用它而不是您的电子邮件密码,对我有用。
我正在尝试使用 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]
顺便说一句,我用 *
注释掉了一些东西。我不确定那是什么,是否敏感。
这样试试:
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");
AuthenticationException
错误表示服务器拒绝您的用户名and/or密码。
也许用户名应该是 me
而不是 me@outlook.com
?
尝试获取协议日志并查看正在使用的身份验证机制类型。
https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog
看起来好像代码本身有效。但是请注意,如果您已将帐户设置为需要 2FA,您将收到上面的错误消息,表明您的凭据无效。请务必禁用 2FA!
我自己一直在为一个新的 exchange 在线帐户(没有 2FA)而苦苦挣扎。该帐户用于客户,因此我没有在我的电子邮件客户端中配置该帐户。经过多次尝试后,我将该帐户添加到我的 Outlook 客户端并发送了一封测试电子邮件。之后问题就解决了。希望这会帮助其他人解决问题。
如果您遇到的问题是因为 2FA(双因素身份验证),您应该转到 Microsoft 设置,在高级设置中,您可以在收到“应用密码”后请求它,您应该使用它而不是您的电子邮件密码,对我有用。