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

Posted

技术标签:

【中文标题】在 Rails 中发送电子邮件通讯/调查【英文标题】:Send an email newsletter/survey in Rails 【发布时间】:2013-08-21 13:47:33 【问题描述】:

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

在我的 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】:

创建一个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 任务中时,您应该可以访问应用程序中的大部分内容,包括所有模型等。

一些注意事项:

    加载环境意味着您的任务的启动时间将比不加载环境时长,但是它可能不是排除您的环境的选项,因为这是您的 SMTP 设置已存储。 对于 300 多个用户,此任务可能需要一段时间才能运行,因此请确保以这样的方式运行该任务在列表中间,以防作业被终止或以其他方式中断电子邮件传递。如果只有 10% 的用户没有第一次收到电子邮件,您不想做的是必须重新发送到整个列表。我建议不要使用批处理方法,主要是因为它通过某种周期性工作增加了您的应用程序的复杂性,并且除非您可以衡量对您的应用程序的真实、有害的影响,否则没有必要随着时间的推移分散这项工作。建立大量 SMTP 连接时,您的应用服务器上的大部分负载将是与您的 SMTP 服务器的网络连接 - 所以可能没什么大不了的。

    rake 任务可以接受命令行参数,如果您希望将用户子列表、自定义主题行或其他有用信息传递到任务中。假设您以某种方式将您的用户分成User::active?User.veteran?User.recently_joined?,其中.active? 用户是在过去30 天内登录的用户,.veteran? 用户是您的用户网站至少一年,recently_joined? 用户是在过去 30 天内创建帐户的人。将某些内容传递到命令行,例如:

    bundle exec rake user_email SEGMENT=veterans

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

编写自定义rake 任务是covered here。

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

【讨论】:

非常感谢@jefflunt! rake 任务完美运行。 甜蜜。如果没有奏效,会非常尴尬。 :)

以上是关于在 Rails 中发送电子邮件通讯/调查的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4在“测试”环境中发送电子邮件

检查在 CakePHP 中发送电子邮件是不是成功/失败?

如何在android中发送电子邮件[重复]

如何在 VC++ 中发送电子邮件?

sh 在shell中发送电子邮件

如何在 Android 中发送电子邮件? [复制]