【问题标题】:SmtpClient.Send(MailMessage) times-out with large BCC list - C#带有大型密件抄送列表的 SmtpClient.Send(MailMessage) 超时 - C#
【发布时间】:2012-05-12 19:17:33
【问题描述】:

长期阅读,第一次提问。

向 110 个密件抄送收件人发送电子邮件时出现超时。

我正在尝试从一个网站向我运营其网站的俱乐部成员发送一封电子邮件。 我将自己添加为发件人和收件人,成员的电子邮件地址进入密件抄送列表。大约有110名成员。我使用发件人的用户名和密码对服务器进行身份验证。

我可以很好地准备 MailMessage,但是当我调用 SmtpClient.Send() 时它会超时,即使阈值为 10 分钟也是如此。 当收件人较少时,Send() 方法仍然需要很长时间(5-7 分钟),但会成功完成。 无论邮件或附件的大小如何,都会发生这种情况,即使没有附件也是如此。

我认为我的邮件服务器(在我的托管 Web 服务器上)以某种方式检查每个收件人电子邮件地址是否与外部系统(如垃圾邮件/黑名单)或每个收件人邮件服务器进行对比。

我的托管公司被难住了,他们发誓一切都好。

你知道我可以设置 StmpClient 或 MailMessage 上的一个成员来告诉邮件服务器不要这样做吗?或者也许(甚至更好)在 Parallels HSPhre 电子邮件服务器中设置以停止此操作?

提前非常感谢。

示例代码

bool SendEmail(string[] emailAddresses)
{
    MailMessage message = new MailMessage();
    SmtpClient smtp = new SmtpClient("mail.myServer.org");
    message.From = new MailAddress("website@myServer.org", "Display name");
    message.To.Add("website@myServer.org");

    foreach (string recipient in emailAddresses)
    {
        // ABout 110 recipients
        message.Bcc.Add(recipient);
    }

    message.Subject = "Whatever";
    message.ReplyTo = new MailAddress("myOtherEmailAddress@external.com");
    smtp.Credentials = new NetworkCredential(message.From.Address, "whatever");

    try
    {
        message.Body = "A few hundred bytes";
        smtp.Timeout = 300000; // 10 mins
        smtp.Send(message);
    }
    catch (Exception ex)
    {
        // Report here
    }

    return true;
}

【问题讨论】:

  • 如果您使用标准邮件客户端(例如,ISP 的 webmail 客户端)发送带有一堆密件抄送地址的邮件,是否需要同样长的时间?
  • 吉姆,我从来没有注意到它这样做,但我以前从未发送过这么多。下次我发布公告时,我将使用包含 110 项密件抄送列表的托管网络邮件并进行比较。很好的建议,谢谢。
  • smtp.Timeout = 300000; // 10 分钟。现在是 5 分钟而不是 10 分钟。

标签: c# email timeout smtp bcc


【解决方案1】:

解决这个问题的方法是 DNS 检查。我的出站电子邮件服务器获取收件人列表中的每个地址,并尝试在 DNS 中查找其域的 MX 记录。
对于 110 个地址,有几个得分不同的域,并且这种查找需要很长时间。 它做到了 While-U-Wait,或者我的浏览器放弃了在网络服务器上的等待,或者网络服务器放弃了在邮件服务器上的等待(现在不记得是哪个了)。

我的提供商已禁用此选项。

在等待他们确认问题的同时,我通过以下方式解决了它。我没有发送一封包含 110 个收件人的电子邮件,而是将我想要发送的内容的详细信息存储在两个表中 - 一行用于正文,另外 110 行用于收件人。然后另一个 ASP 页面轮询该表,一次选择 10 封排队的电子邮件,发送它们,并打印 HTML 以在几秒钟后自行刷新。在一个页面中创建了我的行后,我单击了发送页面并在批处理时等待了几分钟。总时间是相同的,可能更多,但较小的批次意味着没有超时。

希望对下一个人有所帮助。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 2013-12-22
    • 2011-12-26
    • 2012-07-05
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2015-12-19
    • 2015-03-27
    相关资源
    最近更新 更多