PythonでGmailから添付ファイル付きメールを送信する方法【smtplib活用】
はじめに
この記事では、Pythonを使って添付ファイル付きのメールを送信する方法を解説します。メール送信には外部ライブラリは不要で、Pythonに標準搭載されている「smtplib」モジュールを使用します。smtplibは、SMTP(Simple Mail Transfer Protocol)を利用してメールを送信するためのモジュールで、SMTPクライアントセッションオブジェクトを生成して送信処理を行います。
SMTPを利用するには、有効な送信元・宛先のメールアドレスとポート番号が必要です。ポート番号はサービスによって異なり、たとえばGoogle(Gmail)の場合は587番を使用します。
まずは、メール送信に必要なモジュールをインポートします。
import smtplib
さらに柔軟なメール作成のために、MIME(Multipurpose Internet Mail Extension)モジュールも併用します。MIMEヘッダーには送信者や受信者の情報などの詳細を格納でき、メールへの添付ファイルの設定にもMIMEが必要になります。
Gmailで送信するための事前設定
本記事では、GoogleのGmailサービスを使ってメールを送信します。Googleのセキュリティポリシーにより、あらかじめ設定が必要な場合があります。設定を行っていない場合、Googleがサードパーティ製アプリからのアクセスを許可せず、後述のコードが動作しないことがあります。
アクセスを許可するには、Googleアカウントの「安全性の低いアプリのアクセス」設定を有効にします。なお、2段階認証を有効にしている場合は、「安全性の低いアプリのアクセス」を使用できません。
設定を行うには、Googleの管理コンソールにアクセスし、「安全性の低いアプリ」の設定を検索してください。

補足: 近年、Googleは「安全性の低いアプリのアクセス」を段階的に廃止しています。2段階認証を有効にしている場合は、通常のパスワードの代わりにGoogleアカウントで発行できる「アプリパスワード」を使用することを推奨します。
smtplibを使った添付ファイル付きメール送信の手順
- MIMEオブジェクトを作成する
- MIMEに送信者・受信者のアドレスを追加する
- MIMEにメールの件名を追加する
- MIMEに本文を追加する
- 添付するファイルをバイナリモードで開く
- バイトストリームを読み込み、base64エンコード方式で添付ファイルをエンコードする
- 添付ファイル用のヘッダーを追加する
- 適切なセキュリティ機能と有効なポート番号でSMTPセッションを開始する
- システムにログインする
- メールを送信して終了する
サンプルコード
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
# メール本文
mail_content = '''Hello,
This is a test mail.
In this mail we are sending some attachments.
The mail is sent using Python SMTP library.
Thank You
'''
# 送信者・受信者のメールアドレスとパスワード
sender_address = 'sender123@gmail.com'
sender_pass = 'xxxxxxxx'
receiver_address = 'receiver567@gmail.com'
# MIMEのセットアップ
message = MIMEMultipart()
message['From'] = sender_address
message['To'] = receiver_address
message['Subject'] = 'A test mail sent by Python. It has an attachment.' # 件名
# 本文と添付ファイルの設定
message.attach(MIMEText(mail_content, 'plain'))
attach_file_name = 'TP_python_prev.pdf'
attach_file = open(attach_file_name, 'rb') # ファイルをバイナリモードで開く
payload = MIMEBase('application', 'octate-stream')
payload.set_payload((attach_file).read())
encoders.encode_base64(payload) # 添付ファイルをbase64でエンコード
# ファイル名を含むペイロードヘッダーを追加
payload.add_header('Content-Decomposition', 'attachment', filename=attach_file_name)
message.attach(payload)
# メール送信用のSMTPセッションを作成
session = smtplib.SMTP('smtp.gmail.com', 587) # Gmailの587番ポートを使用
session.starttls() # セキュリティ(TLS)を有効化
session.login(sender_address, sender_pass) # メールアドレスとパスワードでログイン
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()
print('Mail Sent')
実行結果
D:\Python TP\Python 450\linux>python 327.Send_Mail.py Mail Sent
コードを実行すると、指定した宛先に添付ファイル付きのメールが送信されます。受信側では以下のようにメールが届いていることを確認できます。

-
【解決】Gmailで「メッセージが配信されませんでした」と表示される場合の対処法|「Send mail as(別のアドレスから送信)」機能のエラーを修正
Gmailの「メッセージが配信されませんでした」エラーとは Gmailで「メッセージが配信されませんでした。別のアドレスまたはエイリアスから「Send mail as(別のアドレスから送信)」機能を使用して送信しています」というエラーが表示される場合、メールの送信に使用した追加のメールアカウントの設定が正しく行われていないことが原因です。 Gmailには、自分が所有する別のメールアドレスを使ってメールを送信できる「Send mail as(別のアドレスから送信)」機能が用意されています。この機能を利用するには、使用したいメールアカウントに必要な設定情報(ユーザー名・パスワード・SMTPサーバー
-
Gmailアカウントを削除する方法をわかりやすく解説
スパムメールやショッピングサイトからの宣伝メールにうんざりしている、古いGmailアカウントをもう使っていない、あるいはアカウントが不正アクセスされた疑いがある——そんなときは、Gmailアカウントを削除するのがひとつの選択肢です。実は、Gmailアカウントだけを削除しても、YouTubeなどその他のGoogleアカウントはそのまま残しておくことができます。Gmailアカウントを削除する前の準備Gmailアカウントの削除作業自体はとても簡単です。ただし、削除を実行する前に、以下の点を必ず確認しておきましょう。そのメールアドレスで登録していたサービス(サブスクリプションやSNSなど)の登録解除銀