HangFire排队电子邮件“成功”但不发送

时间:2017-12-21 04:18:43

标签: c# html smtp hangfire system.web

我可以在不使用hangfire时使用该方法发送电子邮件。

当从hangfire调用该方法时,它显示为成功,但电子邮件不会发送。

BackgroundJob.Schedule(
    () => Email(Subject),
    TimeSpan.FromMinutes(1)
    );

public void Email(string Subject)
{
    try
    {
        //Initialize WebMail
        WebMail.SmtpServer = "relay.example.com";
        WebMail.SmtpPort = 587;
        WebMail.SmtpUseDefaultCredentials = false;
        WebMail.UserName = "xxxx";
        WebMail.Password = "xxxx";
        WebMail.From = "\"Reports\" <Reports@example.com>";

        //Send Email
        WebMail.Send(to: "client@example.com",
            subject: Subject,
            body: "Test Email"
        );
    }
    catch (Exception e)
    {
    }
}

为了安全起见,已删除用户名,密码和中继服务,以及实际的电子邮件地址。

我已经离开了try / catch块以查看是否有任何错误产生。 通常情况下,它会像以前一样成功,但偶尔会抛出以下错误。

System.NullReferenceException
Object reference not set to an instance of an object.

System.NullReferenceException: Object reference not set to an instance of an object.
at System.Web.WebPages.Scope.AspNetRequestScopeStorageProvider.get_RequestScopeInternal()
at System.Web.WebPages.Scope.AspNetRequestScopeStorageProvider.get_CurrentScope()
at System.Web.Helpers.WebMail.set_SmtpServer(String value)
at Email(String Subject)

然后我尝试了允许传递类型的版本。

BackgroundJob.Schedule<WebMail>(
        () => Email(Subject),
        TimeSpan.FromMinutes(1)
        );

然而,这会引发有关使用静态类型的编译器错误。

感谢任何帮助。

编辑:

仍然愿意接受更好的选择。但是我确实找到了一个厚脸皮的工作。我能够通过创建一个方法来触发页面实际发送电子邮件的方法来实现此功能。而Hangfire只会激活帖子请求。

编辑:由于测试中遗留了额外的一行,NVM解决方法是误报。

1 个答案:

答案 0 :(得分:1)

WebMail类旨在用于ASP.NET网页上下文中。在该上下文之外使用时,它可能没有它需要的所有内容,因此您将获得NullReferenceException。

相反,请使用SmtpClient类。