Pythonでメールを送信する - SMTP & Email Sending API

Customers Mail Cloudではメール送信に際して、SMTPとAPIの二種類を提供しています。昔からの使い慣れたSMTPを使っても良いですし、SMTPのポート制限されている場合でも使えるAPIを利用しても良いでしょう。

今回はこの二つのメール送信方法について、Pythonから利用する方法を紹介します。

APIユーザを作成する

API設定画面にて、APIユーザを作成します。アクセス権限として、SMTPは必須になります。API経由での配信を行う場合はSMTPに加えて、HTTP-APIも有効にしてください。

f:id:moongift:20190524133446p:plain

SMTPを使ったメール送信について

標準ライブラリだけで実装します。SMTPサーバのアドレスは指定されたものに置き換えてください。まず必要な変数を定義します。

# SMTPサーバ経由での送信です
api_user = "api@smtps.jp";
api_key  = "YOUR_API_KEY";
from_address = "info@smtps.jp";
from_name = "Mailer";
to_address = "to@smtps.jp";
to_name = "John Doe";
smtp_host = "sandbox.smtps.jp";
smtp_port = 10025;

# メール配信内容です
subject = "テストメール from Customers Mail Cloud";
body = "こんにちは。\r\n\r\n改行を入れました。";

メール送信には標準ライブラリの smtplibMIMEText を使います。

import smtplib
from email.mime.text import MIMEText

MIMETextを使ってメール送信内容のオブジェクトを作ります。

msg = MIMEText(body)
msg["Subject"] = subject
msg["To"] = f'{to_name} <{to_address}>'
msg["From"] = f'{from_name} <{from_address}>'

そしてSMTPサーバに接続します。その際、APIユーザとAPIキーを認証情報として指定します。

server = smtplib.SMTP(smtp_host, smtp_port)
server.login(api_user, api_key)

後はメール送信を実行します。

server.send_message(msg)
server.quit()

これでSMTP経由でのメール送信が完了します。

API経由でのメール送信について

APIサーバについて

APIサーバのエンドポイントURLは契約しているプランによって異なりますのでご注意ください。

プラン名 エンドポイントURL
無料トライアル https://sandbox.smtps.jp/api/v2/emails/send.json
Standardプラン https://te.smtps.jp/api/v2/emails/send.json
Proプラン https://SUBDOMAIN.smtps.jp/api/v2/emails/send.json

SUBDOMAINは、サービス利用開始時に申請いただいたものです

変数を設定する

変数はSMTPサーバ利用時とほぼ同等、SMTPサーバの代わりにエンドポイントURLを指定します。

# SMTPサーバ経由での送信です
api_user = "api@smtps.jp";
api_key  = "YOUR_API_KEY";
from_address = "info@smtps.jp";
from_name = "Mailer";
to_address = "to@smtps.jp";
to_name = "John Doe";

# メール配信内容です
subject = "テストメール from Customers Mail Cloud";
body = "こんにちは。\r\n\r\n改行を入れました。";
url = "https://sandbox.smtps.jp/api/v2/emails/send.json";

配信内容は辞書形式で指定します。

data = {
    "api_user": api_user,
    "api_key": api_key,
    "to": [{
        "name": to_name,
        "address": to_address
    }],
    "from": {
        "name": from_name,
        "address": from_address
    },
    "subject": subject,
    "text": body
}

辞書の内容については 共通仕様 | Customers Mail Cloud を参照してください。

送信を行う

ではAPIサーバのエンドポイントURLと配信情報のパラメータを使ってメール送信を行います。メール送信APIはPOSTメソッドを使います。HTTPアクセス標準ライブラリの urllib.request を使います。また、辞書からJSONに変換するために json もインポートします。

import urllib.request
import json

インポートしたら、HTTPメソッドとヘッダーの定義をし、HTTPリクエストオブジェクトを作成します。

method = "POST"
headers = {
    "Content-Type": "application/json",
    "Accept": "application/json"
}

json_data = json.dumps(data).encode("utf-8")
request = urllib.request.Request(url, data=json_data, method=method, headers=headers)

そしてHTTPリクエストを実行します。

try:
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")
    print(response_body)
except urllib.error.HTTPError as err:
    print(err.read())

送信が成功すると、下記のようにメールIDが返ってきます。

{"id":"\u003C1027790501.15820.1560515882392@mta01.sandbox.smtps.jp\u003E"}

エラーがあると、下記のようにエラー内容が返ってきます。

b'{"errors":[{"code":"02-001","field":"text","message":"text is required."}]}'

まとめ

サーバ上の制限によってSMTPが使えない場合でもHTTP経由でメール配信が行えますので、APIをぜひ使ってみてください。今回はPythonを使いましたが、汎用的なHTTPアクセスを行っていますので、他のプログラミング言語でも簡単に実装できるでしょう。

さらに詳しい使い方についてはEmail Sending APIを参照してください。