我想自动将电子邮件发送到我的Rails应用程序中的用户列表。 该卷的范围从几个用户(5-10)到用户组(50-70)。 最大值是所有用户(目前为5000)。
我了解发送电子邮件可以阻止Rails应用,因此发送电子邮件应该在排队系统和后台作业的帮助下完成,例如:使用DelayedJob,Resque或Sidekiq。
不幸的是,拥有这样的后台工作需要Heroku平台上的工作进程。我想避免这种情况,因为成本增加(至少在开始时)。
我可以采取其他替代方法吗?例如,第二个Rails应用程序,只有一个工作进程,只进行电子邮件处理(我想这也会导致付费工作进程)?
是否可以通过SendGrid,MailGun或任何其他与Heroku良好集成的服务发送大量电子邮件而无需此类工作进程?
答案 0 :(得分:3)
支持@phoet寻找他的链接
我们在Heroku上有类似的想法,我们认为这是免费的。事实证明他们在scheduler
小时内向我们收费......但这就是我们所做的:
Resque
Resque是一个在Rails上运行的排队系统,用于在Redis中对项目进行排队。完全建议use this on Heroku,并且效率很高。可伸缩的
它的工作原理如下:
- 将“数据”(通常是ID)发送到resque队列
- Resque将ID发送到Redis
- Resque rake作业处理Redis队列
- 处理队列时执行邮件发送(将电子邮件发送到Mandrill / SendGrid)
醇>
拥有队列的原因是@apneadiving说 - 您的控制器将超时(更重要的是),您的Rails应用程序将锁定,直到该过程完成
Resque here上有一个非常好的Railscast:
<强>代码强>
这只是基本代码 - 如果您愿意,可以添加更多代码:
#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电话即可发送多封电子邮件。