Pythonにできることは自動化しよう!【第18回 メール送信】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



Pythonを使ってメールを送信する

今回はPythonを使ったメール送信について解説していきます。GmailやOutlookのようなアプリケーションを介してメールを送信するのが普通ですが、Pythonプログラムを使ってメールを送信することも可能です。Pythonによるメール送信のやり方をマスターすることで、プログラムの途中でメール送信を含むようなアプリケーションを構築したり、自動で何件もの宛先にメールを送ることも可能になります。

今回は、メールプロバイダを「Gmail」、言語を「日本語」と仮定して、Pythonを使ったメール送信の具体的なやり方を解説していきます。起きやすいエラーや注意事項も解説しているので、ぜひ最後までご覧ください。

smtplibモジュール

Pythonでは、smtplibモジュールを使うことでメールを送信します。

SMTPとは、メールを送信するためのプロトコルです。Pythonに限らず、GmailやOutlookといった一般的なメールプロバイダーを使用する際にも使われているものです。
メールアプリにおいて新しくアカウントを設定する際に見かけた記憶があるのではないでしょうか?

「プロトコル?何それ難しそう!」と思った方も、用語の詳細について知る必要はないのでご安心ください。

emailパッケージ

日本語を扱う場合は、emailパッケージを使用します。email.mime.text.MIMETextオブジェクトを生成し、件名や本文を設定します。

Pythonを使ったメール送信の例

まず、メールを送信するために最低限必要なコードを見てみましょう。後ほど各ステップで行っている内容を説明します。

import smtplib
from email.mime.text import MIMEText
from email.header  import Header

# ユーザネーム、パスワード、送信元メールアドレス、宛先メールアドレス
username = 'account@gmail.com'
password = 'passward'
from_address = 'fromaddress@gmail.com'
to_address = 'toaddress@gmail.com'


# メール件名、本文
subject = 'メール件名'
text = 'メール本文'

# MIMETextオブジェクトの生成
charset = 'iso-2022-jp'
msg = MIMEText(text, 'plain', charset)  
msg['Subject'] = Header(subject, charset)
msg['From'] = from_address 
msg['To'] = to_address 

# SMTPサーバへの接続、暗号化、ログイン、送信、切断
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(username, password)
server.send_message(msg)
server.quit()



ユーザネーム、パスワード、送信元メールアドレス、宛先メールアドレスの設定

上の例では、最初にアカウントにログインするためのユーザネームとパスワードの設定、それから送信元・宛先メールアドレスを設定しています。すべて文字列として変数に格納していますが、後ほどこの変数を渡す部分に直接設定しても構いません。

メール件名、本文の設定

続いてメール件名と本文を設定しています。これらも文字列として変数にあらかじめ格納しています。

MIMETextオブジェクトの生成

ここからが本番です。このステップでは、emailパッケージを使用してemail.mime.text.MIMETextオブジェクトであるmsgを生成しています(参考:19.1.14. email: 使用例)。

charsetでは文字コードを設定しています。今回は、電子メール等で日本語を扱う上で標準的なISO-2022-JPとしています。(参考:Wikipedia ISO-2022-JP

MIMEText()関数の引数は順に、「本文」、「副形式(_subtype)」、「文字セット」となっています。副形式についてはplainとしておきましょう。

変数msgを生成したら、各プロパティに値を代入していきます。

  • Subject:件名(`email.header.Headerオブジェクトを使用します)
  • From:送信元メールアドレス
  • To:宛先メールアドレス

SMTPサーバへの接続、暗号化、ログイン、送信、切断

いよいよメールを送信するためのステップに入ります。このステップは以下のような流れになっています。

  1. smtplibモジュールを使用してSMTPオブジェクトを生成する
  2. TLS暗号化
  3. サーバにログインする
  4. メールを送信する
  5. サーバから切断する

それぞれのステップについて見ていきましょう。

SMTPサーバに接続する smtplib.SMTP()関数

まずはSMTPサーバに接続します。使用するsmtplib.SMTP()関数は、「SMTPサーバ名」と「ポート番号」を引数に取ります。
ここではメールプロバイダとしてGmailを仮定しているため、smtplib.SMTP('smtp.gmail.com', 587)となります。

TLS暗号化 starttls()メソッド

SMTPオブジェクトのstarttls()メソッドを使って、TLS暗号化を行います。データの安全な通信のために必要な作業であり、詳しく理解する必要はありません。

サーバにログインする login()メソッド

暗号化の後、login()メソッドを呼び出してアカウントにログインします。さきほど変数に格納していたユーザ名とパスワードを引数に渡し、server.login(username, password)とします。

メッセージを送信する send_message()メソッド

サーバにログインできたら、メールを送信しましょう。send_message()メソッドの引数にあらかじめ生成していたemail.mime.text.MIMETextオブジェクトであるmsgを引数に渡します。

サーバから切断する quit()メソッド

メールを送信したら、quit()メソッドを呼び出してサーバから切断します。

最後に注意事項について確認しておきましょう。

  • パスワードの取り扱い
    • login()メソッドを呼び出す際にはユーザ名とパスワードを引数に渡しています。流出することのないよう、扱いには十分注意しましょう。
  • エラーになってしまう場合のアカウント設定



参考書の例

参考書では、送信のみならず受信に関連するプロトコルであるIMAPについても詳しく解説されています。SMTP/IMAPを使用して、以下のような応用例について紹介されています。詳細については書籍をご覧ください。

  • リマインダーメールの自動送信
  • 命令メールを使用したコンピュータの制御

まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第18回としてPythonによるメール送信について解説しました。メールアプリケーションでは難しい、大量の宛先への微妙に異なる文面の一斉送信など、Pythonプログラムによるメール送信方法を知っていると役立つ場面が多々あります。プロトコルの設定など、一見難しそうに見える内容も含まれていますが、まずは例にならって「プログラムによるメール送信」を実践してみてください!

さらに追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。