【RPA】Python×メール(Gmail)送信自動化|SMTP認証・添付ファイル・プログラム構築までの流れを徹底解説

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

「メールの自動化ツールはどのように作るの」「Pythonで簡易に作れないか」という疑問に答えます。本記事では「Gmailをベースにメール自動送信ツールの開発手順」を詳しく紹介します。GmailのみならずYahooOutlookを用いたメールの送信自動化ツール作成にも役立てることができる内容となっております。

目次

【RPA】メール自動送信ツールとは?

メール自動送信ツールとは、①メールリスト作成、②配信設定、③メール送信という一連の流れを全てプログラムしたツールを意味します。

「メール業務を自動化する意義」「メールの自動化が適用できる業務シーン」等を詳しく知りたい方は、まずこちらの記事をご覧ください。

メール自動送信ツールの作成対象

本記事では、上図部分をPythonプログラムでカバーします。メール自動送信ツール作成の第一歩として、単純なメールリストをもとにメール自動送信できるツールの構築を目指してみましょう。

【参考】手軽に利用可能なメール配信システム・おすすめ学習法

Python言語で構築することに障壁がある方向けに、ノーコードかつ手軽にメール配信を実施できるシステムを紹介します。Pythonで実装したメール機能と上記システム機能を比較し、お好みの方法を選択することをおすすめします。

Pythonを活用してメール受信・配信タスクの自動化手法を深く学びたい方向けに、おすすめの教材も併せてご紹介します。

【Python】Gmailを用いたメール送信自動化ツールの作成手順

上図のような手順のもとにプログラムを構築します。まずは全体像を掴みましょう。

【参考】メール送信に伴う通信規定

SMTP

SMTP(Simple Mail Transfer Protocol)とは、メール送信するためのプロトコルです。メール送信時の暗号化やメールサーバー間の中継方法について規定しています。

SMTPで使用されるポートは、「25」「587」「465」「2525」があります。その中でも587番ポートは、SMTPサブミッションに用いる現代のデフォルトポートとして広く利用されています。SMTPを設定する場合、まずは587番ポートを検討しましょう。

IMAP

IMAP(Internet Message Access Protocol)とは、メール受信のためのプロトコルです。IMAPの場合、メールはサーバ上での保管が特徴であるため、メールのステータス(既読・未読・削除)等も全てサーバで管理されます。

POP

POP(Post Office Protocol)とは、メール受信のためのプロトコルです。プロトコルがバージョン3であるため、POP3とも呼ばれます。IMAPとの違いは、メール保管方法にあります。POPの場合、メールはサーバーからスマホ・PC端末にダウンロードされて管理されます。

SSL/TLS

SSL(Secure Sockets Layer)およびTLS(Transport Layer Security)は、インターネット上のデータを暗号化し、送受信するためのプロトコルです。個人情報やクレジットカード、パスワードなどのデータを暗号化し、データの改ざんや盗聴を防止します。

Gmailのアプリパスワードを事前に取得する

Gmailのアプリパスワードを作成していない場合、事前作成が必要です。下記の手順に従い、アプリパスワードを生成しましょう。(※普段Gmailにログインするパスワードとアプリパスワードは別のものです。)

  1. Googleアカウントを開く(上図参照)
  2. セキュリティを開く
  3. 2段階認証プロセスをONにする
  4. アプリパスワードを生成する

【Python】メール送信自動化ツールを実際に作成

それでは実際にPythonを用いてメール自動送信ツールを作成していきます。

SMTPサーバー接続

「smtplib」モジュールよりサーバーに接続します。以下コードを記載ください。

# SMTP接続用
import smtplib

# SMTPサーバー名とポート番号指定
smtp = smtplib.SMTP("smtp.gmail.com",587)

# サーバーと接続を確立
smtp.ehlo()

以下それぞれコードの意味を説明していきます。smtpオブジェクトは、SMTPサーバー名とポート番号の指定し、接続するために記載します。

# SMTPサーバー名とポート番号指定
smtp = smtplib.SMTP(SMTPサーバー名,ポート番号)

今回はGmailを利用していますが、以下のSMTPサーバー名を記載することで別プロバイダーを指定することも可能です。

プロバイダー SMTPサーバー名
Gmail imap.gmail.com
Yahoo Mail imap.mail.yahoo.com
Outlook.com imap-mail.outlook.com

