今回は、Pythonで自動でGmailを送信する方法を紹介する。改めて言うまでもなくEメールは仕事に欠かせないもの。取引先や社内の連絡手段として、メールを使うのは一般的だ。毎月の取引明細や給料明細をメールで送信していることも多いことだろう。定期的に何しらのメールを送信しているなら、その作業を自動化してみよう。
定期的なメール送信の間違いを減らそう
例えば、取引先に月々の取引内容をメールしているとする。その場合、取引先が数社であれば、それほど苦痛ではないかもしれない。しかし、毎月、メールソフトを開いて、複数の会社宛に個別のデータを送信する作業は、慎重を期する作業だ。もしも、請求書の宛先を送り間違えると大変なことになる。
人間が手作業で行うと、宛先の間違いや、添付ファイルの付け忘れなど、どうしても間違いが起こってしまう。そこで、毎月同じ作業をする必要があるなら、メールの宛先一覧と請求データを元にして請求書を自動生成し、自動でメール送信するプログラムを組むことができる。そうすれば、ミスを防ぐことができる。過去の本連載37回を参考に、請求書も自動作成した上で、メールを送信するなら、毎月の経理作業の負担軽減ができるだろう。
Pythonでメール送信する方法
それでは、Pythonでメール送信する方法を紹介しよう。今回は、手軽にメールの送信ができるGmailを利用する。基本的には、Pythonのメール送信プログラムにGmailの設定を記述すれば良いのだが、昨今、Googleのサービスはセキュリティが厳しくなっており、PythonからGmailを利用するためには、セキュリティの設定を変更する必要がある。
と言うのも、Pythonの自作プログラムは『安全性の低いアプリ』と見なされるのだ。それで、Gmailのセキュリティ設定で安全性の低いアプリを許可する必要がある。セキュリティ上、懸念があるなら新たにテスト用のGmailアカウントを取得すると良いだろう。新規アカウントを取得したら、以下の設定を行う。
【Googleアカウントでセキュリティを設定する方法】
Gmailで安全性の低いアプリを許可する手順だが、こちらのヘルプの手順通り、Googleアカウントにアクセスし、左側ナビゲーションパネルの[セキュリティ]をクリックする。そして、ページ下部にある「安全性の低いアプリのアクセス」パネルで「アクセスを有効にする」をクリックしよう。
Gmailでメールを送信するプログラム
上記の設定を行ったら、プログラムを作成しよう。以下のプログラムは、Gmailで「メール送信テスト」というメールを送信する簡単なプログラムだ。ただし、冒頭の★マークの付いた数行を自身のGmail設定とメールアドレスに書き換えよう。
import smtplib, ssl
from email.mime.text import MIMEText
# 以下にGmailの設定を書き込む★ --- (*1)
gmail_account = "xxx@gmail.com"
gmail_password = "xxx"
# メールの送信先★ --- (*2)
mail_to = "xxx@gmail.com"
# メールデータ(MIME)の作成 --- (*3)
subject = "メール送信テスト"
body = "メール送信テスト"
msg = MIMEText(body, "html")
msg["Subject"] = subject
msg["To"] = mail_to
msg["From"] = gmail_account
# Gmailに接続 --- (*4)
server = smtplib.SMTP_SSL("smtp.gmail.com", 465,
context=ssl.create_default_context())
server.login(gmail_account, gmail_password)
server.send_message(msg) # メールの送信
print("ok.")
このプログラムを「send_gmail.py」という名前で保存しよう。そして、コマンドライン(macOSならターミナル.app、WindowsでAnacondaを利用しているなら、Anacondaプロンプト)を起動しよう。そして、プログラムのあるディレクトリに移動して、プログラムを実行しよう。
cd (プログラムのあるディレクトリ)
python send_gmail.py
すると、以下のようにGmailにメールが送信される。
もし、プログラムを実行した時、エラーが表示される場合、改めてGoogleのセキュリティ設定を確認しよう。また、ウイルス対策ソフトの設定や、ネットワーク環境によっては、ローカルPCからのメール送信を拒否している場合もあるので、その場合は管理者に問い合わせてみよう。
なお、パスワードが間違っている場合には、『smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted.』のように表示される。うまく送信できない場合には、エラーメッセージを手がかりに解決を目指そう。
それでは、プログラムを確認しよう。プログラムの(*1)(*2)の部分は書き換えが必要な部分だ。(*1)にはGmailのアカウントとパスワード、そして、(*2)にはメールの送信先を指定しよう。
そして、(*3)の部分でメールの本文データを作成する。このようにメールデータは、MIME形式で作成する必要がある。ここでは、HTMLメールを作成している。
続けて、(*4)の部分でGmailサーバーに接続し、メールを送信する。最初にサーバーへの接続設定を指定し、loginメソッドでログインし、send_messageメソッドでメールを送信するという手順になる。
添付ファイルを送信するプログラム
なお、メールを送信するとき、添付ファイルを送信したいという場合も多いだろう。その場合、以下のようなプログラムを作成する。添付ファイルを送信する場合、40行と少し長くなる。しかし、解説を読むと分かるが、それほど難しいことをしている訳ではないので、安心して試してみよう。
まず、以下のプログラムを「send_attach.py」という名前で保存しよう。それから、メールに添付するファイルを同じディレクトリに「test.zip」という名前で用意しよう。
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders
# 以下にGmailの設定を書き込む★ --- (*1)
gmail_account = "xxx@gmail.com"
gmail_password = "xxx"
# メールの送信先 --- (*2)
mail_to = "xxx@gmail.com"
# 添付ファイルのパス(ZIPファイルで指定) --- (*3)
file_path = "./test.zip"
# メールデータ(MIME)の作成 --- (*4)
subject = "添付ファイル送信テスト"
body = "添付ファイルの送信テスト"
encoding = 'utf-8'
msg = MIMEMultipart()
msg["Subject"] = Header(subject, encoding)
msg["To"] = mail_to
msg["From"] = gmail_account
msg.attach(MIMEText(body, 'plain', encoding))
# 添付ファイル(ZIP)をメールに追加 --- (*5)
attach = MIMEBase('application','zip')
with open(file_path, "br") as f:
attach.set_payload(f.read())
encoders.encode_base64(attach)
attach.add_header('Content-Disposition', 'attachment',
filename='attachment.zip')
msg.attach(attach)
# Gmailに接続 --- (*6)
server = smtplib.SMTP_SSL("smtp.gmail.com", 465,
context=ssl.create_default_context())
server.login(gmail_account, gmail_password)
server.send_message(msg) # メールの送信
server.quit()
print("ok.")
もちろん、先ほどと同じように、上記のプログラムの(*1)と(*2)の箇所を書き換える必要がある。プログラムを実行するには、コマンドラインから以下のコマンドを実行しよう。
python send_attach.py
すると、以下のように添付ファイルが送信できる。
プログラムを確認しよう。(*1)にはGmailの設定を、(*2)にはメールの宛先を記述する。(*3)には添付するZIPファイルのパスを指定しよう。
そして、(*4)と(*5)の部分でメールのMIMEデータを作成する。MIMEデータは、マルチパートと言って、一つのメールの中に複数のデータを格納できる仕組みとなっている。(*4)でテキストデータを追加し、(*5)の部分でZIPファイルのデータを追加する。
最後に(*6)の部分でGmailからメールを送信する。
まとめ
以上、今回は、Gmailを利用して、Pythonの自作プログラムからメールを送信する方法を紹介した。Eメールは様々な端末で受信できるので、何かしらの通知手段として非常に優れている。今回はメールを送る方法のみを紹介したが、他のプログラムと組み合わせることで、様々な用途でりようできるだろう。
また、プログラムを利用する注意点だが、連続でメールを送信する場合には、一定の待ち時間を入れるなどして、サーバー側に配慮する必要がある。短時間に連続してメールを送信しようとすると、スパムの大量送信と間違われる可能性があることも考慮して利用しよう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。