メールサーバー構築なしで、手軽にメール送信|SendGrid編 . 月間25,000通までは無料でメール送信ができてしまうというお手軽さです。最近Azureでメール送信となるとほぼこれを使っています。ちなみにAzureサブスクリプションと紐づけてSendGridを使用する場合、いろいろ制限があります。詳細は以下のリンク先を参照してください。 SendGrid を使用して電子メールを送信するには、API キーを指定する必要があります。 To send an email using SendGrid, you must supply your API Key. For customers requiring ability to send larger email volumes, SendGrid also offers Silver, Gold, Platinum and Premier packages, which include a dedicated IP as well as additional IP and user management features. EC2 インスタンスからポート 25 の制限を削除するにはどうすればよいですか . メール送信時の挙動. SendGridではメールの送信方法としてWeb APIとSMTPが提供されています。本エントリではWeb APIとSMTPのそれぞれでメールを送信してみたいと思います。どちらもメール送信できる点は同様ですが、利便性等が異なりますので主な違いについては以下を確認ください。, メールの送信にはAPIキーが必要になりますので、APIキーを発行します。SendGridのコンソールより取得することが可能です。, Web API呼び出し元のEC2の環境変数にAPIキーを設定します。APIキーを利用する際は環境変数に設定する等して、プログラムへのハードコーディングは避けましょう。, 先ずは、Web APIを利用してメール送信してみたいと思います。 その際はX-SMTPAPIと呼ばれるカスタムヘッダを利用し値をJSON文字列で指定します。JSON生成を補助してくれるライブラリもあるようなので送信をカスタマイズする際に利用してみたいと思います。, SendGridを利用してEC2からメールを送信してみたいと思います。本エントリではWeb APIとSMTPのそれぞれでメールを送信してみたいと思います。. your-sendgrid-api-key を、SendGrid アカウントの API キーに置き換えます。 your-sendgrid-from-email を、メールの送信元として使用するメールアドレスに置き換えます。 destination-email を、メールの送信先として使用するメールアドレスに置き換えます。 https://app.sendgrid.com/settings/api_keysにアクセスします。, controllerやmodelなどにメール送信のコードを書きます。 メール本文はbladeで書いて、様々なメールのテンプレートを利用できるようにします。, SendGridにログイン(アカウントがない場合は作成)し、 IDCFクラウドでは、SendGridのIDCF特典プランを利用することができます。 SendGridはSMTPサーバーとして利用したり、リスト形式の一斉配信が簡単に利用できるクラウド型メール配信サービスです。 豊富なAPIを備えており、SendGrid 実行結果, ちょっと結果が読みにくいので、JSON部分をフォーマットすると以下のようになります。, 送信遅延があったことを表す "deferred" というプロパティに15が記録されています。これは送信遅延が15回あったことの証拠になります。, さて、続いてSendGridのポータル画面から、送信遅延時にSendGridがどのような動作をしているのか確認してみます。, まず前提として、SendGridの仕様に関するページ*1を参照すると、以下のような記載があります。, Deferredが発生した場合、SendGridは時間を置いて再送信を繰り返します(72時間)。, では実際の動作はどうなっているのか、SendGridのポータル画面から確認します。SendGridの詳細ログは、[Activity] メニューから確認することができます。送信履歴の中から、[TYPE] 列が "deferred" となっているレコードを探します。, 今回のケースでは、5名に対するメール送信を同時に実行しています。それがそれぞれ3回ずつ遅延し、結果として15回の送信遅延が発生していた様子がわかりました。SendGridのログを見る限り、メール送信のリクエストを受け付けてから、 "deferred" が記録されるまでの間隔はおおよそ10分間のようです。この間実際に何回の再送処理が行われているのか、ログから正確なことを判断することはできませんが、少なくともこのログが記録されている瞬間には、再送を行っていたと考えられます。, ただ、根本的な問題がどこにあったのか、SendGridのポータルから確認することはできません。わかるのは、あくまで送信遅延があったという事実のみで、その原因が何なのかを知ることはできません。, なお、SendGridのポータルのダッシュボードに表示されているメール送信の成功率は、送信遅延による送信失敗はカウントされません。送信遅延が発生したとしても、最終的にメールが届いていれば、送信成功としてカウントされます。, ではメールを送信したアプリケーション側ではどのような挙動を示すのか、その答えはSendGridのメール送信用Web APIに答えがあります。メール送信用Web APIの解説の最下部に、HTTPリクエストの応答メッセージ例が示されています。, そう、HTTPステータスコードは202 Acceptedなんですね。202は、要求を受け付けたけものの、まだ処理をしていないことを示すステータスコードです。, RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content, 結論、アプリケーション側にはエラーやタイムアウト、遅延している、といった情報は一切通知されず、正常に処理を受け付けたことだけが返されます。, 今回はSendGridの送信遅延が発生したときの内部動作について書いてみました。ちょっと厄介なのは、送信遅延が発生したとき、SendGridが72時間も再送を繰り返す仕様です。通常メールの不達が発生したら、アプリケーション側である程度制御したいケースというのはあると思うのですが、それが許されないのはちょっとだけ厄介ですね。, *1:https://sendgrid.kke.co.jp/docs/User_Manual_JP/email_activity.html, masatsunaさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog メール送信を行うためのクラウドベースのサービスです。Azureサブスクリプション (Visual Studioサブスクリプションを含みます) を持っている場合、Azure PortalからSendGridのアカウントを作成することができます。Azure Portalには2019/7/7現在、以下のような説明が記載されています。. 今回はシンプルにRequestのデータからユーザのデータを取得してメール送信する例です。, ※下記ではメール送信に失敗した際の処理をLogとして残していますが、要らない場合は削除してください。, 6.のコードだと、「emails/templates/notificationMail.blade.php」をテンプレートとして指定しています。, 通常のreturn viewと同様にcompactで渡したデータを好き放題表示しましょう!, 宛先が複数人の場合は、「$email->addTo('送信先アドレス');」をforeach等で追加分実行すればできます。, 同じアドレスが複数あるとBad Requestになってしまいメールが送れないので、配列にして重複を除いてから送信するとよいと思います!, あとは、メールを送信したいタイミングで関数を実行するだけです。 | 関数はどこかに汎用的に使えるようにしておくといいですね!. >-------------------------------------------------------