特定のフォルダにあるファイルを自動的にメールで送信できると便利な面がある。今回は、Gmailを利用して、ダブルクリック一発で、フォルダ内にあるファイルを添付ファイルとして、特定の宛先にメール送信するプログラムを作ってみよう。
フォルダ内にあるファイルをメールで送信できると便利な場面とは?
業務では、フォルダ内にあるファイルを特定の宛先にメール送信したい場面がある。メールに添付して送信することで、誰かとデータを共有できるだけでなく、ファイルのバックアップを取ることもできる。
また、読書端末のKindleに読書データを送信するのにも使える。Kindleでは、端末ごとにメールアドレスが発行されるのだが、メールにテキストやHTMLファイルを添付して送信すると、自動的にKindle端末のライブラリに登録される仕組みとなっている。つまり、後で読みたいという資料を、特定のフォルダに保存しておいて、今回作成するツールを実行すると、Kindle端末で読めるようになるのだ。
Gmailを利用するための準備
今回は、GmailとSMTPを利用してメールを送信してみよう。Gmailでメールを送信する方法は、本連載の112回目でも紹介しているが、Googleアカウントで、2段階認証を設定した上で、アプリパスワードを作成することが必要だ。
簡単に手順を紹介すると、まずは、Googleアカウントの設定を開き、画面左側にある「セキュリティ」をクリックしよう。そして、2段階認証プロセスを有効にする。
次に、アプリパスワードの設定を開いてアプリパスワードを作成しよう。アプリ名を入力して、「作成」ボタンを押すと、アプリパスワードが生成されるので、パスワードをメモっておこう。
環境変数にアカウントとパスワードを登録しよう - Windowsの場合
最近では、プログラム内に機密情報を書かないように勧められている。何かのタイミングで、プログラムが漏洩したときに一緒にパスワードが盗まれてしまうのが理由だ。これを防ぐために、GmailのアカウントとパスワードをOSの環境変数に登録しておいて、プログラムではその値を参照して実行する仕組みにしてみよう。
Windowsでは、「スタートメニュー」から「環境変数」と検索し、「システム環境変数の編集」をクリックして起動しよう。「システムのプロパティ」ダイアログが表示されたら「詳細設定」タブで「環境変数」ボタンをクリックしよう。
そして、「ユーザー環境変数」のセクションで「新規」をクリックして、以下の値を設定して[OK]ボタンを押そう。
変数名:GMAIL_ACCOUNT
変数値:あなたのGmailのメールアドレス
続いて、パスワードも同様の方法で以下を指定しよう。
変数名:GMAIL_PASSWORD
変数値:Gmailのアプリパスワード
それから、メールの送信先を以下の変数に指定しよう。テストの段階では、上記のGmailのメールアドレスと同じものを指定しよう。
変数名:EMAIL_UPLOAD_TO
変数値:送信先のメールアドレス
macOSで環境変数を登録する方法
macOSの場合は、シェルの設定ファイルを編集する。テキストエディタで「~/.zshrc」を開いて、下記のような3行を記述しよう。変数の値は自身のものに書き換えよう。
export GMAIL_ACCOUNT="Gmailのメールアドレス"
export GMAIL_PASSWORD="Gmailのアプリパスワード"
export EMAIL_UPLOAD_TO="送信先のメールアドレス"
ファイルを保存したら、ターミナルを起動して「source ~/.zshrc」を実行して環境変数を有効にしよう。
フォルダ内のファイルをメール送信するプログラム
それでは、プログラムを作ってみよう。このプログラムと同じフォルダにあるファイル一式をメールに添付して送信するというものだ。こちらのGistにもアップしている。
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from glob import glob
# Gmailのアカウント情報を環境変数から読み取る --- (*1)
GMAIL_ACCOUNT = os.environ['GMAIL_ACCOUNT']
GMAIL_PASSWORD = os.environ['GMAIL_PASSWORD']
EMAIL_UPLOAD_TO = os.environ["EMAIL_UPLOAD_TO"]
# Gmailにメールを送信する関数 --- (*2)
def gmail_send(mailto, subject, body, attachfiles):
# メールデータの作成
msg = MIMEMultipart()
msg['From'] = GMAIL_ACCOUNT
msg['To'] = mailto
msg['Subject'] = subject
msg.attach(MIMEText(body))
# 添付ファイルの処理
for attachfile in attachfiles:
print("- 添付:", attachfile)
with open(attachfile, "rb") as f:
attach = MIMEText(f.read(), "plain", "utf-8")
attach.add_header("Content-Disposition", "attachment", filename=os.path.basename(attachfile))
msg.attach(attach)
# Gメールの送信
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.login(GMAIL_ACCOUNT, GMAIL_PASSWORD)
server.send_message(msg)
server.quit()
# フォルダ内のファイル一覧をメールに添付して送信 --- (*3)
root = os.path.dirname(__file__)
files = []
for pattern in ("*.txt", "*.pdf", "*.html"):
files += glob(os.path.join(root, pattern))
if len(files) == 0:
print("添付ファイルが見つかりません")
quit()
gmail_send(EMAIL_UPLOAD_TO, "添付ファイルの送信", "添付ファイルを送ります", files)
print("メールを送信しました")
プログラムを確認してみよう。(*1)ではGmailのアカウント情報を環境変数から読み取る。(*2)ではGmailにメールを送信する関数を定義した。引数attachfilesにファイルパスの一覧を指定すると、ファイルを添付してメールする。(*3)では、glob関数を利用して、テキストファイル(*.txt)、PDFファイル(*.pdf)、HTMLファイル(*.html)のパスを取得して、(*2)で定義したした関数gmail_sendを呼び出す。
Pythonに標準で同梱されているsmtplibパッケージの出来が良いので、とても簡単にメールにファイルを添付して送信できるのが分かるだろう。
プログラムを実行しよう
上記のプログラムを「send.py」という名前で、添付したいファイルのあるフォルダにコピーしよう。そして、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、次のようなコマンドを実行しよう。
# Windowsの場合
python send.py
# macOSの場合
python3 send.py
すると、メールが送信される。次の画面は、Gmailでメールを受信したところだ。プログラムと同じフォルダに配置した「test.txt」と「test2.txt」がメールに添付されているのを確認できた。
それでも、毎回、ターミナルを起動して、コマンドを入力するのは面倒だろう。そこで、Windowsであるなら、「send.bat」という名前のファイルを作成し、その中に下記を記述しよう。