【Python標準ライブラリ編 #6】smtplibでメールを自動送信!デイリーリマインダーを作ろう

ALL

こんにちは、Tech Samuraiです!
前回の記事「csvでデータ処理!簡単な売上レポートジェネレーターを作ろう」では、CSVファイルを自在に操り、データ処理を自動化する方法を探検しました。

これまでのプログラムは、処理が完了すると静かに終了するだけでした。しかし、もしプログラムの実行結果や、毎日決まったタスクリストを、あなたの手元に**メールで自動的に通知**してくれるとしたら、どうでしょう?

今回のテーマは、Pythonを使ってプログラムの世界から現実世界へ「手紙」を送る方法、すなわち**メールの自動送信**です。Pythonの標準ライブラリである**`smtplib`**と**`email`**を使い、**指定した内容のメールを自動で送信する「デイリーリマインダー」**の基礎を開発します。この技術は、あらゆる自動化プロジェクトの「通知」部分を担う、非常に重要なものです。


【超重要】ステップ0:セキュリティ – パスワードの安全な扱い方

メールを送信するには、あなたのメールアカウントで認証(ログイン)する必要があります。しかし、**スクリプトの中に直接パスワードを書き込むのは、絶対にやってはいけない、最も危険な行為です。**

# !!! 絶対にやってはいけない悪い例 !!!
my_password = "MySecretPassword123" 

もしこのコードをGitHubなどで誤って公開してしまえば、あなたのアカウントは一瞬で乗っ取られてしまいます。そこで、プロが行う2つの安全な方法を学びましょう。

1. アプリパスワードの利用(Gmailの場合)

Gmailなどのサービスでは、通常のログインパスワードとは別に、プログラムなどのアプリ専用の**「アプリパスワード」**を発行できます。これは16桁の使い捨てパスワードで、万が一漏洩しても、このアプリパスワードを無効にするだけで済み、本体のGoogleアカウントのパスワードには影響がありません。

  1. Googleアカウントにアクセスし、「セキュリティ」→「2段階認証プロセス」を有効にします。
  2. 2段階認証プロセスを有効にした後、同じページの「アプリパスワード」に進み、新しいパスワードを生成します。

2. 環境変数にパスワードを保存

生成したアプリパスワードを、スクリプトの外、つまりOSの**「環境変数」**に保存するのが最も安全な方法です。

  • **Linux/macOS:** ターミナルで export MY_EMAIL_PASSWORD="あなたのアプリパスワード" を実行。
  • **Windows:** 「システムのプロパティ」→「環境変数」から設定。

Pythonからは、`os`モジュールを使ってこの値を安全に読み出せます。

import os
# 環境変数からパスワードを読み込む
my_password = os.environ.get('MY_EMAIL_PASSWORD')

ステップ1:メール本体の作成 – `email.message`

次に、メールの件名、送信元、宛先、そして本文といった「手紙」そのものを作成します。これには`email.message`モジュールの`EmailMessage`クラスを使います。

from email.message import EmailMessage

# 1. メールの器を作成
msg = EmailMessage()

# 2. メールの内容を設定
msg.set_content("これはPythonから送信されたテストメールです。\n今日のタスクを思い出しましょう!")
msg['Subject'] = '今日のデイリーリマインダー'
msg['From'] = 'your_email@gmail.com' # あなたのメールアドレス
msg['To'] = 'recipient_email@example.com' # 送信先のメールアドレス

ステップ2:メールの送信 – `smtplib`

手紙が書けたら、いよいよそれを届ける「郵便屋さん」である`smtplib`の登場です。Gmailを例に、SMTPサーバーに接続してメールを送信します。

import smtplib
import os
from email.message import EmailMessage

# (ステップ0と1で準備したコード)
SENDER_EMAIL = "your_email@gmail.com"
APP_PASSWORD = os.environ.get('MY_EMAIL_PASSWORD')
RECEIVER_EMAIL = "recipient_email@example.com"

# --- メッセージオブジェクトの作成 ---
msg = EmailMessage()
msg.set_content("これはPythonから送信されたテストメールです。")
msg['Subject'] = 'Pythonからの通知'
msg['From'] = SENDER_EMAIL
msg['To'] = RECEIVER_EMAIL

# --- メールの送信処理 ---
try:
    # 1. GmailのSMTPサーバーに接続
    # smtp.gmail.com はGmailのサーバー名, 587 はポート番号
    server = smtplib.SMTP('smtp.gmail.com', 587)
    # 2. 暗号化通信(TLS)を開始
    server.starttls()
    # 3. アプリパスワードでログイン
    server.login(SENDER_EMAIL, APP_PASSWORD)
    # 4. メールを送信
    server.send_message(msg)
    # 5. サーバーとの接続を閉じる
    server.quit()
    print("メールを正常に送信しました。")

except Exception as e:
    print(f"エラー: メールの送信に失敗しました - {e}")


まとめ

今回は、Pythonの標準ライブラリ`smtplib`と`email`を使い、プログラムから自動でメールを送信する方法を探検しました。

  • スクリプトにパスワードを直接書かず、**アプリパスワード**と**環境変数**で安全に扱う重要性。
  • メールの件名や本文を作成する`email.message`ライブラリ。
  • SMTPサーバーに接続し、メールを配送する`smtplib`ライブラリの一連の流れ。

このスクリプトを、以前学んだcronやタスクスケジューラと組み合わせれば、毎朝決まった時間にリマインダーを送ったり、長時間かかる処理の終了を通知したりと、あなたの自動化プロジェクトの可能性は無限に広がります。

さて、PCのローカルな操作から、メールというインターネットを通じた通信までできるようになりました。次回は、あなたのPCそのものを、**たった一行のコマンドで簡易的なWebサーバーに変身させる**、Pythonの隠れた逸品**`http.server`**ライブラリを探検します。お楽しみに!

コメント

タイトルとURLをコピーしました