search
LoginSignup
0

posted at

updated at

Organization

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

blastengineはシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。

今回はblastengineを使ってPythonでメール送信を行うまでの流れを解説します。

ユーザ登録する

blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。

getting-started-4.jpg

送信元ドメインのSPFを設定する

送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

txt @ v=spf1 include:spf.besender.jp ~all

API経由で配信する

まずはAPIを使ってHTMLメールを配信する流れを紹介します。今回利用するライブラリは下記のrequestsです。

requests · PyPI

HTTPアクセスできるライブラリがあれば良いので、好きなものを利用してください。Pythonプロジェクトの作成と、ライブラリのインストール用コマンドを実行します。

$ mkdir blastengine-test
$ cd blastengine-test
$ echo "requests" >> requirements.txt
$ pip install -r requirements.txt

APIキーを取得する

ログイン後、管理画面の右上にある設定メニューに移動します。

getting-started-6.jpg

そして設定の中で、APIキーを取得します。

getting-started-5.png

ライブラリを読み込む

まず必要なライブラリを読み込みます。上記の requests に加えて、JSONを扱う json 、ハッシュを作成する hashlib なども読み込みます。

import os
import sys
import requests
import json
import hashlib
import base64

必要な変数を取得

今回はターミナル(コマンドプロンプト)から実行します。その際にユーザIDとAPIキーを渡す仕組みにしますので、スクリプト側で入力値を受け取ります。また、両方とも必須なので、入力がなかったらエラーとします。

user_id = os.environ['BE_USERID']
api_key = os.environ['BE_APIKEY']

トークンを生成する

APIリクエストするためのトークンを生成します。手順としては次のとおりです。

  1. ユーザIDとAPIキーを連結する
  2. SHA256のハッシュを生成する
  3. ハッシュを全て小文字にする
  4. 3の文字列をBASE64エンコードする

実際のコードで言うと、次のようになります。 token がトークンです。

digest = hashlib.sha256(f'{user_id}{api_key}'.encode()).hexdigest()
token = base64.b64encode(digest.encode()).decode('utf-8')

メールを送信する

では実際にメールを送信します。APIのエンドポイントは https://app.engn.jp/api/v1/deliveries/transaction になります。生成したトークンは Authorization ヘッダーに適用します。fromのemailやtoなど、メールアドレスは利用されるものに書き換えてください。

url = 'https://app.engn.jp/api/v1/deliveries/transaction'
entity = {
	'from': {
		'email': 'no-reply@example.jp',
		'name': '送信者サンプル'
	},
	'to': 'test@example.com',
	'subject': 'テスト件名',
	'encode': 'ISO-2022-JP',
	'text_part': 'テスト配信',
	'html_part': '<!DOCTYPE html><html><header></header><body>sample html</body></html>'
}
headers = {
	'Authorization': f'Bearer {token}',
  'content-type': 'application/json'
}
response = requests.post(url, data=json.dumps(entity), headers=headers)

結果

レスポンスを出力します。配信ID(delivery_id)は照会、変更および削除操作に必要です。

if response.status_code > 300:
	print('Error')
print(json.dump(json.loads(response.content), sys.stdout, ensure_ascii=False))
# { delivery_id: 9 }

実行する

では実際にターミナル、またはコマンドプロンプトから実行してみます。 YOUR_USER_IDYOUR_API_KEY はそれぞれ皆さんのものに置き換えてください。

$ BE_USERID=YOUR_USER_ID BE_APIKEY=YOUR_API_KEY python text.py
{ delivery_id: 9 }

全体のコード

今回のサンプルコードは次のようになります。実装時の参考にしてください。

import os
import sys
import requests
import json
import hashlib
import base64

user_id = os.environ['BE_USERID']
api_key = os.environ['BE_APIKEY']

digest = hashlib.sha256(f'{user_id}{api_key}'.encode()).hexdigest()
token = base64.b64encode(digest.encode()).decode('utf-8')

url = 'https://app.engn.jp/api/v1/deliveries/transaction'
entity = {
	'from': {
		'email': 'no-reply@example.jp',
		'name': '送信者サンプル'
	},
	'to': 'test@example.com',
	'subject': 'テスト件名',
	'encode': 'ISO-2022-JP',
	'text_part': 'テスト配信',
	'html_part': '<!DOCTYPE html><html><header></header><body>sample html</body></html>'
}
headers = {
	'Authorization': f'Bearer {token}',
  'content-type': 'application/json'
}
response = requests.post(url, data=json.dumps(entity), headers=headers)
if response.status_code > 300:
	print('Error')
print(json.dump(json.loads(response.content), sys.stdout, ensure_ascii=False))

SMTPリレーでの配信

次にSMTPリレーを使った方式です。こちらは標準ライブラリであるsmptlibを利用します。

IPアドレスの登録

SMTPリレーを利用する場合、まず接続元サーバのIPアドレスを管理画面で登録する必要があります。

getting-started-6.jpg

IPアドレスの設定ダイアログで、接続元サーバのIPアドレスを入力してください。

getting-started-7.jpg

ライブラリを読み込む

API経由での実行時と同じように、必要なライブラリを読み込みます。

import smtplib
from email.mime.text import MIMEText

初期化する

smtplibを初期化して、配信用オブジェクトを作成します。

server = smtplib.SMTP("smtp.engn.jp", 587)

blastengineのSMTPサーバアドレスは smtp.engn.jp 固定になります。ポート番号は25/587/2525より選択できます。

配信する

実際の配信情報はMIMETextを利用します。Fromや宛先はそれぞれ書き換えてください。送信完了後はサーバーとの接続を閉じます。

message = "<div>これはSMTPサーバー経由で送信したメールです</div>"
msg = MIMEText(message, "html")
msg["Subject"] = "blastengineからのメール"
msg["To"] = "user@example.com"
msg["From"] = "no-reply@example.jp"
# メールを送信する
errors = server.send_message(msg)
if isinstance(errors, dict) and len(errors) > 0:
    logger.warn(f'''送信失敗した宛先:  {errors}''')
# 閉じる
server.quit()

全体のコード

今回のサンプルコードは次のようになります。実装時の参考にしてください。

import smtplib
from email.mime.text import MIMEText

# メッセージ内容を作成
message = "<div>これはSMTPサーバー経由で送信したメールです</div>"
msg = MIMEText(message, "html")
msg["Subject"] = "blastengineからのメール"
msg["To"] = "user@example.com"
msg["From"] = "no-reply@example.jp"

# サーバに接続
server = smtplib.SMTP("smtp.engn.jp", 587)
# メールを送信する
errors = server.send_message(msg)
if isinstance(errors, dict) and len(errors) > 0:
    logger.warn(f'''送信失敗した宛先:  {errors}''')
# 閉じる
server.quit()

まとめ

クラウドサービスではSMTPポートが塞がれている場合があるので、そうした時にはAPI経由を利用してください。SMTPリレーを使えば、より信頼性高く、安定した配信が実現できるでしょう。

APIとSMTPリレー、それぞれの要件に合わせて最適な方を選択してください。

エンジニア向けメール配信システム「ブラストエンジン」

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0