Pythonでメール・プッシュ通知を送信する方法。smtplib+emailとFCM(firebase_admin)

Pythonでメール・プッシュ通知を送信する方法。smtplib+emailとFCM(firebase_admin)

Pythonからユーザーへ通知を送る2つの方法を、この記事1本にまとめて解説します。

  1. メール送信 — 標準ライブラリの smtplib + email パッケージ
  2. プッシュ通知 — 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

サービスアカウントの秘密鍵を取得

  1. Firebaseコンソールで「設定」→「サービス アカウント」を開く
  2. 「新しい秘密鍵の生成」→「キーを生成」をクリック
  3. キーを含む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の環境設定・運用まとめを参考にしてください。

技術ブログ一覧へ戻る