开发者

Options with Rails for triggering an email to all (or some) users?

开发者 https://www.devze.com 2023-03-30 17:52 出处:网络
Newb question: We\'ve got a live site with registered users. Some new functionality has been added (including support for Mailers). We would like to trigger an email to all existing users (similar but

Newb question: We've got a live site with registered users. Some new functionality has been added (including support for Mailers). We would like to trigger an email to all existing users (similar but not identical to one that will now automatically go out to new users).

What options do we have for triggering the sending of that email? This message will likely only be sent once so we don't need the code (other than the message itself) in the Rails app. Nor do we really need to store who received it because it will be assumed that all users have received such a message once we can get this one out.

I'm thinking Rake task but all the examples I seem to be able to find are for build script?!? Or should we just use the Rails console in production? Perhaps get an array of all users we want to send email to and then deliver message to them?

Not sure. I haven't worked with ActionMailer开发者_StackOverflow社区 much.


I'd probably do it like this:

In order to determine if the system has sent an email to a user, you should add an attribute let's say 'sent_email' which is basically just a boolean.

I'd create a cron job for a rake task that checks all users with sent_email=0. Then, I'll loop through each array and send the email and set sent_email=1. The cron job can be run daily, depending on your preference. You can use whenever gem to setup the cron job.

schedule.rb (whenever stuff)

job_type :run_script, "RAILS_ENV=:environment ruby :path/script/:task"
every 1.day do
  run_script('send_email.rb')
end

script/send_email.rb

#!/usr/bin/env ruby
puts "Loading rails environment..."
require(File.dirname(__FILE__) + "/../config/environment") unless defined?(Rails)

class SendEmail
  def send_email
     users = User.send_email_to
     users.each do |user|
       OneTimeMailer.deliver_one_time_email(user)
     end
  end
end

mailers/one_time_mailer.rb

class OneTimeMailer < ActionMailer::Base
  def one_time_email(user)
    recipients user.email
    from 'your system'
    subject 'hello world'
    body 'this is a one time email. thank you'
  end
end

I hope this helps.


I suggest doing a rake task, run it once and you are done.

rails g task my_namespace my_task1 my_task2

Now you loop through your database:

namespace :sent_email_to_everyone do
  desc "TODO"
  task send_that_mail: :environment do
     user = User.all
     user.each do |user|
        Yourmailer.send_email(user.email)
      end
    end
  end
end

Now you just run it and done

rake sent_that_mail
0

精彩评论

暂无评论...
验证码 换一张
取 消