SendGridのInbound Email Parseを利用
SendGridは、メール配信などで利用されている方は多いのかもしれませんが、メール受信トリガーにWEB API経由でPOSTしてくれるサービスも提供されているようです。メール受信時のWEB APIプッシュの実現方法を探している際に見つけました。
グローバルで、企業向けにサービスを展開されているので、サービス品質などに間違いはなさそうです。
IFTTTでメール受信をしっかりとトリガー出来ていれば本サービスを利用することも無かったかもしれませんが、利用してみてPubSubというような使い方が出来そうなのでメインで利用する予定です。一般向け製品では通知手段がメールというサービスが多いです。
- 第1回 SendGridでの設定と自ドメインDNSの設定変更(今回)
- 第2回 SendGridよりPUSHされるWEB API準備
DNS設定に関しては、利用しているVALUE-DOMAIN(バリュードメイン)を例に説明を行います。
概要
sendgridで扱うEmail専用のサブドメインを準備します。サブドメイン宛のメールはすべてSendGridのメールサーバーに送信されるように設定し、SendGridでは、メール受信時のアクション(アクセスするWEB APIのURL)を設定します。あとは、受信を受けたWEB APIがメールの件名や差出人などにより実施したい処理を実施します。
現時点では、モーションセンサーの通知などをメール受信し、各種情報のデータ化としてデーターベースへの蓄積を行っております。
- SendGridサービス登録
- SendGridサービスで利用ドメインの認証
- SendGridでメール受信時の動作設定(メールをPOSTするWEB APIのアドレスを設定)
- 自ドメインのSendGridへのメール転送設定(DNS設定)
1. SendGridサービス登録
SendGridのサイトよりアカウントの新規登録を行います。
メールアドレスを登録し、簡単なアンケートや情報入力を行い、本登録を待ちます。人の手でサービス品質を保っているようで、以下メールが来て1日程度登録を待ちました。
実際、住所登録に不備があり、住所修正を行い、本登録が終了しました
SendGridにご登録いただき、誠にありがとうございます。 ログイン用のユーザ名につきましては、ご登録内容の確認およびアカウントのご利用準備が整い次第、 別途ご連絡いたします(通常、翌2営業日以内)。 ※ユーザ名はメールアドレスではございません。 なお、 ご登録内容について確認のご連絡をさせていただく場合がございま すので、あらかじめご了承ください。
サービス登録後の、利用者向けポータルのトップページ。
2. SendGridサービスで利用ドメインの認証
SendGrid-Inbound Email Parse Webhookを利用すると、利用条件としてドメインの認証が必要と、ドメイン認証の画面に誘導されます。以下の画面が、まずドメインの認証が必要とダイアログが出ています。
ドメインの認証方法は、利用しているドメインサーバのDNS設定にDNSレコードの追加を行います。SendGridで指定されたDNSレコードを追加する必要があります。SendGrid側でDNS変更を確認し、DNS変更の確認が完了すれば、ドメインの認証が終了します。
ドメイン認証は、SendGridのDomain Authentication(Authenticate Your Domain)のダイアログに従い、Install DNS Recourdsまで進み、登録するDNS情報を入手して下さい。
取得した追加するDNSレコードを自分のDNSサーバに追加します。
今回は、利用しているVALUE-DOMAIN(バリュードメイン)での設定例を例示して起きます。
ポイントは、DNS設定には時間を要するので、正しく設定出来た状態で、しばらく待ちましょう。数時間で反映されると思いますが、各種サーバなどの設定に依存します。
追加したDNSレコードが確認され、ドメイン認証が完了される際に表示されるWEB画面です。「Verify Your Domain」It worked!と表示されました。
日本法人 公式サイトの関連するQAです。
独自ドメイン利用(Sender Authentication)および設定時のDNSレコードについて、詳しく教えてください
3. SendGridでメール受信時の動作設定(メールをPOSTするWEB APIのアドレスを設定)
ドメイン認証が完了すると SendGridでSendGrid-Inbound Email Parse Webhook(メール受信時とWeb APIのマッピング)設定となります。
SendGridで受信するメールアドレスのドメインおよびWeb APIのURLを設定します。
オプションで、SendGrid側でのSpamチェック有無と受信するPOSTデータを指定します。
4. 自ドメインのSendGridへのメール転送設定(DNS設定)
最後に、SendGridへ転送したいメールアドレスを自分のDNSサーバに設定します。
この設定が終了すると、DNS情報がインターネットに反映され次第、受信メールのSendGridへ転送、SendGridでメール受信時にWEB APIへのメールデータPOSTが開始されます。
必ず、WEB API側の準備後に、DNSレコードの追加を行って下さい。(最低限WEB受信可能な状態)
以下の例では、MXレコードを追加し、対象のサブドメインをSendGridのメールサーバーに転送されるように指定します。
Inbound Email Parse WebhookのPOST情報
HEADERS | The raw headers of the email. |
---|---|
DKIM | A string containing the verification results of any DKIM and domain keys signatures in the message. |
CONTENT-IDS | A string containing the number of attachments. |
TO | Email recipient field, as taken from the message headers. |
HTML | HTML body of email. If not set, email did not have an HTML body. |
FROM | Email sender, as taken from the message headers. |
SENDER_IP | A string of the sender’s ip address. |
SPAM_REPORT | Spam Assassin’s spam report. |
ENVELOPE | A string containing the SMTP envelope. This will have 2 variables: to , which is a single-element array containing the address that we received the email to, and from , which is the return path for the message. |
ATTACHMENTS | Number of attachments included in email. |
SUBJECT | Email Subject. |
SPAM_SCORE | Spam Assassin’s rating for whether or not this is spam. |
ATTACHMENT-INFO | A JSON map where the keys are named attachment{X}. Each attachment key points to a JSON object containing three fields, filename , type , and content-id . The filename field is the name of the file (if it was provided). The type field is the media type of the file. X is the total number of attachments. For example, if the number of attachments is 0, there will be no attachment files. If the number of attachments is 3, parameters attachment1, attachment2, and attachment3 will have file uploads. |
CHARSETS | A string containing the character sets of the fields extracted from the message. |
SPF | The results of the Sender Policy Framework verification of the message sender and receiving IP address. |
[Date] array(16) { ["headers"]=> string(1970) "Received: by mx0047p1mdw1.sendgrid.net with SMTP id 6WCVv7KAWn Wed, 27 Jul 2016 20:53:06 +0000 (UTC) Received: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by mx0047p1mdw1.sendgrid.net (Postfix) with ESMTPS id AA9FFA817F2 for <example@example.comom>; Wed, 27 Jul 2016 20:53:06 +0000 (UTC) Received: by mail-io0-f169.google.com with SMTP id b62so81593819iod.3 for <example@example.comom>; Wed, 27 Jul 2016 13:53:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=GH5YTxjt6r4HoTa+94w6ZGQszFQSgegF+Jlv69YV76OLycJI4Gxdwfh6Wlqfez5yID 5dsWuqaVJZQyMq/Dy/c2gHSqVo60BKG56YrynYeSrMPy8abE/6/muPilYxDoPoEyIr/c UXH5rhOKjmJ7nICKu1o99Tfl0cXyCskE7ERW0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=Sq6LVHbmywBdt3sTBn19U8VOmelfoJltz8IcnvcETZsYwk96RBxN+RKMN5fOZSKw4j 15HrgdIFfyDmp67YK0ygvOITlTvZ6XY5I0PtnvDtAQt79kS3tKjI3QKJoEp/ZjIjSzlL KG7agl6cxFgBbIN0yHWBOvy3O+ZXY8tZdom1yOvULjmjW1U9JkdOs+aJ6zq4qhZX/RM/ tIgLB461eJ5V95iQDDc5Ibj9Cvy4vJfXLQRO0nLVQAT2Yz58tkEO1bDZpWOPAyUNneIL yhIWp+SpbuqhMA68mq0krG1PjmWalUbpVcGJIGuOKB9mQFFo/MqdrUCjvYnyo1jPLPeX psdQ== X-Gm-Message-State: AEkoousvdxmDoxLlTUYJ1AOmCGJv77xRBBlfKv6YrthH0M2NueMwlOxUD6t8nidE9uonXbdJ/DQy/chmHUnN//a4 X-Received: by 10.107.6.101 with SMTP id 98mr38024553iog.41.1469652785829; Wed, 27 Jul 2016 13:53:05 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.48.17 with HTTP; Wed, 27 Jul 2016 13:53:05 -0700 (PDT) From: Sender Name <example@example.com> Date: Wed, 27 Jul 2016 14:53:05 -0600 Message-ID: <CAN_P_JMvV7ZpAQhOnDienypLrJmuhN=LQWweu4yScw4jQyXY2w@mail.gmail.com> Subject: Different File Types To: example@example.comom Content-Type: multipart/mixed; boundary=001a113f8ad03e85160538a4343c " ["dkim"]=> string(22) "{@sendgrid.com : pass}" ["content-ids"]=> string(37) "{"ii_1562e2169c132d83":"attachment1"}" ["to"]=> string(26) "example@example.comom" ["html"]=> string(479) "<div dir="ltr">Here's an email with multiple attachments<div><br></div><div><img src="cid:ii_1562e2169c132d83" alt="Inline image 1" width="455" height="544"><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><img src="https://sendgrid.com/brand/sg-logo-email.png" width="96" height="17"><br><div><br></div></div></div> </div></div> " ["from"]=> string(33) "Sender Name example@example.com" ["text"]=> string(139) "Here's an email with multiple attachments " ["sender_ip"]=> string(14) "209.85.223.169" ["spam_report"]=> string(844) "Spam detection software, running on the system "mx0047p1mdw1.sendgrid.net", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see @@CONTACT_ADDRESS@@ for details. Content preview: Here's an email with multiple attachments [image: Inline image 1] -- [...] Content analysis details: (2.6 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.8 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.0 HTML_MESSAGE BODY: HTML included in message 1.8 HTML_IMAGE_ONLY_08 BODY: HTML: images with 400-800 bytes of words 0.0 T_MIME_NO_TEXT No text body parts " ["envelope"]=> string(66) "{"to":["example@example.comom"],"from":"example@example.com"}" ["attachments"]=> string(1) "2" ["subject"]=> string(20) "Different File Types" ["spam_score"]=> string(5) "2.597" ["attachment-info"]=> string(287) "{"attachment2":{"filename":"DockMcWordface.docx","name":"DockMcWordface.docx","type":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"},"attachment1":{"filename":"MG_2359.jpg","name":"_MG_2359.jpg","type":"image/jpeg","content-id":"ii_1562e2169c132d83"}}" ["charsets"]=> string(77) "{"to":"UTF-8","html":"UTF-8","subject":"UTF-8","from":"UTF-8","text":"UTF-8"}" ["SPF"]=> string(4) "pass" }