C# 亚马逊工作邮件超时.net核心SmtpClient

C# 亚马逊工作邮件超时.net核心SmtpClient,c#,amazon-web-services,smtp,smtpclient,amazon-workmail,C#,Amazon Web Services,Smtp,Smtpclient,Amazon Workmail,我正在尝试使用.NET Core中的SmtpClient通过AWS WorkMail发送标准电子邮件。根据Amazon文档,配置非常标准: 设置被注入,SmtpClient被正确实例化,电子邮件的发送只是: var mail = new MailMessage { From = new MailAddress(_smtpSettings.FromAddress, _smtpSettings.SenderName),

我正在尝试使用.NET Core中的SmtpClient通过AWS WorkMail发送标准电子邮件。根据Amazon文档,配置非常标准:

设置被注入,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似乎存在问题。

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

如果您正在尝试此功能,那么使用标准SmtpClient将无法实现此功能,而且与Microsoft的通常情况一样,他们不认为这是一个问题。您可以尝试使用隧道,或者最好只使用其中一个可用的库。不幸的是,他们中的大多数都是付费的,虽然有AIM,但它不适用于.NETCore,我不想花时间将自己的库移植到.NET标准,所以我最终使用了Mailkit

不过,该库存在一些问题,首先,在发送之前,您必须调用以主机和端口为参数的Connect,这意味着您不能只将预制的smtpclient作为单例注入,而必须在使用位置对其进行实例化。这就是dope,没有接口也会使它不可修改,这可能会破坏您的集成测试。此外,在打电话给send之前,您必须先打一个难听的电话,就像这样:

emailClient.AuthenticationMechanisms.Remove("XOAUTH2");

但至少它是有效的。

只是添加到现有的注释中。SMTPClient实际上已过时/弃用,但未被标记为已过时/弃用。请参见此处的注释()

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


实际上,微软推出了MailKit,让人们在使用电子邮件时可以使用它。对于一些不想使用第三方库来实现这样一个“简单”和通用特性的开发人员来说,这是一件非常有趣的事情。就我个人的经验而言,我认为Mailkit非常好用。这里有一个关于启动和运行的快速指南:

您是否按照中的说明正确配置了SMTP网关?不,我没有这样做,但在这种情况下,网关地址和端口是什么?我为什么要这样做,我认为这是为了通过自己的smtp服务器重新路由流量,我只是想戳一下amazon默认的workmail端点,为meWell发送一封电子邮件,只是向那些文档提供建议,因为您正在超时。您还可以检查页面底部的SMTP连接示例。
emailClient.AuthenticationMechanisms.Remove("XOAUTH2");