使用 rake 任务时检查电子邮件是不是发送一次的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 rake 任务时检查电子邮件是不是发送一次的最佳方法是啥?【英文标题】:How is the best way to check if email was sent once when using rake task?使用 rake 任务时检查电子邮件是否发送一次的最佳方法是什么? 【发布时间】:2012-12-12 06:11:44 【问题描述】:

我有一个简单的邮件程序,它向用户发送每周摘要和 rake 任务,它向所有用户发送这封电子邮件,并且它被固定到 heroku 调度程序。

我想每周向用户发送这封电子邮件,但每周只发送一次,无论我运行多少次rake send_weekly_digest

邮递员

class DigestMailer < ActionMailer::Base
  include Resque::Mailer
  default from: "company@email.com"

  def weekly_digest(user_id)
    @user = User.find(user_id)

    mail :to => @user.email, :subject => "Weekly Digest"
  end
end

Rake 任务

desc "Send weekly email digest"
task send_weekly_digest: :environment do
  User.all.each do |user|
    DigestMailer.weekly_digest(user.id).deliver
  end
end

【问题讨论】:

【参考方案1】:

在您的用户表中添加一个名为 last_emailed_at 或类似名称的列,然后在您发送每周摘要时使用时间戳更新该列。

然后在你的 rake 任务中而不是说 User.all,只获取上周未通过电子邮件发送的用户:

User.where("last_emailed_at < ?", 1.week.ago)

【讨论】:

那么我应该在mail :to =&gt; @user.email, :subject =&gt; "Weekly Digest" 下方添加@user.last_emailed_at.touchDigestMailer 吗?有没有办法确保邮件真的送达了? 控制器中的顺序应该无关紧要,因为在调用交付之前不会发送电子邮件,所以我将它放在邮件之前:to => ...我不确定你的第二个问题。您必须相信 Rail 的交付方法会发送电子邮件。您可以在用户电子邮件上添加验证以检查无效的电子邮件:hello#ok,com,或编写 rake 任务的一些测试以确保它正确发送电子邮件。

以上是关于使用 rake 任务时检查电子邮件是不是发送一次的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何安排电子邮件发送

自动执行 rake 任务以在 heroku 上启动时运行?

如何从 rake 任务中提前返回?

Sidekiq 是不是按照发送给工作人员的顺序执行作业?

在rals中将rake任务迁移到Lambda

使用 Zend_Mail 时如何验证邮件是不是已发送?