在Rails中发送电子邮件通讯/调查

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"
}

在我的应用程序/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

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

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


```ruby def send_email QuestionsMailer.email.deliver_now end ```
QuestionsMailer.interest_question(@user).deliver

发送此邮件时,我有大约300个用户。我应该将其分成若干个批次发送(例如我在这里找到的内容:使用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个回答

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应用程序),以便从config/environments/production.rb加载您与数据库的连接设置以及ActionMailer配置。当您在rake任务中加载环境时,您的应用程序中的大部分内容都应该是可访问的,包括所有模型等。
一些注意事项:
  1. 加载环境意味着启动任务的时间会比不加载环境更长,但是可能无法排除您的环境,因为那里存储了您的SMTP设置。
  2. 对于300多个用户,这个任务可能需要一段时间才能运行,因此请确保以这样的方式运行该任务,即如果它需要很长时间才能完成,则记录成功/失败,以便您可以在列表中间重新启动任务,以防作业被杀死或其他原因中断电子邮件传递。您不想做的是必须重新发送整个列表,如果只有10%的用户第一次没有收到电子邮件。我建议反对批处理方法,主要是因为它增加了应用程序的复杂性,具有某种定期工作,并且除非您可以测量应用程序的真正有害影响,否则没有必要将这项工作分散到时间上。当进行大量SMTP连接时,对应用程序服务器的大部分负载将是网络连接到SMTP服务器 - 因此可能不是一个大问题。
  3. rake任务可以接受命令行参数,如果您希望传递用户的子列表、自定义主题行或其他有用信息到任务中。假设您通过User::active?User.veteran?User.recently_joined?将用户分成了几个部分,其中.active?用户是在过去30天内登录的用户,.veteran?用户是在您的网站上至少一年的用户,而recently_joined?用户是账户创建在最近30天内的人。像这样传递一些东西到命令行:

    bundle exec rake user_email SEGMENT=veterans

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

编写自定义rake任务在此处已涵盖

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


非常感谢@jefflunt!Rake任务完美运行。 - lflores
太好了。如果它没有工作,那将是非常尴尬的。 :) - jefflunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接