web-dev-qa-db-ja.com

多くの受信者にメールを送信するためのベストプラクティス(Rails + SendGrid)

Railsアプリから一括メールを送信し、SendGridの使用を計画しています。すべての受信者にBCCを使用するのではなく、各受信者に個別のメールを送信するのが最善だと思います。 )それが本当なら、DelayedJobのようなものを使ってSendGridに送られるメッセージをキューに入れるべきですか、それとも一度に500通のメッセージを投げても安全ですか?ありがとう!

19
Matt Fordham

SendGridにとって500メッセージはそれほど多くありません。それは彼らのレーダーのブリップでさえありません。私は1か月に270万通の電子メールを送信する会社で働いていましたが、それでもほんの一瞬です。

SendGrid APIの機能を使用すると、500通のメールを送信するのではなく、特定のSendGrid APIヘッダーが設定されたoneメールを送信します。どうして? 500個の個別の電子メールメッセージを送信しようとしたことがありますか? 1通のメールはどうですか?単一の電子メールはより速くなるでしょう。

SendGridAPIにはRubyの例があります: https://sendgrid.com/docs/Integrate/Code_Examples/SMTP_API_Header_Examples/Ruby.html

それはかなり長くて厄介なので、簡単に説明します。基本的に、これをメールで設定します。

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

次に、SendGridはこれを解析し、送信したoneメールをその受信者の配列に送信します。これをメールあたり約1000人の受信者に制限するように求められていることを思い出しているようです。したがって、必要に応じて複数のメールに分割することをお勧めします。 それは、それを処理するためにdelayed_jobまたはresque宝石のようなものを持ち込むときです。

ちなみに、メールの宝石を幸せにするためだけに、このメールのtoアドレスを指定する必要があります。そのために[email protected]がありました。

SendGrid APIはメールのフィルターもサポートするため、{{ firstname }}などのプレースホルダー文字列を使用でき、SMTPAPIヘッダーを使用して送信すると仮定すると、メールで「差し込み印刷」を実行してカスタマイズします。

SendGrid APIのドキュメントを読むと、非常に役立ちます。それは本当に便利で、彼らが提供するものは非常に強力です。

55
Ryan Bigg

Sendgrid gem( https://github.com/stephenb/sendgrid )を使用することをお勧めします。これにより、呼び出しコードが簡素化されます。

次に例を示しますRails 3アクションメーラーの例:

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

そして、対応する呼び出しコード。 emails配列は1000未満の電子メールにすることをお勧めします。

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

詳細については、sendgrid gem githubreadmeを参照してください。

2
tommy chheng

Delayed JobとSendGridはあなたの言うことからすると最良の選択肢のように聞こえますが、代わりにMailchimpのようなキャンペーンメーラーの1つを使用することを検討しましたか?基本的に同じメールを大量に送信する場合は、テンプレートを設定してキャンペーンを行い、すべての変数のCSVを送信できます。次に、効果的に差し込み印刷を行い、すべてを解雇します。

ただし、話しているのが数百人しかない場合は、正しい方向に進んでいます。 SendGridは負荷を簡単に処理できるため、遅延ジョブを使用して、SendGridAPIのパフォーマンスが好ましくない場合に影響を受けないようにする必要があります。または、メールを送信する代わりにResqueを参照すると、効率が向上する可能性があります。

1
Neil Middleton

SendGridはいくつかのアドバイスを提供します ここ 。ブログには、配信可能性とベストプラクティスのカテゴリがあります。

0
CamelCamelCamel

SendGridはそのような負荷を処理できると思います。ほとんどのリレーシステムは可能です。また、CC API呼び出しで500を送信した場合、システムがそれを解析して個別に送信すると思います。私はElasticEmail( http://elasticemail.com )-を使用していますが、これが彼らの処理方法であり、うまく機能していることを私は知っています。

0
finny

これは私が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
0
Pav31