特定のフォルダにあるファイルを自動的にメールで送信できると便利な面がある。今回は、Gmailを利用して、ダブルクリック一発で、フォルダ内にあるファイルを添付ファイルとして、特定の宛先にメール送信するプログラムを作ってみよう。

  • ダブルクリック一発でフォルダ内にあるファイルを添付してメールを送信しよう

    ダブルクリック一発でフォルダ内にあるファイルを添付してメールを送信しよう

フォルダ内にあるファイルをメールで送信できると便利な場面とは?

業務では、フォルダ内にあるファイルを特定の宛先にメール送信したい場面がある。メールに添付して送信することで、誰かとデータを共有できるだけでなく、ファイルのバックアップを取ることもできる。

また、読書端末のKindleに読書データを送信するのにも使える。Kindleでは、端末ごとにメールアドレスが発行されるのだが、メールにテキストやHTMLファイルを添付して送信すると、自動的にKindle端末のライブラリに登録される仕組みとなっている。つまり、後で読みたいという資料を、特定のフォルダに保存しておいて、今回作成するツールを実行すると、Kindle端末で読めるようになるのだ。

Gmailを利用するための準備

今回は、GmailとSMTPを利用してメールを送信してみよう。Gmailでメールを送信する方法は、本連載の112回目でも紹介しているが、Googleアカウントで、2段階認証を設定した上で、アプリパスワードを作成することが必要だ。

簡単に手順を紹介すると、まずは、Googleアカウントの設定を開き、画面左側にある「セキュリティ」をクリックしよう。そして、2段階認証プロセスを有効にする。

次に、アプリパスワードの設定を開いてアプリパスワードを作成しよう。アプリ名を入力して、「作成」ボタンを押すと、アプリパスワードが生成されるので、パスワードをメモっておこう。

  • Gmail用のアプリパスワードを生成しよう

    Gmail用のアプリパスワードを生成しよう

環境変数にアカウントとパスワードを登録しよう - Windowsの場合

最近では、プログラム内に機密情報を書かないように勧められている。何かのタイミングで、プログラムが漏洩したときに一緒にパスワードが盗まれてしまうのが理由だ。これを防ぐために、GmailのアカウントとパスワードをOSの環境変数に登録しておいて、プログラムではその値を参照して実行する仕組みにしてみよう。

Windowsでは、「スタートメニュー」から「環境変数」と検索し、「システム環境変数の編集」をクリックして起動しよう。「システムのプロパティ」ダイアログが表示されたら「詳細設定」タブで「環境変数」ボタンをクリックしよう。

そして、「ユーザー環境変数」のセクションで「新規」をクリックして、以下の値を設定して[OK]ボタンを押そう。

変数名:GMAIL_ACCOUNT
変数値:あなたのGmailのメールアドレス

続いて、パスワードも同様の方法で以下を指定しよう。

変数名:GMAIL_PASSWORD
変数値:Gmailのアプリパスワード

それから、メールの送信先を以下の変数に指定しよう。テストの段階では、上記のGmailのメールアドレスと同じものを指定しよう。

変数名:EMAIL_UPLOAD_TO
変数値:送信先のメールアドレス
  • 環境変数にGmailの設定を指定しよう

    環境変数にGmailの設定を指定しよう

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」という名前のファイルを作成し、その中に下記を記述しよう。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら