0

我正在尝试使用 .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);

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

知道有什么问题吗?我已经在扯头发了。似乎是 AWS WorkMail 的问题。

4

2 回答 2

1

只需添加到现有评论。SMTPClient 实际上已过时/不推荐使用,但没有被标记为如此。在此处查看评论(https://github.com/dotnet/dotnet-api-docs/issues/2986#issuecomment-430805681

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

MailKit 实际上是由微软推动的,供人们在电子邮件方面使用。对于一些不想使用第三方库来实现如此“简单”和通用功能的开发人员来说,这非常重要。就我个人的经验而言,我认为 Mailkit 很棒而且超级好用。启动和运行的快速指南在这里:https ://dotnetcoretutorials.com/2017/11/02/using-mailkit-send-receive-email-asp-net-core/

于 2020-05-09T23:55:47.710 回答
0

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

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

但是,该库存在一些问题,首先,在发送之前,您必须调用以主机和端口为参数的 Connect,这意味着您不能仅将预制 smtpclient 作为单例注入,并且必须在使用位置实例化它。那是涂料,没有接口也使它不可模拟,这可能会破坏您的集成测试。此外,您必须在调用 send 之前做一条丑陋的线路,如下所示:

emailClient.AuthenticationMechanisms.Remove("XOAUTH2");

但至少它有效。

于 2020-05-09T23:46:16.847 回答