【问题标题】:What should i know about sending emails in a background thread? ASP.NET关于在后台线程中发送电子邮件我应该知道什么? ASP.NET
【发布时间】:2011-01-07 13:37:05
【问题描述】:

我有一个在后台运行的线程,当有东西唤醒它时,它会休眠并从数据库中提取数据。我正在使用 SmtpClient(下面的代码)使用谷歌应用程序发送电子邮件。

我想知道有什么我需要注意的吗?我计划一次只发送一封电子邮件(注册或忘记密码的电子邮件)。我有点担心会发生一些事情,比如一封无效的电子邮件会锁定线程,因为我没有设置超时,或者谷歌应用程序碰巧完成并导致应用程序崩溃。我应该注意什么?我应该问我应该如何测试?

        var client = new SmtpClient("smtp.gmail.com", 587)
        {
            Credentials = new NetworkCredential(fromAddr, pass),
            EnableSsl = true
        };
        MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
        mail.IsBodyHtml = true;
        client.Send(mail);

【问题讨论】:

  • 有什么原因你不能从唤醒它的“触发”发生的地方调用这个逻辑。如果您尝试发送密码重置但它失败了,作为用户,我可能想知道这一点并看到一个很好的错误,说明它失败了,所以我不会坐下来刷新我的收件箱等待它。处理用户请求和发送所有请求的轻微延迟可能值得消除必须发出信号的复杂性。

标签: c# asp.net email smtp google-apps


【解决方案1】:

如果您使用的是 IIS。在您的服务器上安装 SMTP 并将所有邮件发送到 localhost。这样,如果电子邮件没有立即通过,SMTP 服务器会将电子邮件排队而不是挂起您的应用程序。

您需要配置 SMTP 服务器以将 gmail 用作智能主机。如果您需要有关如何配置的更多信息,请告诉我。

【讨论】:

  • 这也是我的做法——它更快更可靠。如果您的任何收件人无效,或者他们的 SMTP 服务器已关闭,您将收到超时和/或引发异常。这样,IIS 会立即接受所有邮件,然后负责发送邮件,包括在失败时重试发送操作。
【解决方案2】:

您可以设置SmtpClientTimeout 属性,然后处理Send 调用引发的任何异常。然后它不会锁定线程,尽管您必须按照您认为合适的方式处理异常的原因。

【讨论】:

    【解决方案3】:

    在代码中添加 try/catch,就可以了。在最坏的情况下,它最终会超时。它不会永远运行,Google 也不会永远保持连接打开(事实上 SMTP 在超时方面是非常无情的......如果你很慢,它会终止连接)。

        try
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential(fromAddr, pass),
                EnableSsl = true
            };
            MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
            mail.IsBodyHtml = true;
            client.Send(mail);
        }
        catch
        {
            // do something
        }
    

    在测试方面...使用不同的 gMail 帐户。此外,您可能需要检查您每天发送电子邮件的限制。不确定 gMail 的号码是多少,但他们不只是让你发送你想发送多少。

    【讨论】:

    • -1:您几乎应该从不使用“catch{}”。它将隐藏所有异常。例外不会因为您看不到它们而消失。
    • 他确实说过 // 做点什么
    • -1??我没有抓住{}。我确实有一个评论让他们……做点什么。我怎么知道他们需要做什么?
    【解决方案4】:

    我假设这是在 ASP.Net 下完成的,因为它是标签之一。

    这个过程有多重要?如果您的环境允许,这可能是 Windows 服务而不是 ASP.Net 运行时的一个很好的候选对象。

    您提到您从数据库中提取数据并发送电子邮件。这些都不依赖于 ASP.Net。此外,服务可能会为您提供更好的线程、测试、日志记录和异步选项。

    如果您想坚持使用 ASP.Net 运行时,那么您也可以考虑使用Asynchronous Pages(如果您还没有的话)。这将允许您生成多个邮件线程并让您的主页线程等待结果。您还可以设置一个超时值,允许您取消和记录卡住的线程。我怀疑设置和处理异步超时将解决您的大部分担忧。这个解决方案至少可以让您的邮件从您的制作页面请求线程中发送出去。

    测试应该是直截了当的。您可以注册单独的 Google 帐户进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多