Mailkit.Net 挂在 smtpClient.ConnectAsync() 上,直到任务超时才抛出异常

Mailkit.Net hangs on smtpClient.ConnectAsync(), throws no exception until Task timeout

最近我 运行 在我们的一个旧应用程序中遇到了一个问题。突然之间,应用程序停止向其用户发送 registration/reset 密码电子邮件。经过一些调试,我发现原因是 Mailkit SmtpClient class 的一个奇怪行为。以下代码出现问题:

public async Task Execute(EmailMessage email)
{
    var mimeMessage = CreateMimeMessageFromEmailMessage(email);

    using var smtpClient = new SmtpClient();

    await smtpClient.ConnectAsync(Options.SmtpServer, Options.Port, MailKit.Security.SecureSocketOptions.None);
    await smtpClient.AuthenticateAsync(Options.Username, Options.Password);
    await smtpClient.SendAsync(mimeMessage);
    await smtpClient.DisconnectAsync(true);
}

每次在 ConnectAsync() 方法中都会发生错误,但是,它没有抛出任何异常,只是在此方法中冻结了一段时间(大约一分钟),然后它只是抛出了 Task canceled 而没有任何 mailkit 特定内容。

起初,我认为服务器地址、端口或安全选项可能有误,但我们在其他一些应用程序中使用了相同的设置(和相同的代码!),它们似乎工作正常。它也不应该是由我的 PC/network 配置中的某些内容引起的,因为其他开发人员在处理此程序时也会 运行 遇到同样的错误。我也尝试对不同的电子邮件使用选项,但错误仍然存​​在。

是否知道如何找到此错误的原因,如何在未抛出异常时调试问题等?

根据您的评论,当使用的端口为 465 时,以下行失败:

await smtpClient.ConnectAsync(Options.SmtpServer, Options.Port, MailKit.Security.SecureSocketOptions.None);

那是你的问题。您正在尝试使用端口 465,同时 使用 SecureSocketOptions.None

您需要使用 SecureSocketOptions.SslOnConnect 端口 465。

端口 465 是 SSL 端口,但您告诉 MailKit 连接并将其视为连接到纯文本端口。显然,那是行不通的。