Pythonでメール・プッシュ通知を送信する方法。smtplib+emailとFCM(firebase_admin)
Pythonからユーザーへ通知を送る2つの方法を、この記事1本にまとめて解説します。
- メール送信 — 標準ライブラリの
smtplib+emailパッケージ - プッシュ通知 — FCM(Firebase Cloud Messaging)+
firebase_admin
1. smtplibとemailパッケージでメール送信
smtplibとは?
smtplib は、メールサーバーへメールを送るためのSMTPクライアントを提供する標準ライブラリです。基本的には次の3つを覚えておけばメールを送れます。
- メールサーバーとの接続:
SMTP() - メール送信:
sendmail() - 接続終了:
quit()
import smtplib
smtp = smtplib.SMTP('<メールサーバーホスト>', <接続先ポート>)
smtp.sendmail('<Fromアドレス>', '<Toアドレス>', 送信メール)
smtp.quit()
参考: smtplib — SMTP プロトコルクライアント
emailパッケージとは?
email は電子メールとMIME処理のための標準パッケージです。メッセージの表現、国際化されたヘッダーなどの機能を提供します。今回は次のクラスを利用します。
from email.mime.text import MIMEText # テキストのMIMEオブジェクト
from email.header import Header # 国際化ヘッダー
from email.utils import formatdate # RFC 2822形式の日付
参考: email — 電子メールと MIME 処理のためのパッケージ
メール送信のサンプルコード
ローカルのPostfix(CentOS)をメールサーバーとして使用する例です。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formatdate
from_address = 'test@test-server.com'
to_address = 'sample@example.com'
charset = 'UTF-8'
subject = 'テスト'
message = 'これはテストです。これはテストです。'
msg = MIMEText(message, 'plain', charset)
msg['Subject'] = Header(subject, charset)
msg['From'] = from_address
msg['To'] = to_address
msg['Date'] = formatdate(localtime=True)
smtp = smtplib.SMTP('localhost')
smtp.sendmail(from_address, to_address, msg.as_string())
smtp.quit()
サーバー上で実行すると /var/log/maillog にログが出力され、メールが送信されたことを確認できます。
$ tail /var/log/maillog
Sep 6 00:20:23 test-server postfix/qmgr[21934]: D2814209C856: from=<test@test-server.com>, size=585, nrcpt=1 (queue active)
Sep 6 00:20:25 test-server postfix/smtp[24667]: D2814209C856: to=<sample@example.com>, relay=..., status=sent (250 2.0.0 OK ...)
外部のSMTPサーバー(認証あり)を使う場合は、smtp.starttls() と smtp.login(ユーザー, パスワード) を接続後に呼び出します。認証情報はコードにベタ書きせず環境変数から読み込みましょう。
2. FCM + firebase_adminでプッシュ通知
FCM(Firebase Cloud Messaging)を使うと、Pythonのサーバーサイドからスマホアプリ・WebへPUSH通知を送信できます。
前提
- FCMのプロジェクトが作成されていること
- アプリ構成やウェブプッシュ証明書が正しく設定されていること
- iOS/Androidの登録デバイストークンが取得できていること
インストール
pip install firebase_admin
サービスアカウントの秘密鍵を取得
- Firebaseコンソールで「設定」→「サービス アカウント」を開く
- 「新しい秘密鍵の生成」→「キーを生成」をクリック
- キーを含むJSONファイルをダウンロードする
このJSONファイルは認証情報そのものなので、リポジトリにコミットしないよう注意してください。
PUSH通知を送信
MY_TOKEN に登録済みのデバイストークンを設定します。
import firebase_admin
from firebase_admin import credentials, messaging
cred = credentials.Certificate('service-account-file.json')
firebase_admin.initialize_app(cred)
MY_TOKEN = 'XXXXXXXXXXXXXXXXX'
message = messaging.Message(
notification=messaging.Notification(
title='test title',
body='test body',
),
token=MY_TOKEN,
)
response = messaging.send(message)
print(response)
次のようなレスポンスが返れば正しく動作しています。
projects/sample-fcm-xxxxx/messages/16249582291634887
参考: 送信リクエストを承認する / サーバー側からトピックを管理する
まとめ
| 通知手段 | 方法 |
|---|---|
| メール | smtplib + email(MIMEText/Header/formatdate) |
| プッシュ通知 | FCM + firebase_admin(サービスアカウント鍵で認証) |
Djangoアプリからのメール送信は、フレームワークの仕組みを使う方が簡単です。Djangoの環境設定・運用まとめを参考にしてください。