向大量收件人发送电子邮件的最佳做法(Rails + SendGrid)

时间:2011-10-19 17:31:30

标签: ruby-on-rails heroku sendgrid

我将从Rails应用程序发送批量电子邮件,并计划使用SendGrid。我假设最好向每个收件人发送一封单独​​的电子邮件(而不是为所有收件人使用BCC)。如果这是真的,我应该使用像DelayedJob这样的东西来排队转发到SendGrid的消息,还是可以安全地一次抛出500条消息?谢谢!

6 个答案:

答案 0 :(得分:55)

500条消息对SendGrid来说真的不多。这甚至都不是他们雷达上的一个昙花一现。我曾在一家公司工作,一个月内发送了270万封电子邮件,即便如此,它只是只是一个短暂的。

使用SendGrid API的功能,您不会发送500封电子邮件,您将发送一个电子邮件,其中包含特定的SendGrid API标头集。为什么?因为您曾尝试发送 500个人电子邮件并计时需要多长时间? 一封电子邮件怎么样?单个电子邮件会更快。

SendGrid API有一个Ruby示例,它位于: https://sendgrid.com/docs/Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.html

这是漫长的啰嗦和混乱,所以让我为你简化它。基本上,你在电子邮件中设置了这个:

headers["X-SMTPAPI"] = { :to => array_of_recipients }.to_json
然后,

SendGrid将解析此内容,然后将您发送的一个电子邮件发送给该收件人数组。我似乎记得他们要求你将每个电子邮件限制为大约1000个收件人,所以如果你想要的话,将它分成多个电子邮件是明智的。 就是你带来delayed_jobresque宝石之类的东西来处理它。

哦,顺便说一句,你还需要为这封电子邮件指定一个to地址,以使邮件宝石快乐。我们有info@ourcompany.com

SendGrid API还会在其电子邮件中支持过滤器,因此您可以使用{{ firstname }}等占位符字符串,并假设您使用SMTPAPI标头发送它,它将在电子邮件中执行“邮件合并”并自定义它们。

如果您阅读SendGrid API文档,它会为您带来很多好处。它非常有用,它们提供的功能非常强大。

答案 1 :(得分:2)

我建议使用sendgrid gem(https://github.com/stephenb/sendgrid),因为它简化了您的调用代码。

以下是rails 3动作邮件示例的示例:

class UserAnnouncementMailer < ActionMailer::Base
  include SendGrid
  default reply_to: "test@test.com", return_path: "test@test.com", from: "Test"

  # bulk emailer
  # params - opts a hash of
  #            emails: array of emails
  #
  def notice(opts={})
    raise "email is nil" unless opts[:emails]

    sendgrid_category :use_subject_lines
    sendgrid_recipients opts[:emails]

    name = "The Man"
    to = "test@test.com"
    from_name = "#{name} <theman@test.com>"
    subject = "Important"

    mail({from: from_name, to: to, subject: subject})
  end
end

和相应的调用代码。建议将电子邮件数组设为&lt; 1000封电子邮件。

emails = ["alice@test.com", "bob@test.com"]
UserAnnouncementMailer.notice({:emails => emails}).deliver

有关详细信息,请参阅sendgrid gem github自述文件。

答案 2 :(得分:1)

延迟作业和SendGrid听起来像你说的最好的选择,但你考虑过使用其中一个像Mailchimp这样的广告系列邮寄吗?如果您发送了大量基本相同的邮件,他们会让您设置广告系列模板,然后在其中触发所有变量的CSV。然后他们有效地邮寄合并并将它们全部解雇。

但是,如果你只说几百个,那么你就是正确的。 SendGrid可以轻松处理负载,并且您希望使用延迟作业,以便在不受欢迎时不受SendGrid API性能的影响。或者,查看Resque而不是发送邮件,因为它可能更有效。

答案 3 :(得分:0)

SendGrid提供了一些建议here。他们在博客上有一个可交付性和最佳实践的类别。

答案 4 :(得分:0)

我认为SendGrid可以处理这种负载。大多数中继系统可以。另外我想象一下,如果你在CC API调用中发送了500,他们的系统会解析它并单独发送它们。我使用弹性电子邮件(http://elasticemail.com) - 我知道这就是他们处理它的方式,而且效果很好。

答案 5 :(得分:0)

这就是我在Rails 4中的表现

class NewsMailer < ApplicationMailer
  include SendGrid

  sendgrid_category :use_subject_lines

  default from: 'My App! <support@myapp.com>'

  def mass_mailer(news)
    # Pass it in template
    @news = news

    # Custom method to get me an array of emails ['user1@email.com', 'user2@email.com',...] 
    array_of_emails = @news.recipients.pluck(:email) 

    # You can still use
    # headers["X-SMTPAPI"] = { :to => array_of_emails }.to_json
    sendgrid_recipients array_of_emails

    mail to: 'this.will.be.ignored@ignore.me', subject: 'Weekly news'
  end

end