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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HangFire排队电子邮件“成功”但不发送相关的知识,希望对你有一定的参考价值。

我可以在不使用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解决方法是一个误报,因为测试中留下了额外的一行

答案

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

相反,使用SmtpClient类。

以上是关于HangFire排队电子邮件“成功”但不发送的主要内容,如果未能解决你的问题,请参考以下文章

Sendgrid 返回 202 但不发送电子邮件

hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)

如何访问失败的Hangfire作业

发送电子邮件的 Mandrill 问题:消息未发送:排队

在与排队的用户不同的进程中运行后台作业

所有通过邮戳发送的电子邮件都在邮戳服务器上排队