続いて、先ほど定義したsmtpオブジェクトに対して、ehlo()メソッドを用います。これは、サーバーとの接続を確立させる重要なメソッドです。以下を実行した際、戻り値として(250, b’smtp.gmail.com at your service)という整数250が得られた場合は「SMTPサーバー接続成功」を意味します。

# サーバーと接続を確立
smtp.ehlo()

TLS暗号化

SMTPサーバーを587番ポートで接続した場合、TLS暗号化を使用することになります。以下コードを記載してみましょう。

smtp.starttls()

starttls()メソッドで暗号化します。上記実行時に戻り値に220が得られた場合は「サーバー準備完了」を意味します。

SMTPサーバーにログイン

SMTPサーバーとのTLS暗号化が完了できたら、メールアドレスとパスワードを用いてサーバーにログインします。以下コードを記載してみましょう。ここで、メールアドレスはGmailアドレスを用い、パスワードは事前に取得したアプリパスワードを記載しましょう。

# メールコンテンツ作成
my_mail = "メールアドレスを入力"
app_password = "パスワードを入力"
smtp.login(my_mail,app_password)

login()メソッドの第一引数にメールアドレス、第二引数にパスワードを渡して実行するとログインできます。実行の結果、戻り値として(235, b’2.7.0 Accepted’)が得られたらSMTPサーバーログイン成功を意味します。

メール作成

次にメール作成に必要な情報を入力していきます。以下コードを記載してみましょう。

""" メール作成の日本語対応するためのモジュール読込 """
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
charset = "iso-2022-jp"

""" 以下編集が必要な部分 """
From = my_mail
To = "送信先を入力"
Cc = "Cc先を入力" #不要な場合この行を削除
Bcc = "Bcc先を入力" #不要な場合この行を削除
Kenmei = "件名を入力"
Body = "本文をここに入力"

#メール本文を読み込み
msg = MIMEMultipart()
msg.attach(MIMEText(Body))
msg["Cc"] = Cc #不要な場合この行を削除
msg["Bcc"] = Bcc #不要な場合この行を削除
msg["Subject"] = Header(Kenmei.encode(charset),charset)

以下コードを解説していきます。まず、日本語のメールを送信する際、エラーにならないよう対応が必要です。日本語対応するためのモジュールを以下のように記載します。ここはコピペで問題なしです。

""" メール作成の日本語対応するためのモジュール読込 """
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
charset = "iso-2022-jp"

続いて、メール作成に参りましょう!To, Cc, Bccで宛先を指定します。CcやBccが不要な場合は削除してOKです。その際はmsg[“Cc”]およびmsg[“Bcc”]も一緒に削除しましょう。

メール本文を記載する際、改行する場合は、”\n”と記載しましょう。

""" 以下編集が必要な部分 """
From = my_mail
To = "送信先を入力"
Cc = "Cc先を入力" #不要な場合この行を削除
Bcc = "Bcc先を入力" #不要な場合この行を削除
Kenmei = "件名を入力"
Body = "本文をここに入力\n本文をここに入力\n本文をここに入力"

宛先を複数追加したい場合、以下のようにカンマ区切りで記載しましょう。

To = "example1@gmail.com" + "," + "example2@gmail.com"

ファイル添付

メールにファイルを添付したい場合、下記のように入力します。

from email.mime.application import MIMEApplication
import os

# ファイルディレクトリ指定
filename = 'ファイル名.docx'
filepath = os.path.basename(filename)

# ファイル読込
with open(filename, "rb") as f:
    AtchFile = MIMEApplication(f.read())

# ファイル添付
AtchFile.add_header("Content-Disposition", "attachment", filename = filepath)
msg.attach(AtchFile)

ファイル添付する際のコードは基本的に上記コピペで問題無しです。唯一考慮すべき点は、添付ファイルのディレクトリ設定です。Python実行スクリプトと同じディレクトリにファイルを格納する場合は、上記ファイル名(filename)部分のみ変更いただければと思います。

メール送信

実際にメールを送信します。以下コードを記載しましょう。

smtp.sendmail(From,To,msg.as_string())

第一引数に自信のメールアドレス、第二引数に宛先、第三引数にメールのテキストメッセージを渡し、sendmail()メソッドを実行すると、メールが送信されます。

