使用Rails发送100封电子邮件

3
我想在讨论改变时通知关注者。一个讨论有很多关注者。 现在我正在Discussion类中做这件事:
self.followers.each do |follower|
    DiscussionMailer.delay.new_reply_notification(user, reply) unless reply.user == user 
end

虽然这是异步的,但它非常慢、内存占用高,并且会在 Redis 和 Sidekiq 上创建依赖关系。我该如何将 self.followers 数组发送到 Mailgun 或另一个 API 并以此方式发送所有电子邮件?以下是我的实际邮件发送方法:
  def new_reply_notification(user, reply)
    @user = user
    @reply = reply
    @reply_user = @reply.user

    mail(to: user.email,
         from: "arobot@gmail.com"
         subject: "#{@reply_user.user_name} has just replied!")
  end

所以我想邮件方法在这里是关键。我该如何更改它以执行类似于这样的操作:
mail(to: followers_aray,
     from: "arobot@gmail.com"
     subject: "#{@reply_user.user_name} has just replied!")

“我喜欢任何宝石,狒狒宝石看起来很有前途。”
“更新”
“每个人都告诉我要在工作程序中执行此操作。虽然我同意,但我注意到我的 SMTP 日志中有这个字段:”。
"envelope": {
        "targets": "address@gmail.com", 
        "transport": "", 
        "sender": "arobot@gmail.com"
    }

我猜我的信封可以有任意数量的目标。如果我的 SMTP 服务器正在处理所有工作,那么我为什么需要使用一个 worker?

1
如果您将所有地址放在“to:”中,每个人都会看到所有电子邮件地址。这可能不是您(或他们)想要的。我们通常将自己的电子邮件地址放在“to:”字段中,将所有收件人放在“bcc:”中。 - Marian Theisen
酷啊...bcc接受一个数组? - Starkers
to:cc:bcc:都可以使用单个地址或者数组的形式。http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail - Marian Theisen
那么邮件服务器会循环遍历所有的电子邮件吗?如果发送给一个电子邮件或一百个电子邮件,该方法所需的时间是相同的吗? - Starkers
是的,但我真的不知道邮件服务器本身是否有限制。 - Marian Theisen
我要说的第一件事是不在控制器/模型中完成,而是在工人中完成。您应该经常检查新消息并向用户发送通知。然后,您可以为每日摘要、周报等设置类似的工作人员。 - Mike Szyndel
1个回答

1
在您的情况下,您应该使用Sidekiq或类似工具将电子邮件发送到队列中,这将提高性能并将其转换为后台作业,而不是实时操作。
讨论更改后,请将所有关注者推送到队列中,然后一次发送一个。
请参阅此处:

http://sidekiq.org/ https://github.com/mperham/sidekiq/wiki


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