3

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

在我的 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 个用户。我应该把它分成多个批次吗(就像我在这里找到的:Send emails based on interval 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并向所有用户发送一封电子邮件。

4

1 回答 1

4

创建一个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 应用程序),以便您与数据库的连接设置以及您的 ActionMailer 配置config/environments/production.rb也被加载。当您将环境加载到rake任务中时,您应该可以访问应用程序中的大多数内容,包括所有模型等。

一些注意事项:

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

    bundle exec rake user_email SEGMENT=veterans

...可能是一种有条件地向整个用户群的某些子集发送电子邮件的方法。

此处介绍了编写自定义rake任务。

可以在此处阅读发送爆炸电子邮件以增加避免垃圾邮件过滤器的机会时要考虑的事项。

于 2013-08-19T19:17:08.960 回答