Mailkit.Net 挂在 smtpClient.ConnectAsync() 上,在任务超时之前不会引发异常

Kar*_*ťan 1 c# mailkit .net-core asp.net-core

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

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);
}
Run Code Online (Sandbox Code Playgroud)

每次在 ConnectAsync() 方法中都会发生错误,但是,它不会抛出任何异常,只是在该方法中冻结一段时间(大约一分钟),然后它只是抛出任务已取消,没有任何 mailkit 特定的信息。

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

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

jst*_*ast 6

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

await smtpClient.ConnectAsync(Options.SmtpServer, Options.Port, MailKit.Security.SecureSocketOptions.None);
Run Code Online (Sandbox Code Playgroud)

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

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

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