c# - 页面发送邮件超时,即使发送了邮件

标签 c# asp.net-mvc email exchange-server postal

这个问题让我很困惑。这个问题可能需要迁移到 Server Fault,但是有一个编程组件,所以我想我会从那里开始。此外,我们的基础架构团队坚信在他们这边一切都很好,但这并不总是意味着什么。

无论如何,我有一个简单的 GET-POST-Redirect 操作,它使用 Postal nuget 包发送两封单独的电子邮件,然后再重定向到成功页面——非常基本的东西。该操作是异步的,我正在使用 Postal API 中的 await email.SendAsync()

提交表单后,第一封电子邮件立即进入我的收件箱,但代码在 await email.SendAsync() 行上停留了 15-20 秒,然后才继续下一行(在调试器中确认)。然后,它开始发送第二封电子邮件,它再次立即进入我的收件箱,并且代码再次卡在那条线上,无论是否成功发送,在移动到带有重定向的那一行之前持续 15-20 秒。在生产中,发送电子邮件后的这种延迟,结合两封电子邮件,导致连接在发送重定向响应之前重置。当然,我可以延长页面超时时间,但这并不能真正解决问题,因为用户在得到响应之前仍然会有一分钟的延迟。

我也尝试过仅使用 email.Send() 同步发送电子邮件,但发生了相同的行为。我查看了 Postal 的源代码,虽然它围绕 SMTPClient 做了一些自定义包装以发送异步电子邮件,但实际上除了使用同步 Send 方法发送标准的旧 C# 电子邮件之外别无其他。

它也没有绑定(bind)到运行站点的服务器,因为我可以在生产和本地调试时看到相同的行为(尽管都连接到同一个生产 Exchange 服务器)。

它的行为就像是在等待 Exchange 服务器发送某种“完成”响应,但据我对 SMTP 的了解,它并不是那样工作的。它应该只是将电子邮件发送到 SMTP 服务器并继续愉快地进行,相信 SMTP 服务器实际上会做它应该做的事情。

任何想法都将不胜感激,因为此时我什至不确定如何继续调试它。我还能测试或尝试什么?

更新

感谢@MichaelEvanchik 的尝试 Wireshark 的建议,我能够清楚地看到 Exchange 服务器实际上导致了 30 秒的延迟。它收到要发送的电子邮件的最后一部分,然后在 30 秒后最终以“已成功排队等待发送”来响应客户端。正是在这一点上,客户端最终退出并且代码恢复。所以,我要把它踢回到基础设施上。

更新#2

因此,很明显,连接器实际上有 30 秒的延迟,以确认电子邮件确实已发送,而不仅仅是排队等待发送。就我个人而言,我认为这首先打败了“排队等待交付”这一点,但无论如何,我不需要确认它实际上已发送,只需要它已被接收Exchange 服务器,因此基础架构正在消除延迟。

最佳答案

Wireshark 可能会提供一些线索。 =]

这就是如何继续调试,并会向您展示从 http 服务器到 SMTP 的所有情况。

关于c# - 页面发送邮件超时,即使发送了邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19797885/

相关文章:

c# - 使用 Regex 或 XmlParser 替换标签中未包含的文本

c# - C# 中词法分析器的示例

c# - 具有 protected 构造函数和工厂方法的对象列表的自动固定

c# - ASP.NET MVC C# : Object reference errors when going to view record details

linux - 具有两个域的配置 Postfix

c# - C# 的 VS 2008 VB 片段

asp.net-mvc - ASP.NET MVC - 模拟表单请求

c# - 有时想要序列化 ​​Json 包括 [JsonIgnore]

java jar文件读取图像文件

html - 如何删除 Outlook 中的链接下划线?