ライフスタイルブログを運営しているミウラ(@miumiu06171)です。
こんにちは、普段はフリーランスでシステムエンジニアをしております。
今回はPythonでGmailを送信する方法と活用事例を見ていきたいと思います。
目次は以下の通りです。
メールの仕組み
まずはメールの仕組みからおさらいしていきましょう。
メールは双方向で情報のやり取りを行うものなので、図のように送信側と受信側の二役あります。
送信側は、SMTPサーバに対してメッセージを送信することでメール送信ができます。
一方、受信側は、POPサーバに新着メールがないかリクエストを出し、新着メールがあれば受信する形になりますね。
このメールの仕組みをおさえた上で、Pythonでメール送信するにはどうすればよいか見ていきましょう。
メール送信プログラム作成
前述のとおり、メールを送信するためにはSMTPサーバにメッセージを送信する必要があります。
このSMTPサーバへメッセージを送信するには、下図のように
・SMTPサーバのアドレス
・自分のメールアドレス ・相手のメールアドレス ・ログインパスワード ・メールの件名 ・メールの本文 |
が必要になります。
普段メールを送信している人であれば、「SMTPサーバのアドレス」以外の項目は意識しているかと思います。
それでは「SMTPサーバのアドレス」を指定するために、GmailのSMTPサーバを調べていきましょう。
SMTPサーバを調べる
今回Pythonを使ってGmailを送信するので、GmailのSMTPサーバを調べていきます。
GmailのSMTPサーバを調べるには、Googleで「Gmail SMTP」と検索しても情報を取得できます。
私が確認したのはこちらになります。
「ステップ 2: デバイスやアプリでメール送信を設定する」章の「Gmail SMTP サーバーを使用する」をクリックすると、GmailのSMTPサーバのアドレスが「smtp.gmail.com」であることがわかります。
また、SSL(Secure Sockets Layerの略)でメール送信しますので、ポート番号は「465」となります。
今回Gmailを例にしましたが、Googleで「yahoo smtp」などと同様に調べると、その他のSMTPサーバも調べることができます。
もし、SMTPサーバのアドレスがわからない場合は、プロバイダに問い合わせてみてください。
SMTPサーバと通信するライブラリ(smtplib)
前章まででSMTPサーバに対してメールを送るための事前情報を収集しおえたことになりますので、Pythonでメールを送信する方法をみていきましょう。
はじめにPythonの標準ライブラリである「smtplib」を使ってメール送信プログラムを作成することができますので、こちらのsmtplibのPythonドキュメントを確認しておきましょう。
多くのPythonドキュメントには、使用例が記述されているので、今回もsmtplibのPythonドキュメントに記載されている使用例を元に作成することにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import smtplib, ssl from email.mime.text import MIMEText # メールの送信元のGmail設定 mail_from = "*************@gmail.com" app_password = "*************" # メールの送信先 mail_to = "*************@gmail.com" charset = 'utf-8' # メールデータ(MIME)の作成 subject = "メール送信テスト(件名)" body = "このメールはテストメールです。" msg = MIMEText(body, "plain", charset) msg["Subject"] = subject msg["To"] = mail_to msg["From"] = mail_from # GmailにSSL接続 server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ssl.create_default_context()) server.login(mail_from, app_password) # メールの送信 server.send_message(msg) print("ok.") |
SMTPサーバの指定
SMTPサーバの指定箇所をみていきましょう。
smtplibのSMTP_SSLメソッドの第一引数で「smtp.gmail.com」のSMTPサーバを指定します。
【プログラム抜粋】
1 |
server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ssl.create_default_context()) |
送信元/送信先アドレスの指定
次に送信元/送信先アドレスの指定をみていきましょう。
mail_from変数に送信元アドレスを、mail_to変数に送信先アドレスを指定すればオッケーです。
【プログラム抜粋】
1 2 3 4 5 6 |
# メールの送信元のGmail設定 mail_from = "*************@gmail.com" app_password = "*************" # メールの送信先 mail_to = "*************@gmail.com" |
パスワードの指定
パスワードの指定については、app_password変数に設定してください。
ただし、Gmailのログインパスワードではなく、こちらのアプリパスワードというものを使います。
なお、アプリパスワードを発行するには、Gmailの二段階認証をしている必要がありますので、こちらに従って二段階認証を行い、16桁のアプリパスワードを発行してください。
アプリパスワード発行時に使用する条件を指定しますが、アプリ「メール」、使用環境は「Windows PC」(お使いの環境に設定)をしてください。
16桁のアプリパスワードを取得できたら、app_password変数に設定してください。
メールの件名を指定
メールの件名は、subject変数に記載します。
MIMEをインポートしているので、日本語も利用可能です。
【プログラム抜粋】
1 2 3 |
# メールデータ(MIME)の作成 subject = "メール送信テスト(件名)" body = "このメールはテストメールです。" |
メールの本文を記載
メールの本文は、body変数に記載します。
件名と同様に日本語も記載可能です。
メール送信プログラム作成(宛先複数)
次は、複数の宛先にメールを送信するプログラムです。
以下のプログラムでは、リストを使って複数の宛先を用意し、for文でリスト内の複数の宛先にメールを送信しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import smtplib, ssl from email.mime.text import MIMEText # Gmailの設定 mail_from = "***********@gmail.com" app_password = "****************" # メールの送信先(複数) mail_to = [ {'name': '佐藤', 'address': "***********+1@gmail.com"}, {'name': '中村', 'address': "***********+2@gmail.com"}, {'name': '鈴木', 'address': "***********+3@gmail.com"}] charset = 'utf-8' # Gmailに接続 server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ssl.create_default_context()) server.login(mail_from, app_password) # for文で複数人に送信 for user in mail_to: # メールデータ(MIME)の作成 subject = f""" To:{user['name']}様へ """ body = f""" {user['name']}さん こんにちは。 """ msg = MIMEText(body, "plain", charset) msg["Subject"] = subject msg["To"] = user['address'] msg["From"] = mail_from server.send_message(msg) # メールの送信 print("ok.") |
メール送信プログラム作成(定期送信)
次に一定時間経過したり、指定時間にメールを送信したりできる定期送信機能を追加したプログラムになります。
定期実行するためには、「schedule」という外部ライブラリを使用します。
下記のプログラムは、15秒おきに複数の宛先にメールを送信する例です。
「schedule」のその他使い方については、Python Package Index(PyPI)のこちらのドキュメントを参照しましょう。
ドキュメントを見ると、1分おき、1時間おき、毎朝10時に実行する使用例などがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import smtplib, ssl from email.mime.text import MIMEText import schedule import time # Gmailの設定 mail_from = "************@gmail.com" app_password = "****************" # メールの送信先 to_users = [ {'name': '佐藤', 'address': "***********+1@gmail.com"}, {'name': '中村', 'address': "***********+2@gmail.com"}, {'name': '鈴木', 'address': "***********+3@gmail.com"}] charset = 'utf-8' def cyclic_send(): # Gmailに接続 server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ssl.create_default_context()) server.login(mail_from, app_password) # for文で複数人に送信 for user in to_users: # メールデータ(MIME)の作成 subject = f""" To:{user['name']}様へ """ body = f""" {user['name']}さん こんにちは。 """ msg = MIMEText(body, "plain", charset) msg["Subject"] = subject msg["To"] = user['address'] msg["From"] = mail_from server.send_message(msg) # メールの送信 print("ok.") schedule.every(15).seconds.do(cyclic_send) while True: schedule.run_pending() time.sleep(1) |
まとめ
Pythonでメール送信する機能は、いかがでしたでしょうか。
Pythonでメールを送信する方法に加え、複数の宛先に送信する方法、定期送信する方法など活用事例まで紹介してきました。
毎日、毎週など定期的にメール送信している仕事などがあれば、今回の記事を通りして効率化できないかためしてみるのもよいのではないでしょうか。
私も日々業務効率をあげることを考え、余った時間を作れたら次に効率化できることを考えるといった仕事術を心がけています。
業務効率化で時間を作ることは、他に時間を使うことができることなので、本記事を役立ててもらえたらと思います。