Amazon WorkMail 超时 .net 核心 SmtpClient

Amazon WorkMail timeout .net core SmtpClient

我正在尝试使用 .NET Core 中的 SmtpClient 通过 AWS WorkMail 发送标准电子邮件。根据亚马逊文档,配置非常标准: https://docs.amazonaws.cn/en_us/general/latest/gr/workmail.html

  "Smtp": {
    "MailServer": "smtp.mail.eu-west-1.awsapps.com",
    "MailPort": "465",
    "SenderName": "Us us us",
    "FromAddress": "email@domain.com",
    "Username": "email@domain.com",
    "Password": "Password1$",
    "EnableSsl": "true"
  },

设置已注入,SmtpClient 已正确实例化,电子邮件的发送只是:

        var mail = new MailMessage
        {
            From = new MailAddress(_smtpSettings.FromAddress, _smtpSettings.SenderName),
            SubjectEncoding = Encoding.UTF8,
            BodyEncoding = Encoding.UTF8,
            IsBodyHtml = true,
            Body = message,
            Subject = subject,
            Priority = MailPriority.High
        };
        mail.To.Add(new MailAddress(sendToEmail));

        _smtpClient.Send(mail);

遗憾的是,发送总是因网关超时而失败。我们尝试将 587 切换为 STARTTLS 并提供不带域 (@) 的用户名。发送服务器安装了正确的 SSL 证书,邮件服务器正是我们拥有 smtp 的服务器。虽然这不是一个相关的解决方案,但我还将超时增加到 10 秒(尽管这不是一个解决方案)。

知道哪里出了问题吗?我已经在撕扯我的头发了。似乎是 AWS WorkMail 的问题。

所以问题是默认的 .NET Core SmtpClient 不支持 StartSSL(隐式 SSL),这是 WorkMail 唯一接受的选项。你看,WorkMail 只允许从 SSL 开始的连接,而 SmtpClient 首先从未加密开始,然后在无法连接时切换到加密。

如果您正在尝试这样做,您将无法使用标准 SmtpClient 使其正常工作,并且与 Microsoft 的通常情况一样,他们不认为这是一个问题。您可以尝试隧道或更好地使用可用库之一。可悲的是,它们中的大多数都是付费的,有 AIM,但它不适用于 .NET Core,而且我不想花时间将我自己的库移植到 .NET Standard,所以我最终使用了 Mailkit。

虽然这个库有一些问题,首先,在发送之前你必须调用以主机和端口为参数的连接,这意味着你不能只将预制的 smtpclient 作为单例注入并且必须在用法。那太棒了,没有界面也使它无法模拟,这可能会破坏您的集成测试。此外,在调用 send 之前你必须做一个丑陋的行:

emailClient.AuthenticationMechanisms.Remove("XOAUTH2");

但至少它有效。

只是添加到现有评论中。 SMTPClient 实际上是 obsolete/deprecated 但没有被标记为如此。在此处查看评论 (https://github.com/dotnet/dotnet-api-docs/issues/2986#issuecomment-430805681)

本质上它归结为 SmtpClient 多年未更新并且缺少许多功能。 .NET Core 团队希望将其标记为过时,但一些开发人员的现有项目已启用 "Warnings as Errors"。它会立即使任何使用带有警告的 SmtpClient 的项目突然停止构建。所以......它有点被弃用,但在一些官方文档中没有被标记为如此。

MailKit实际上是被微软全面推动的,以供人们在使用电子邮件时使用。对于一些不想为这样的 "simple" 和通用功能使用第三方库的开发人员来说,这让他们很生气。就我个人的经验而言,我认为 Mailkit 很棒而且非常易于使用。起床和 运行 的快速指南在这里:https://dotnetcoretutorials.com/2017/11/02/using-mailkit-send-receive-email-asp-net-core/