たまに、面倒なメール作成作業があります。例えば・・・
- 内容は一緒だけど、メール冒頭の〇〇様だけ変えて複数の人にメール送る場合
- 一人ひとりに違う添付ファイルを送る場合
などです。メール送信作業って結構面倒なことが多いです。単純な作業ですが、ミスなくこなすのは結構難しいです。
しかし、このような面倒な作業はPythonでサクッと自動化出来てしまいます。
そこで、今回はメール作成から送信までPythonで自動化する方法を紹介したいと思います。
今回は
- 複数の宛先にPDFファイルを添付してメールを一斉送信
- 宛先毎に別々のPDFを添付してメールを送信
について紹介します。
多くの人がGmailを使っていると思いますので、Gmailを自動化する方法をお伝えします!
PythonでGmailを操作するための準備
PythonでGmailを操作するためには、まず最初にGmailの設定が必要です。
今回は、Gmailのアプリパスワードを使ってログインします。
PythonでGmailを操作するには勿論、Googleアカウントにログインする必要があります。Gmailの設定は人それぞれだと思いますが、Pythonで経由でログインしようとする場合、通常のパスワードを使ってログインできない場合があります。
ログインできない場合の対策として、Gmailのヘルプページには以下のような方法が示されています。
・アプリ パスワードを使用します。2 段階認証プロセスを使用している場合は、アプリ パスワードを使ってログインしてみます。
・安全性の低いアプリを許可します。2 段階認証プロセスを使用していない場合は、安全性の低いアプリがアカウントにアクセスすることを許可します。
ここでは、安全性を考えて前者のアプリパスワードを使ってログインする方法を採用します。アプリパスワードについてはGmailのヘルプ等をご覧ください
PythonでGmailを自動化:添付ファイル付きメールの送信
Gmailで複数の人に添付ファイルを送信します。
定期的に特定の人に添付ファイルを送ることがルーチン化している人には便利かと思います。
作業内容が決まりきっているので、毎回ブラウザを開いて、ポチポチとアドレスを入力して、添付ファイルを選択して、という単純作業をPythonで一気に省くことができます。
ソースコードは以下の以下のとおりです。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# SMTPサーバーを指定
smtp_server = "smtp.gmail.com"
#ポート番号を指定
port_number = 465
#SMTPサーバーを指定しSSL暗号化通信を開始
server = smtplib.SMTP_SSL(smtp_server, port_number)]
#SMTPサーバからのレスポンス確認(省略可)
response = server.noop()
print(response)
# Gmailアカウントへログイン
account = "自分のe-mailアドレス"
password = "アプリパスワード"
login_response = server.login(account, password)
print(login_response)
#メールの件名、送信者、受信者を設定
msg = MIMEMultipart()
#件名
msg["Subject"] = "GmailをPythonで自動化"
#自分のアドレス
msg["From"] = "自分のアドレス@gmail.com"
#受信者のアドレス
msg["To"] = "Aさんのアドレス@gmail.com, Bさんのアドレス@gmail.com"
#メール送信履歴を残すためにBCCに自分のアドレスを指定
msg["BCC"] = "自分のアドレス@gmail.com"
#本文作成
body = MIMEText("こんにちは")
msg.attach(body)
#添付用のPDFファイルデータの読み込み
pdf = open("test.pdf", mode="rb")
pdf_data = pdf.read()
pdf.close()
#ファイルを添付
attach_file = MIMEApplication(pdf_data)
attach_file.add_header("Content-Disposition", "attachment", filename="test.pdf")
msg.attach(attach_file)
#メールの送信
server.send_message(msg)
#SMTPサーバーとの接続を終了
server.quit()
モジュールのインポート
1〜4行目で今回の作業に必要なライブラリをインポートします。
smtlibはSMTPサーバに接続するために必要なモジュールです。
メールを送信するには、SMTP(Simple Mail Transfer Protocol)と呼ばれるプロトコル(規則)に従う必要があり、メールを送信するためには、SMTPに従いメールを相手に送信してくれるSMTPサーバーに接続する必要があります。
普段Gmailを使っているときはSMTPを気にする必要は無いのですが、Python経由でGmailを操作してメールを送信するためには、送信メール(SMTP)サーバーを指定する必要があります。その役割を担ってくれるのが、smtlibモジュールです。
MIMEMultipartはメールの件名や宛先などを指定するために使用し、MIMETextはメールの本文作成の際に使います。
MIMEApplicationは添付ファイル用のデータを作成するために使います。
SMTPサーバーへの接続とGoogleアカウントへのログイン
8行目、10行目でGmail用のSMTPサーバーを指定し、サーバーのポート番号を指定します。
メールの送受信時には、盗聴や改ざんを防ぐためにSSL(Secure Sockets Layer)と呼ばれる方法でサーバーとの通信を暗号化します。今回の使用する465番ポートはSMTPサーバーとSSL通信を行うためのポート番号です。サーバーやポートの設定に関する詳細はGoogleのヘルプページを見てください。
13行目のsmtplib.SMTP_SSL()でSMTPサーバーを指定し、サーバーとSSL暗号化通信を開始します。
20〜21行目でGoogleアカウントの設定をし、23行目でログインしています。
メールの作成
27行目〜39行目でメールを作成しています。
msg[“Subject”]、msg[“From”]、msg[“To”]にそれぞれ、件名、自分のアドレス、相手のアドレスを代入します。
msg[“BCC”]には自分のアドレスを入れます。今回のようにPythonのプログラムからメールを送信すると送信済フォルダに履歴が残りません。そこで、BCCで自分宛てにメールを送信しメールの履歴を残しています。
MIMEText()に適当な文章を入れて本文用のデータを作り、msg.attach()で本文を追加します。
ファイルの添付
42〜49行目でPDFファイルを読み込み、メールに添付しています。
メールにファイルを添付するには、バイナリ形式で読み取る必要があります。そのため、42行目のopen()でファイルを開く際にオプションにmode=”rb”を指定しています。read()でPDFファイルのデータを読み込んでいます。
add_header()でヘッダー情報を追加します。filenameには受信者が保存する時のデフォルトのファイル名を指定します。とりあえず、PDFファイル名を指定しておけば良いと思います。
最後に、attach()でメッセージにファイルを添付します。
メールの送信とSMTPサーバーとの接続を終了
52行目でsend_message()でメールを送信します。最後にに54行目のquit()でSMTPサーバーとの接続を終了します。SMTPサーバーとの接続は忘れずに終了しましょう。
PythonでGmailを自動化:添付ファイル付きメールを自動送信
添付ファイル付きメールを、複数の人に個別に送信する作業をPythonで自動化します。メール本文は、各メールで、最初の”〇〇様”が違うだけで、その他は同じです。
内容がほぼ一緒のメールを個別に出したい時を想定しています。
先程と似たコードですが、送信者のアドレスや添付ファイルのリストを作って、for文を使って個別にメールを送信します。
import smtplib
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# smtpサーバーの設定
smtp_server = "smtp.gmail.com"
#ポート番号を指定
port_number = 465
#SMTPサーバーを指定しSSL暗号化通信を開始
server = smtplib.SMTP_SSL(smtp_server, port_number)
#SMTPサーバからのレスポンス確認(省略可)
response = server.noop()
print(response)
# Gmailアカウントへログイン
account = "ご自身のe-mailアドレス"
password = "アプリパスワード"
login_response = server.login(account, password)
print(login_response)
#メール受信者名、メールアドレス、添付ファイルのリスト
names = ["Hoge", "Foo"]
emails = ["hoge@xxxx.com", "foo@xxxx.com"]
files = ["test0.pdf", "test1.pdf"]
body = None
num = len(names)
#for文を個別にメールを送信
for i in range(0, num):
msg = MIMEMultipart()
#件名
msg["Subject"] = "件名"
#自分のアドレス
msg["From"] = "自分のアドレス@gmail.com" #
#受信者のアドレス
msg["To"] = emails[i]
#メール送信履歴を残すためにBCCに自分のアドレスを指定
msg["BCC"] = "自分のアドレス@gmail.com"
#ヒアドキュメントで文章を作成
body = '''
{}さん
こんにちは。hogelog.comです。
PDFファイル{}を添付します。
ご確認の程、よろしくお願いいたします。
'''.format(names[i], files[i])
body = MIMEText(body)
msg.attach(body)
#添付用のPDFファイルデータの読み込み
pdf = open(files[i], mode="rb")
pdf_data = pdf.read()
pdf.close()
#ファイルを添付
attach_file = MIMEApplication(pdf_data)
attach_file.add_header("Content-Disposition", "attachment", filename=files[i])
msg.attach(attach_file)
#メールを送信
server.send_message(msg)
time.sleep(0.5)
#SMTPサーバーとの接続を終了
server.quit()
先程のコードと大きな違いはないですが、送信者のアドレスや添付ファイルのリストを作って、for文を使って個別にメールを送信します。メール本文はヒアドキュメントを使っています。
このようにすれば、内容がほぼ一緒のメールを個別に出すことができます。