在 Rails 应用程序中发送自动电子邮件

Posted

技术标签:

【中文标题】在 Rails 应用程序中发送自动电子邮件【英文标题】:Sending automatic mails in a Rails app 【发布时间】:2013-02-04 17:34:30 【问题描述】:

在我的 rails 应用程序中,用户可以订阅一些事件。我想在活动开始前 24 小时向用户发送邮件。

我不确定如何实现。耙子任务?是否有一些宝石或最佳实践可以遵循?

谢谢!

编辑:

我想我的 cron 必须每分钟运行一次才能获得 24 小时内开始的每个事件。但是如果 cron 停止,或者需要超过一分钟,我就不能跳过一些电子邮件。换句话说,我怎么能确定我不会两次发送相同的电子邮件?

【问题讨论】:

您没有尝试将您的某些字词输入谷歌,是吗? A cron job for rails: best practices? 的可能重复项 我当然做到了,但这不是同一个问题。请在投反对票之前尝试理解!也许我必须澄清我的问题。这不是一个简单的 cron。我的 cron 必须每分钟运行一次才能让每个事件在 24 小时内开始。但是如果 cron 停止,或者需要超过一分钟,我就不能跳过一些电子邮件。另一方面,我如何确定我不会两次发送相同的电子邮件? 更新了我的答案以考虑此评论。 【参考方案1】:

签出:

http://railscasts.com/episodes/206-action-mailer-in-rails-3

用于发送邮件和

http://railscasts.com/episodes/164-cron-in-ruby-revised

用于随时设置 cron 来调用您的邮件程序

编辑:刚刚看到您的评论。在这种情况下,我会考虑使用 resque-scheduler 之类的东西或与 sidekiq 等效的东西:

https://github.com/bvandenbos/resque-scheduler

那么你可以这样做:

Resque.enqueue_at(24.hours.from_now, SendFollowUpEmail, :user_id => current_user.id)

sidekiq 示例:

FollowUpEmailer.perform_in(24.hours.from_now, current_user.id)

【讨论】:

我已经在使用 sidekiq。事实上,我真的不需要 cron。我只需要在 after_create 中添加您的行,对吗?!如果用户取消订阅活动,有没有办法取消电子邮件? 我不认为有办法看到:github.com/mperham/sidekiq/pull/257,最后一条评论 Mike 说你的工作应该检查是否应该发送。在那种情况下,我只需要: send_email if user.subscribed?在我的工作中 应该很容易实现。非常感谢!我看到的唯一缺点是如果我的服务器崩溃或重新启动,我会丢失我的 sidekiq 队列中的所有消息...... 糟糕,请进一步阅读我发布的链接,现在有一个 API 可以删除作业。但是,在你的情况下,我可能仍然会按照我的建议去做。 可以让redis时不时的保存到磁盘,尽量减少崩溃的影响:redis.io/topics/persistence【参考方案2】:

https://github.com/mperham/sidekiq/pull/257

这将帮助您在预定时间内解决自动邮件系统!

【讨论】:

以上是关于在 Rails 应用程序中发送自动电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

从 Rails 应用程序发送电子邮件时的 Net::SMTPAuthenticationError(在暂存环境中)

Rails 4 动作邮件程序图像绝对路径在发送邮件时添加了代理 https 路径

Rails 邮件发送:getaddrinfo:名称或服务未知

Heroku 环境中的 Ruby on Rails 应用程序:“使用 Mailgun 发送电子邮件”错误

Rails 邮件程序在电子邮件上发送空正文

在 Rails 中引入类似触发器的功能的最佳实践