Подтвердить что ты не робот

Рекомендации по отправке электронной почты большому количеству получателей (Rails + SendGrid)

Я отправлю массовые письма из приложения Rails и планирую использовать SendGrid. Я предполагаю, что лучше отправить отдельное письмо каждому получателю (в отличие от использования BCC для всех получателей). Если это так, я должен использовать что-то вроде DelayedJob для отправки сообщений, отправляемых в SendGrid, или было бы безопасно выбросить на него 500 сообщений? Спасибо!

4b9b3361

Ответ 1

500 сообщений действительно не так много для SendGrid. Это даже не отразилось на их радаре. Я работал в компании, которая разослала 2,7 миллиона электронных писем за один месяц, и даже тогда это всего лишь ошибка.

С возможностями API SendGrid вы не будете отправлять 500 электронных писем, вы отправите одно электронное письмо с определенным набором заголовков SendGrid API. Зачем? Потому что вы когда-нибудь пытались отправить 500 отдельных сообщений электронной почты и приурочили, сколько времени это займет? Как насчет одного электронного письма? Единственное письмо будет быстрее.

API-интерфейс SendGrid имеет пример 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, чтобы справиться с этим.

О, и, кстати, вам все равно нужно указать адрес to для этого письма, чтобы сделать почтовый жемчуг счастливым. Для этого у нас было [email protected].

API SendGrid также будет поддерживать фильтры в своих письмах, поэтому вы можете иметь строки-заполнители, такие как {{ firstname }}, и, предполагая, что вы отправите его с заголовком SMTPAPI, он выполнит "слияние почты" по электронной почте и настроит их.

Было бы неплохо, если бы вы прочитали документацию API SendGrid. Это действительно полезно, и то, что они предоставляют, является супермощным.

Ответ 2

Я рекомендую использовать драгоценный камень sendgrid (https://github.com/stephenb/sendgrid), поскольку он упрощает ваш код вызова.

Вот пример примера рельсов 3 action:

class UserAnnouncementMailer < ActionMailer::Base
  include SendGrid
  default reply_to: "[email protected]", return_path: "[email protected]", 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 = "[email protected]"
    from_name = "#{name} <[email protected]>"
    subject = "Important"

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

И соответствующий код вызова. Он рекомендовал, чтобы массив электронной почты был < 1000 писем.

emails = ["[email protected]", "[email protected]"]
UserAnnouncementMailer.notice({:emails => emails}).deliver

Подробнее см. в файле gigub readme для sendgrid.

Ответ 3

SendGrid предлагает несколько советов здесь. У них есть категория "Конечный результат" и "Лучшая практика" в их блоге.

Ответ 4

Отложенное задание и SendGrid звучат как лучший вариант из того, что вы говорите, но считаете ли вы, что вместо этого используете одну из почтовых программ кампании, таких как Mailchimp? Если вы отправляете много писем, которые в основном одинаковы, они позволят вам настроить шаблон кампании, а затем запустить CSV всех переменных. Затем они эффективно отправляют слияние и уничтожают всех.

Если, однако, вы говорите только несколько сотен, вы на правильных строках. SendGrid может легко обрабатывать нагрузку, и вы хотите использовать Delayed Job, чтобы на вас не влияло производительность API SendGrid, если это не выгодно. Кроме того, посмотрите на Resque вместо отправки почты, поскольку она может быть более эффективной.

Ответ 5

Я бы предположил, что SendGrid может обрабатывать такую ​​нагрузку. Большинство релейных систем могут. Также я бы предположил, что если бы вы отправили 500 в вызове API CC, то их система проанализировала бы его и отправила бы их по отдельности. Я использую Elastic Email (http://elasticemail.com) - и я знаю, что именно так они справляются с этим, и он отлично работает.

Ответ 6

Вот как я это сделал в Rails 4

class NewsMailer < ApplicationMailer
  include SendGrid

  sendgrid_category :use_subject_lines

  default from: 'My App! <[email protected]>'

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

    # Custom method to get me an array of emails ['[email protected]', '[email protected]',...] 
    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: '[email protected]', subject: 'Weekly news'
  end

end