如何中止交付ActionMailer请求?

问题描述:

我正在运行Q &服务。管理员可以做的一件事就是将问题标记为偏离主题。当他们这样做时,一封电子邮件就会发送给提问他们的人,他们的电子邮件是不正确的。如何中止交付ActionMailer请求?

电子邮件通知经delayed_job的发送:

QuestionMailer.delay.notify_asker_of_offtopic_flag question 

然而,偶尔有人可能会意外地标记了一个问题,offtopic或改变自己的初衷。为了避免不正确的通知去谁最初问它的人,我想创建一个短延时和评估的问题是否仍然offtopic当邮件请求运行:

延迟调用梅勒:

QuestionMailer.delay(run_at: Time.now + 3.minutes).notify_asker_of_offtopic_flag(question) 

梅勒:

class QuestionMailer 
    ... 
    def notify_asker_of_offtopic_flag question 
    if question.offtopic? 
     # do mailing 
    end 
    end 
end 

可惜这不是那么简单,因为if块只是导致错误WHI ch然后导致delayed_job一次又一次地重试该作业。

我现在正在试验一些漂亮的迂回方法来达到同样的目的,但我真的很想找到一些方法来中止QuestionMailer操作而不会触发错误。这可能吗?

@Aditya的答案基本上是正确的,但是我想保留我的方法在Mailer对象上以保持事情的美观和整洁。这需要一些额外的黑客。

创建可与尝试取消一个实例梅勒方法来延迟

问题邮包一个新的类方法是,它本质上触发渲染和其他的东西,阻止被中止的方法。不过,我仍然想把所有的梅勒逻辑放在一起。

我这样做的方式是使用类方法而不是实例方法。这避免了所有上ActionMailer实例调用方法时,在踢挂钩的,但仍然让我保持代码的整洁,一起

class QuestionMailer 
    ... 
    def notify_asker_of_offtopic_flag question 
    ... 
    end 

    def self.notify_asker_of_offtopic_flag question_if question 
    if question.offtopic? 
     QuestionMailer.notify_asker_of_offtopic_flag question 
    end 
    end 
end 

NB修复使用延迟工作

这个工程除了对于需要处理delayed_job的一个轻微攻击。

在处理邮件程序时,delayed_job将始终在返回的对象上调用.deliver以传递邮件。当我们返回一个邮件对象时这很好,但在这种情况下,我们返回nil。因此,delayed_job尝试拨打.delivernil,一切都失败。

为了说明这一点,我们简单地返回包含欺骗.deliver方法的虚拟邮件对象:

class QuestionMailer 
    ... 
    class DummyMailer 
    def deliver 
     return true 
    end 
    end 

    def notify_asker_of_offtopic_flag question 
    # do mailing stuff 
    end 

    def self.notify_asker_of_offtopic_flag question_if question 
    if question.offtopic? 
     QuestionMailer.notify_asker_of_offtopic_flag question 
    else 
     DummyMailer.new 
    end 
    end 
end 

不要延迟邮件。可能会延迟Question类中的另一个类方法?传递问题的ID并在延迟的方法中检查问题是否仍然存在问题,如果是,则同步发送电子邮件。

本质上,您的notify_asker_of_offtopic_flag可以移动到您的问题模型,然后邮件是同步的(我相信您会重命名您的方法)。

有关于通过在您的邮件操作本身的内核中将perform_deliveries设置为false来防止交付的讨论,但我不是100%在哪里或如何最终结束。

+0

谢谢你提供的,非常有帮助。这是我正在考虑去的地方,但不确定是否有更清晰的方式 – 2012-07-27 10:02:51