Python で添付ファイル付きメール送信 - Gmail SMTP

ここでは Python で Gmail の SMTPサーバを使って、添付ファイル付きのEメールを送信する方法についてご説明します。

Gmail の SMTPサーバ

Python のプログラムから E メールを送るには SMTP サーバが必要です。

使える SMTP サーバがある方はそれを使ってください。

使える SMTP サーバがない方は gmail のアカウントがあれば gmail の SMTP サーバが使えます。

SMTP サーバー:smtp.gmail.com
TLS/STARTTLS のポート: 587 
ユーザー名: Gmail のメールアドレス
パスワード: 生成したアプリパスワード

「アプリパスワード」は Google アカウントの [セキュリティ] の [アプリ パスワード] から生成してください。

Python で添付ファイル付きメール送信 1

「アプリを選択」の箇所では「その他(名前を入力)」を選んでください。名前はなんでも大丈夫です。

Python で添付ファイル付きメール送信 2

Python で添付ファイル付きメール送信する

Python でメールを送信するには、email パッケージと smtplib モジュールが使えます。

今回は text.xlsx という名前の Excel ファイルを添付してみましょう。

Python で Gmail の SMTPサーバを使って、添付ファイル付きのEメールを送信するコードは以下の通りです。

このスクリプトを実行し、メールの送信が成功すると「Eメールを送信しました。」と出力されます。

以下のような添付ファイルつきのメールが宛先のメールアドレスに届きました。

Python で添付ファイル付きメール送信 3

それでは、コードを順を追ってご説明します。

import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

まず、1 ~ 5 行目で、必要なパッケージとモジュールをインポートしています。

smtplib モジュールは SMTP プロトコルクライアントのモジュールで SMTP サーバに接続してメールを送信するのに使います。

email は電子メールと MIME 処理のためのパッケージです。 MIME は E メールで様々なフォーマットを扱えるようにする規格で、メールを生成するのに使います。

os モジュールはメールの送信とは関係ありませんが、添付ファイルのファイルパスからファイル名だけを取り出すためにインポートしています。


7 ~ 24 行目は SMTP サーバの情報、メールの宛先 (to_address)、件名 (subject)、本文 (body)などの変数を定義しています。

Gmail の SMTP サーバを使う場合は、from_address と stmp_user を同じにして、パスワードは上で生成した「アプリパスワード」を設定しておいてください。

本文は今回 HTML メールにしましたが、プレーンテキストでも大丈夫です。

filepath に test.xlsx ファイルのフルパスを設定してください。


msg = MIMEMultipart()
msg["Subject"] = subject
msg["From"] = from_address
msg["To"] = to_address
msg.attach(MIMEText(body, "html"))

with open(filepath, "rb") as f:
    mb = MIMEApplication(f.read())

mb.add_header("Content-Disposition", "attachment", filename=filename)
msg.attach(mb)

26 ~ 36 行目では E メールメッセージを生成しています。

multipart 形式の MIME メッセージを生成し、そこに、件名 (subject)、送信元のメールアドレス (From)、宛先のメールアドレス (To) を設定しています。

30 行目の msg.attach(MIMEText(body, "html")) で HTML 形式でメール本文をペイロードに追加しています。

32 ~ 36 行目で、添付ファイルを開いて MIMEApplication で添付ファイル用のメッセージオブジェクトを生成し、ヘッダーを追加して、先ほど生成した msg のペイロードに追加しています。


s = smtplib.SMTP(stmp_server, stmp_port)
s.starttls()
s.login(stmp_user, stmp_password)
s.sendmail(from_address, to_address, msg.as_string())
s.quit()

38 ~ 42 行目で、SMTP サーバに接続して、実際にメールを送信しています。

starttls() メソッドで TLS モードで SMTP 接続し、login() メソッドで認証が必要な SMTP サーバにログインしてから、sendmail() メソッドでメールを送信しています。


以上、Python で Gmail の SMTPサーバを使って、添付ファイル付きのEメールを送信する方法についてご説明しました。

© 2024 やさしい Python 入門