【问题标题】:Page times out sending emails, even though emails are sent页面超时发送电子邮件,即使发送了电子邮件
【发布时间】:2013-11-05 20:04:26
【问题描述】:

这个问题让我很困惑。这个问题可能需要迁移到 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# 电子邮件之外,几乎没有别的东西。

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

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

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

更新

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

更新 #2

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

【问题讨论】:

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


    【解决方案1】:

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

    这就是继续调试的方法,并将向您展示从 http 服务器到 SMTP 发生的一切。

    【讨论】:

    • 我没有对你投反对票,但如果我不得不猜测别人为什么投反对票,那就是你原来的答案非常简洁。即使您编辑的答案也不是很有帮助。我有足够的能力查找 Wireshark 并弄清楚如何自己使用它,但可能写过这个问题的其他人以及将来可能会看到这个问题的其他人可能不会。一个好的答案将提供更多细节,也许还有一些基本用法。在你因为别人对你投反对票而生气之前,深思熟虑。
    • 你写的好像你做了很多并且做了正确的事情,我认为这是最好的解决方案,接下来我将只要求wireshark转储文件
    • 别误会我的意思;这是一个很好的建议,我正在研究 Wireshark。我唯一的观点是,虽然你的回答是一个很好的建议,但它没有指导意义。就像我说的,它不会打扰我,但我对自己解决 Wireshark 的能力有足够的信心。然而,对于那些对发展缺乏信心或更环保的人来说,你的答案可能是“创建一个关于一切的统一理论”。一切都与观点有关,StackOverflow 鼓励迎合我们当中最少的人,而不是期望每个人都能自动理解。
    • 根据我的个人经验,我转发了上面相同的指令,只是为了感谢迈克尔!它在这里和这里向我展示了问题所在。我不能假设他知道如何嗅探数据包。如果我这样做是不公平的。我是wireshark的专家,我与它一起生活和死亡。我什至已经对协议进行了逆向工程,只是为了证明这是供应商问题。所以拍我作为啦啦队长,没有地方发表评论只有答案,如果你打电话给我的回复,我无法在我的回复中说出我的举止,那是肯定的,因为我是一个快乐的人
    • 克里斯很高兴你找到了答案,就像我说的,看起来你已经做了你能做的一切。您的答案将来自 2 个地方,这些人实际上遇到了上述问题或观察交通情况。我打算建议制作一个简单的套接字 SMTP 类,这样您就可以自己关闭套接字并发送非常简单的 SMTP 命令,但是您的 wireshark 工作打败了我。但是如果他们可以改变超时,那将是一种解决方法...... QUIT 和 socket.Close();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2011-09-16
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多