7

我有一个在后台运行的线程,当有东西唤醒它时,它会休眠并从数据库中提取数据。我正在使用 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);
4

4 回答 4

3

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

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

于 2010-01-21T08:45:30.870 回答
2

在代码中添加一个 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 的号码是多少,但他们不只是让你发送你想发送多少。

于 2010-01-21T04:56:18.367 回答
1

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

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

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

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

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

于 2010-01-21T03:29:14.767 回答
0

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

于 2010-01-21T05:02:50.460 回答