HangFire 排队的电子邮件 "Succeeding" 但未发送

HangFire Queued Emails "Succeeding" But not Sending

不使用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)
        );

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

感谢大家的帮助。

编辑:

仍有更好的选择。但是我确实找到了一个厚颜无耻的工作。我能够通过创建一种方法来实现这一点,该方法将 post 请求发送到页面以实际发送电子邮件。而 Hangfire 只是激活 post 请求。

编辑:NVM 解决方法是误报,因为测试中留下了额外的一行

WebMail class 旨在用于 ASP.NET 网页上下文。当在该上下文之外使用时,它可能没有所需的一切,因此您将得到一个 NullReferenceException。

而是使用 SmtpClient class。