SMTPサーバーと接続遮断

メール送信後はSMTPサーバーとの接続遮断を忘れずに行います。quit()メソッドをもとに、以下コードを記載しましょう。

smtp.quit()

【まとめ】Pythonメール送信ツールの全体コード

最後に本日学習したコードを関数の形で全量記載します。

全体コード(1):ファイル添付あり

ファイル添付したメール送信作業の自動化を検討される際は、こちらが有効です。

""" インポート文(編集不要) """
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
import os
charset = "iso-2022-jp"

""" メール本文情報(要編集)"""
To = "宛先を入力"
Subject = "件名を入力"
MailBody = "本文を入力"
FileName = 'ファイル名.docx'

def gmail_send(To,Subject,MailBody,FileName):
    
    """ メール設定(要編集)"""
    #SMTPサーバー接続・ログイン情報
    my_mail = "自信のメールアドレスを入力"
    app_password = "パスワードを入力"
    smtp = smtplib.SMTP("smtp.gmail.com",587)
    
    """ メール本文(編集不要)""" 
    From = my_mail
    Atesaki = To
    Kenmei = Subject
    Body = MailBody
    
    #メール本文を読込
    #msg = MIMEText(Body,"plain",charset)
    msg = MIMEMultipart()
    msg.attach(MIMEText(Body))
    msg["Subject"] = Header(Kenmei.encode(charset),charset)

    """ 添付ファイル(編集不要)""" 
    #ファイルディレクトリ指定
    filename = FileName
    filepath = os.path.basename(filename)

    #ファイル読込
    with open(filename, "rb") as f:
        AtchFile = MIMEApplication(f.read())

    #ファイル添付
    AtchFile.add_header("Content-Disposition", "attachment", filename = filepath)
    msg.attach(AtchFile)

    """ メールサーバー接続(編集不要)"""
    #サーバー・ポート接続
    smtp.ehlo()
    #TLS暗号化
    smtp.starttls()
    #SMTPサーバーログイン
    smtp.login(my_mail,app_password)
    #メール送信
    smtp.sendmail(From,Atesaki,msg.as_string())
    #SMTPサーバー遮断
    smtp.quit()
    
    print("メールを送信しました。")

第一引数に宛先、第二引数に件名、第三引数にメール本文、第四引数に添付ファイル情報を渡した関数を作成しました。以下を実行し、動作確認してみましょう。

gmail_send(To,Subject,MailBody,FileName)

全体コード(2):ファイル添付なし

ファイル添付の操作が不要な場合はこちらの関数を活用ください。

""" インポート文(編集不要) """
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
import os
charset = "iso-2022-jp"

""" メール本文情報(要編集)"""
To = "宛先を入力"
Subject = "件名を入力"
MailBody = "本文を入力"

def gmail_send(To,Subject,MailBody):
    
    """ メール設定(要編集)"""
    #SMTPサーバー接続・ログイン情報
    my_mail = "自信のメールアドレスを入力"
    app_password = "パスワードを入力"
    smtp = smtplib.SMTP("smtp.gmail.com",587)
    
    """ メール本文(編集不要)""" 
    From = my_mail
    Atesaki = To
    Kenmei = Subject
    Body = MailBody
    
    #メール本文を読込
    #msg = MIMEText(Body,"plain",charset)
    msg = MIMEMultipart()
    msg.attach(MIMEText(Body))
    msg["Subject"] = Header(Kenmei.encode(charset),charset)

    """ メールサーバー接続(編集不要)"""
    #サーバー・ポート接続
    smtp.ehlo()
    #TLS暗号化
    smtp.starttls()
    #SMTPサーバーログイン
    smtp.login(my_mail,app_password)
    #メール送信
    smtp.sendmail(From,Atesaki,msg.as_string())
    #SMTPサーバー遮断
    smtp.quit()
    
    print("メールを送信しました。")

【参考】Pythonで面倒な作業を自動化!手法一挙公開中!

当サイトでは日々面倒な作業をPythonで自動化する方法を多数配信しております。日々の作業が飛躍的効率化できること間違いなしですので、以下気になった記事があれば併せてご覧ください。

【面倒なタスクをPythonで解決!】作業効率化の人気記事一覧




【参考】Pythonとは?・実現できること

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次