到目前为止,我很高兴使用类似于以下的方法连接到我的 Gmail 帐户:
public async Task<IEnumerable<MimeMessage>> GetMessagesAsync()
{
using var imapClient = new MailKit.Net.Imap.ImapClient();
var secureSocketOptions = SecureSocketOptions.Auto;
if (useSsl) secureSocketOptions = SecureSocketOptions.SslOnConnect;
await imapClient.ConnectAsync(host, port, secureSocketOptions);
await imapClient.AuthenticateAsync(login, password);
await imapClient.Inbox.OpenAsync(FolderAccess.ReadOnly);
var uids = await imapClient.Inbox.SearchAsync(SearchQuery.All);
var messages = new List<MimeMessage>();
foreach (var uid in uids)
messages.Add(await imapClient.Inbox.GetMessageAsync(uid));
imapClient.Disconnect(true);
return messages;
}
自 2022 年 5 月 30 日起,这不再可能,因为对“不太安全的应用程序”的支持已禁用:
为了确保您的帐户安全,从 2022 年 5 月 30 日起,Google 不再支持使用要求您仅使用用户名和密码登录 Google 帐户的第三方应用或设备。
现在如何将 Mailkit 与 Gmail 一起使用?
停用不太安全的应用程序会阻止您直接使用用户名和密码登录,但不会阻止您为应用程序生成特定密码。现在,您将使用为特定应用程序生成的密码登录,而不是使用 Google 密码登录。
解决方案很简单,不需要太多改变:
在您的 Google 帐户中启用两步验证。此步骤是必需的,因为 Google 只允许为启用了两步验证的帐户上的应用程序生成密码。
前往生成应用程序密码 (https://myaccount.google.com/apppasswords) 并为您的应用程序生成密码。
只需使用您的 gmail 用户名 (
[email protected]
) 和在 c#
应用程序中生成的密码即可。
您只需使用 gmail 的“应用程序密码”选项即可。
今天处理这个问题。只需转到 Gmail 帐户,然后转到管理您的 Google 帐户 > 安全。
从这里启用两步验证,完成后您将看到两步验证选项下出现“应用程序密码”选项。单击此按钮,命名您要使用的设备,然后将为您提供的生成的密码复制并粘贴到您的代码中,以代替您使用的旧密码。
我现在已经为我们的办公室打印机和 python 脚本完成了此操作,我必须自动将时间表发送给每个人。
访问 Google 帐户设置。 从左侧选择“安全”。 在“登录 Google”部分下,单击“两步验证”并按照提示启用它。 启用两步验证后,点击“应用程序密码”。系统可能会要求您重新输入密码。 在“应用程序密码”部分中,在“选择应用程序”下拉列表中选择“邮件”,然后在“选择设备”下拉列表中选择您正在使用的设备,然后单击“生成”。 Google 将为您生成一个新的 16 个字符的密码。您将在代码中使用此密码,而不是常规的 Google 密码。
public async Task SendEmailAsync(string email, string subject, string message)
{ var emailMessage = new MimeMessage();
emailMessage.From.Add(new MailboxAddress("Администрация сайта", "[email protected]"));
emailMessage.To.Add(new MailboxAddress("", email));
emailMessage.Subject = subject;
emailMessage.Body = new TextPart(MimeKit.Text.TextFormat.Html)
{
Text = message
};
using (var client = new SmtpClient())
{
await client.ConnectAsync("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("[email protected]", "app code");
await client.SendAsync(emailMessage);
await client.DisconnectAsync(true);
}
}