在Rails中发送电子邮件简报/调查

时间:2013-08-19 17:08:16

标签: ruby-on-rails ruby ruby-on-rails-3 heroku mandrill

有人可以帮我理解如何向我网站的所有用户发送电子邮件吗?我知道如果用户注册或提交联系表单或执行某些操作,如何创建电子邮件。但是,我无法弄清楚如何在没有执行某些操作的情况下发送电子邮件。

在我的config / environments / production.rb中,我有:

config.action_mailer.smtp_settings = {
  :address              => "smtp.mandrillapp.com",
  :port                 => 587,
  :domain               => "majorfinder.com",
  :user_name            => ENV["MANDRILL_USERNAME"],
  :password             => ENV["MANDRILL_PASSWORD"],
  :authentication       => :plain,
  :enable_starttls_auto => true
}

config.action_mailer.default_url_options = {
  :host => "majorfinder.com"
}

在我的app / mailers / questions_mailer.rb中,我有:

class QuestionsMailer < ActionMailer::Base
  default from: "lauralee@majorfinder.com"
  def interest_question(user)
    @user = user
mail(to: @user.email, subject: "My Subject")
  end

我创建了我的电子邮件的txt和html版本,并将其放置在app / views / questions_mailer / email.html.erb / email.txt.erb中。

我缺少的是我在控制器中放入什么来发送电子邮件。它是这样的:

QuestionsMailer.interest_question(@user).deliver

发送时我有大约300个用户。我应该将其分解为多个批次(我在此处找到的内容:Sending emails based on intervals using Ruby on Rails)?

我不知道这是否重要,但我在heroku上托管,我的数据库是postgresql。

非常感谢你给我的任何帮助!

更新: 我跟着@ jefflunt的建议并创建了一个rake任务。这就是我的样子:

desc "Email to ask users what they're most interested in"
task :interests => :environment do
  User.all.each do |u|
    QuestionsMailer.interest_question(u).deliver
  end
end

然后我在本地运行rake interests以确保一切正常。一旦我将所有更改推送到heroku,我就运行heroku run rake interests并向所有用户发送了一封电子邮件。

1 个答案:

答案 0 :(得分:3)

创建rake任务,遍历您网站上活跃用户的所有电子邮件地址,构建并发送每位用户一封电子邮件。

类似的东西:

namespace :transactional_emails do
  desc "Email to ask users what they're interested in"
  task :interests => :environment do
    User.all.each |u| do
      QuestionsMailer.interest_question(u).deliver
    end
  end
end

我不认为批量发送是非常重要的,除非任务完全占用你的CPU或占用比你在应用服务器上多余的RAM。它不太可能对您的数据库性能产生轻微影响。

可能需要加载:environment(它基本上会加载您的Rails应用程序),以便加载您的数据库连接设置以及config/environments/production.rb的ActionMailer配置。当您在rake任务中加载环境时,您应该可以访问应用程序中的大多数内容,包括所有模型等。

一些注意事项:

  1. 加载环境意味着您的任务的启动时间将比未加载环境的时间长,但是可以选择排除您的环境,因为这是您的SMTP设置存储。
  2. 有300多个用户,此任务可能需要一段时间才能运行,因此请确保以这样的方式运行该任务:如果需要很长时间才能完成,则记录成功/失败,以便您可以在某处重新启动任务在列表中间,如果作业被杀或者其他东西中断了电子邮件传递。如果只有10%的用户没有第一次收到电子邮件,那么您不想要重新发送到整个列表。我建议不要使用批处理方法,因为它会增加您的应用程序的复杂性和某种定期工作,除非您可以衡量对您的应用程序的真实,有害影响,否则不必随着时间的推移传播这项工作。在进行大量SMTP连接时,应用服务器上的大部分负载将成为连接到SMTP服务器的网络连接 - 所以可能没什么大不了的。
  3. 如果您希望将用户的子列表,自定义主题行或其他有用信息传递到任务中,则
  4. rake任务可以接受命令行参数。假设您以某种方式将用户分成User::active?User.veteran?User.recently_joined?.active?用户是过去30天内登录的用户{{1}用户是您网站上已存在至少一年的用户,.veteran?用户是在过去30天内创建帐户的用户。将某些内容传递到命令行,如:

    recently_joined?

  5. ...可以有条件地将电子邮件发送到整个用户群的某个子集。

    编写自定义bundle exec rake user_email SEGMENT=veterans任务是covered here

    发送爆炸电子邮件时需要考虑的事项是为了增加避免垃圾邮件过滤器的机会,可以read here