Alibaba Cloud上でSendGridのWeb APIを使ったメール送信方法

Alibaba CloudではOP25Bを実施し、インターネットへのSMTP(25番ポート)が制限されています。そこで、前回の記事ではSendGridをPostfixに連携してSMTP(25番ポート)でメールを送信する方法を紹介しました。

前回の記事:Alibaba Cloud ECSからのメール送信について

Alibaba Cloud ECSからのメール送信について

前回で紹介したようにAlibaba Cloudでサーバからメール配信する方法は主に3つあります。

  1. ECSにMTAを構築してメールの配信環境を作る
  2. 外部のメール送信サービスを利用する(SMTP利用)
  3. 外部のメール送信サービスを利用する(WebAPI利用)

本記事は外部のメール配信サービスを利用したWebAPIでのメール送信方法を紹介します。

SendGridでは7つの言語(C#, Go, Java, PHP, Node.js, Ruby, Python)向けにWeb APIも提供しています。関連APIのソースコードはGitHubで公開されています。ここで、SendGridのWeb APIを利用してpythonのサンプルコードを作成します。

リンク: https://github.com/sendgrid/sendgrid-python#usage

前提条件

  • サーバ環境が構築済み
  • SendGridアカウントが作成済み
  • Python環境設定済み

詳しい内容は前回の記事をご参照ください。

(オプション)

Pythonの編集は色んな方法がありますが、ここではJupyter notebookを推薦します。Jupyter notebookとは「ブラウザを使って開発できるComputing platform」です。コメントラインと違って、ノートブックと呼ばれる形式です。計算の中間結果とか簡単に視覚化できるし、実行結果を記録しながら、データの分析作業を進めることができ、データサイエンスの研究者達の間でもよく使われます。詳しい設定内容は下記のリンクをご参照ください。

リンク: http://qiita.com/sbcnan/items/a9a67483f7d746639852

Sendgrid環境構築

(1)APIキー作成

まず、Web APIを利用するにはAPIキーが必要なのでAPIキーを作成します。

アカウント作成が終わったらAPIキーを作成します。SendGridではAPIキーの作成と権限設定ができます。

(2)環境変数の設定

APIキー環境変数の設定を行います。コマンドラインで次の命令を行います。

$echo "export SENDGRID_API_KEY='YOUR_API_KEY'" > sendgrid.env
$echo "sendgrid.env" >> .gitignore
$source ./sendgrid.env

(3)SendGridのPython APIをインストールする

$apt-get install pip
$pip install sendgrid
$pip install python_http_client

(4)テストメールを送信する

$curl --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"personalizations": [{"to": [{"email": "test1@example.com"}]}],"from": {"email": "test2@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'

ここでAPIキーとメールを入力してコマンドを行うと、メールが届けるはずです。

Pythonを使ってメールを送信する

(1)メールのサンプロコードを作成する

送信サンプルコードを作って見ましょう。ここではpythonを使って操作します。

import json
import os
import urllib2
from sendgrid.helpers.mail import *
from sendgrid import *

def build_email():
    from_email = Email("test@examples.com") #送信アドレス
    to_email = Email("test@examples.com")   #受信アドレス
    subject = "test mail"                   #件名
    data = "Hello, This is test mail!"      #内容
    content = Content("text/plain", data)
    mail = Mail(from_email, subject, to_email, content)
    return mail.get()

def send_email():
    sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
    data = build_email()
    response = sg.client.mail.send.post(request_body=data)
    print(response.status_code)
    print(response.headers)
    print(response.body)

send_email()

build_emailでメール情報を変更して実行するとメールが届きます。そしてpythonで下記のメッセージが見えるはずです。

202
Server: nginx
Date: Wed, 28 Jun 2017 01:35:46 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 0
Connection: close
X-Message-Id: DT2-mmdlSACLXN-cJLa4KQ
X-Frame-Options: DENY
Access-Control-Allow-Origin: https://sendgrid.api-docs.io
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Authorization, Content-Type, On-behalf-of, x-sg-elas-acl
Access-Control-Max-Age: 600
X-No-CORS-Reason: https://sendgrid.com/docs/Classroom/Basics/API/cors.html

(2)401エラーについて

もし次のように401エラーが出ると、おそらくAPIキーか環境変数の設定が間違っている場合が多いです。

HTTPError: HTTP Error 401: Unauthorized

まずAPIキーが間違ってないかを確認します。もしAPIキーが間違ってない場合、環境変数の設定を確認する必要があります。pythonで次のコマンドを行います。

import os
apikey=os.environ.get('SENDGRID_API_KEY')
print apikey

ここでNoneが出たら、APIキーの環境設定が間違っている可能性が高いのでもう一度確認する必要があります。

まとめ

SendGridのWeb APIを使うことでクラウドサーバからメール送信ができます。本ドキュメントではpythonを利用して簡単なサンプルコードを作成してみました。SendGridのPython APIにはほかの機能もあって、便利に使えます。

関連リンク:Web API for Python example code

この記事をシェアする