Pythonで添付ファイル付きメールを送信する方法【サンプルコード付き】
テキスト本文と添付ファイルなど、複数の種類のコンテンツを混在させたメール(MIMEマルチパートメール)を送信するには、Content-Typeヘッダーをmultipart/mixedに設定する必要があります。その上で、本文と添付ファイルの各セクションをboundary(境界線)によって区切ります。
boundary(境界線)とは
boundaryは「2つのハイフン(--)+ 一意な文字列」の形式で表されます。この文字列は、メール本文中に絶対に出現しないものを選ぶ必要があります。また、メールの最後のセクションを示す最終boundaryは、末尾にもう2つのハイフンを付けて「--boundary--」のように記述します。
さらに、添付ファイルは送信前にbase64形式でエンコードしておくのが基本です。Pythonでは標準ライブラリの base64.b64encode() を使って簡単にエンコードできます。
添付ファイル付きメール送信のサンプルコード
以下は、/tmp/test.txt を添付ファイルとしてメール送信する例です(Python 3対応版)。実際に動かしてみましょう。
#!/usr/bin/python
import smtplib
import base64
filename = "/tmp/test.txt"
# ファイルを読み込み、base64形式にエンコードする
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent).decode() # base64エンコード
sender = 'webmaster@tutorialpoint.com'
reciever = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER" # 本文に出現しない一意な境界文字列
body = """
これは添付ファイルを送信するためのテストメールです。
"""
# メインヘッダーの定義
part1 = """From: From Person <me@fromdomain.net>
To: To Person <amrood.admin@gmail.com>
Subject: Sending Attachment
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# メール本文パートの定義
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body, marker)
# 添付ファイルパートの定義
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" % (filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, reciever, message)
print("メールの送信に成功しました")
except Exception:
print("エラー: メールを送信できませんでした")
コードのポイント解説
- part1: 差出人・宛先・件名などの基本ヘッダーに加え、
Content-Type: multipart/mixedと使用するboundary名(marker)を宣言しています。 - part2: プレーンテキストのメール本文パートです。
text/plainとして8ビットで送信され、末尾に次のパートとの境界が置かれます。 - part3: 添付ファイルのパートです。
Content-Disposition: attachmentにより添付扱いとなり、ファイル内容はbase64エンコードされて埋め込まれます。最終boundaryは「--%s--」のようにハイフンで閉じられています。
より実用的な方法:emailモジュールの活用
上記のようにヘッダーを手動で組み立てる方法は仕組みの理解に役立ちますが、実務では標準ライブラリの email.mime.text や email.mime.multipart、email.mime.application などを利用するのがおすすめです。これらを使うと、boundaryの生成やbase64エンコード、ヘッダーの構築を自動的に行えるため、フォーマットミスによる送信エラーを防げます。
-
Pythonのbase64モジュールを使ったデータエンコード・デコード入門
PythonにおけるBase64エンコーディングとはPython標準ライブラリのbase64モジュールは、バイナリデータをプレーンテキスト(ASCII)プロトコルで安全に送信できる形式へ変換するための機能を提供します。メール送信、URLへの埋め込み、HTTP POSTリクエストなど、テキストベースの通信経路でバイナリデータを扱いたい場面で活躍するモジュールです。このモジュールが実装しているのは、RFC 3548で定義されたBase16、Base32、Base64の各アルゴリズム、および事実上の標準となっているAscii85とBase85のエンコーディングです。RFC 3548準拠のエンコーディ
-
PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法
はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c