使用 Office 365 的 SmtpClient 速度极慢

Ove*_*ack 5 c# email asp.net-mvc

我正在开发 MVC5 网站。本网站包含“联系我们”表格,用户可以在其中联系网站支持。

问题是SendMailAsync 至少需要 10-13 秒才能完成(无附件),并且在此过程运行时,用户被卡住并等待服务器的响应 - 无论电子邮件是否成功发送。

这是我当前的 ActionResult 方法:

[HttpPost]
public async Task<ActionResult> Contact(MessageModel Model)
{
    //...
    await SendMessage(Model);
    //...
    return View();
}
Run Code Online (Sandbox Code Playgroud)

这是我负责发送电子邮件的方法:

private async Task SendMessage(MessageModel Model)
{
    var Message = new MailMessage();
    Message.From = ...;
    Message.To.Add(...);
    Message.Subject = ...;
    Message.IsBodyHtml = true;

    SmtpClient Client = new SmtpClient();
    Client.UseDefaultCredentials = false;
    Client.Credentials = ...;
    Client.Port = 587;
    Client.Host = "smtp.office365.com";
    Client.DeliveryMethod = SmtpDeliveryMethod.Network;
    Client.EnableSsl = true;

    await Client.SendMailAsync(Message);
}
Run Code Online (Sandbox Code Playgroud)

有没有更快的工作替代方案?我可以这样运行它:

await Task.Factory.StartNew(() => SendMessage(Model));
Run Code Online (Sandbox Code Playgroud)

该网站不会“卡住” 13 秒,响应将是即时的,但是,我无法向用户提供电子邮件是否成功发送的信息。

小智 1

我们最近在活动注册时遇到了类似的问题,每封电子邮件需要 4-5 秒,并且我们需要发送多封不同内容的邮件。客户的 IT 人员能够获得一台 .protection.outlook.com:25 服务器,该服务器接受在同一域上运行的非 ssl 流量,并且花费了 1-1.5 秒的时间。对于具有一些 UI 的客户端来说,这已经足够快了,可以显示我们正在处理。我们还尝试了本地服务器,只有大约 100 毫秒,但他们不想在他们的 DC 上运行该电子邮件服务。

由于我没有参与,所以我无法透露此 .protection.outlook.com 服务器的设置细节,但如果您不想依赖异步,则可能需要研究一下。