无需后台工作即可发送大量电子邮件

时间:2013-12-21 08:31:05

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

我想自动将电子邮件发送到我的Rails应用程序中的用户列表。 该卷的范围从几个用户(5-10)到用户组(50-70)。 最大值是所有用户(目前为5000)。

我了解发送电子邮件可以阻止Rails应用,因此发送电子邮件应该在排队系统和后台作业的帮助下完成,例如:使用DelayedJob,Resque或Sidekiq。

不幸的是,拥有这样的后台工作需要Heroku平台上的工作进程。我想避免这种情况,因为成本增加(至少在开始时)。

我可以采取其他替代方法吗?例如,第二个Rails应用程序,只有一个工作进程,只进行电子邮件处理(我想这也会导致付费工作进程)?

是否可以通过SendGrid,MailGun或任何其他与Heroku良好集成的服务发送大量电子邮件而无需此类工作进程?

2 个答案:

答案 0 :(得分:3)

支持@phoet寻找他的链接

我们在Heroku上有类似的想法,我们认为这是免费的。事实证明他们在scheduler小时内向我们收费......但这就是我们所做的:


Resque

Resque是一个在Rails上运行的排队系统,用于在Redis中对项目进行排队。完全建议use this on Heroku,并且效率很高。可伸缩的

它的工作原理如下:

  
      
  1. 将“数据”(通常是ID)发送到resque队列
  2.   
  3. Resque将ID发送到Redis
  4.   
  5. Resque rake作业处理Redis队列
  6.   
  7. 处理队列时执行邮件发送(将电子邮件发送到Mandrill / SendGrid)
  8.   

拥有队列的原因是@apneadiving说 - 您的控制器将超时(更重要的是),您的Rails应用程序将锁定,直到该过程完成

Resque here上有一个非常好的Railscast:

enter image description here


<强>代码

这只是基本代码 - 如果您愿意,可以添加更多代码:

    #app/controllers/messages_controller.rb
    def send_message
        id = params[:id]
        message = Message.find(id).broadcast!

        flash[:notice] = "Broadcast Queued!"
        redirect_to root_path
    end

   #app/models/message.rb
   def broadcast!
         self.subscribers.each do |subscriber|
             Resque.enqueue(MailoutQueue, id, subscriber.id, queue.id)
         end
   end

   #app/workers/mailout_queue.rb
   class MailoutQueue
        @queue = :mailer
        def self.perform(message_id, recipient_id, queue_id)
                MessageMailer.send_message(message_id, recipient_id).deliver
        end
   end

class MessageMailer < ActionMailer::Base
        default from: '****************'

        def send_message(message_id, subscriber_id)

                #Declarations
                @message = Message.find(message_id)
                @subscriber = Subscriber.find(subscriber_id)

                #Send
                mail(:to => @subscriber.email, :subject => @message.title)

        end        

end

答案 1 :(得分:0)

看看这里 - https://github.com/stephenb/sendgrid#delivering-to-multiple-recipients

这样,您只需拨打一个SMTP电话即可发送多封电子邮件。