Лучшие практики для отправки электронной почты множеству получателей (Rails + SendGrid) - PullRequest
19 голосов
/ 19 октября 2011

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

Ответы [ 6 ]

55 голосов
/ 20 октября 2011

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

Благодаря возможностям API SendGrid вы не будете отправлять 500 электронных писем, вы будете отправлять одно электронное письмо с определенным набором заголовков API SendGrid. Зачем? Потому что вы когда-нибудь пытались отправить 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 драгоценных камней, чтобы справиться с этим.

Да, и, кстати, вам все равно нужно будет указать to адрес для этого письма, просто чтобы осчастливить самоцвет Почты. У нас было info@ourcompany.com для этого.

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

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

2 голосов
/ 14 сентября 2012

Я рекомендую использовать gem sendgrid (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

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

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

Подробнее см. В readme для github sendgrid.

1 голос
/ 20 октября 2011

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

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

0 голосов
/ 16 июля 2015

Вот как я это сделал в 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
0 голосов
/ 20 октября 2011

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

0 голосов
/ 19 октября 2011

SendGrid предлагает несколько советов здесь . В их блоге есть категория «Доставляемость» и «Лучшие практики».

...