发送电子邮件给大量收件人的最佳实践(Rails + SendGrid)

19

我将从Rails应用程序发送批量电子邮件,计划使用SendGrid。 我假设最好向每个收件人发送单独的电子邮件(而不是为所有收件人使用BCC)。 如果这是真的,那么我应该使用类似于DelayedJob的东西来排队发送到SendGrid的消息,还是一次性将500个消息发送过去是安全的?谢谢!

我将从Rails应用程序发送批量电子邮件,计划使用SendGrid。我认为最好向每个收件人发送单独的电子邮件(而不是为所有收件人使用BCC)。如果正确,是否应该使用DelayedJob之类的东西来排队发送到SendGrid的消息,或者一次性发送500条消息是否安全?谢谢!
5个回答

56

对于SendGrid来说,发送500封邮件并不算什么。即使一个公司在一个月内发送了270万封电子邮件,对于SendGrid来说也只是微不足道的一点。通过使用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_job或者resque这样的宝石来处理。

顺便提一下,为了让Mail gem正常工作,你仍然需要指定一个to地址。我们使用info@ourcompany.com

SendGrid API还支持电子邮件中的过滤器,因此您可以有占位符字符串,例如{{ firstname }},假设您通过SMTPAPI头将其发送,它将在邮件上执行“邮件合并”并对其进行自定义。

如果您阅读SendGrid API文档,会对你非常有帮助。它非常有用,而且提供的功能非常强大。


1
关于虚拟“to”地址的好建议。 - xiankai
2
SendGrid API的链接已经过时了 - 我认为现在正确的链接是https://sendgrid.com/docs/Code_Examples/SMTP_API_Header_Examples/ruby.html。 - patrickdavey
“to”地址让我感到困惑,但是你在这里解释得很清楚,谢谢! - Won Jun Bae
谢谢!使用Rails批量发送电子邮件的最佳方法是什么,每次发送1000封? - strohy1210

2
我建议使用sendgrid gem(https://github.com/stephenb/sendgrid),因为它可以简化调用代码。
以下是一个Rails 3 Action Mailer示例:
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

对应的调用代码。建议emails数组中的电子邮件不超过1000个。

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

请参阅sendgrid gem的github自述文件以获取更多详细信息。

1

根据您的说法,Delayed Job 和 SendGrid 似乎是最好的选择,但您考虑过使用 Mailchimp 等一种广告邮件发送服务吗?如果您要发送许多基本相同的邮件,则它们将允许您设置一个广告模板,然后将所有变量作为 CSV 文件发送。他们随后有效地进行邮件合并并全部发送。

然而,如果您只需要发送几百封邮件,那么您已经走在了正确的路上。SendGrid 可以轻松处理这个负载,您应该使用 Delayed Job,以便在 SendGrid API 性能不佳时不会受到影响。或者,考虑使用 Resque 来发送邮件,因为它可能更有效率。


0
我想SendGrid应该能处理那种负载。大多数中继系统都可以。而且我想如果你在CC API调用中发送了500个,他们的系统会解析它并逐个发送。我使用Elastic Email(http://elasticemail.com)- 我知道他们是这样处理的,效果非常好。

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

你好!你的例子看起来很有趣,你在Github上有完整的例子吗?或者你能分享一篇文章或教程给我阅读吗?我正在尝试使用Devise with Sendgrid and Delay_Job来处理邮件列表。你能提供任何帮助都将非常有用。 - alexventuraio

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