【Python】メールを英語・日本語で送信する方法(smtplibモジュール)
2021.10.03 /
本記事ではPythonでメールを送信する方法について解説していきます。
使用するモジュールはsmtplibモジュールで、メール本文は英語、日本語それぞれの方法を解説しています。
Pythonにはメール送信の処理をプログラムで組むことができます。その書き方を覚えることで、メール作業の自動化も夢ではないです。
日々コピー&ペーストで送っていた定型文書を自動化できれば、多くの時間を節約できる可能性を秘めています。
ぜひ本記事を参考にして、Pythonによるメール送信の方法を身に着けてください。
メール送信で使用するモジュール(smtplib)
Pythonでメールを送信する際にsmtplibモジュールを利用します。そのためスクリプトの先頭でsmtplibモジュールをインポートしてください。
import smtplib
smtplibは標準ライブラリですので、pipでインストールする必要はありません。
このsmtplibを利用することで、SMTPに従ってメールを送信することができます。
SMTP(Simple Mail Transfer Protocol)とは、メールを送信するためのプロトコルです
Pythonでメールを送信する流れ
Pythonでメールを送信するときは、次の流れでプログラムを組んでいきます。
- SMTPサーバーに接続
- TLS暗号化
- SMTPサーバーにログイン
- メールの送信
- SMTPサーバーへの接続を切断
これらの方法を次項より詳しく解説していきます。
Pythonでメールを送信する方法
SMTPサーバーに接続
メール送信をするためには、まずメールプロバイダーのSMTPサーバーに接続する必要があります。
SMTPサーバーへの接続にはsmtplib.SMTP()を使用します。
smtplib.SMTP(SMTPサーバー名, ポート番号)
SMTP()の第一引数にはSMTPサーバー名、第二引数にポート番号を指定します。
SMTPサーバー名はメールプロバイダーのサイトで確認することができます。
多くの場合、ドメイン名にsmtpが付いたものがSMTPサーバー名になります。
例えばGmailの場合、smtp.gmail.comがSMTPサーバー名です。
ポート番号は、暗号化するためのTLSの番号である587番を使用することが多いです。
smtplib.SMTP()によってSMTPオブジェクトが生成されます。このSMTPオブジェクトを使ってメール送信を行います。
import smtplib
obj_smtp = smtplib.SMTP('smtp.office54.net', 587)
type(obj_smtp)
# <class 'smtplib.SMTP'>
SMTPサーバーにSSLで接続する場合は、smtplib.SMTP_SSL()を利用します。ポート番号は465番です。
obj_smtp = smtplib.SMTP_SSL('smtp.office54.jp', 465)
TLS暗号化
次にTLS暗号化を開始(有効化)するためにSMTPオブジェクトのstarttls()メソッドを実行します。
obj_smtp.starttls()
これによりTLS暗号化を開始し、安全な通信ができるようになります。
SMTPサーバーにログイン
SMTPサーバーへ接続とTLS暗号化を開始したら、SMTPサーバーへログインします。
SMTPサーバーへのログインには、login()メソッドを使用します。
SMTPオブジェクト.login(ユーザー名, パスワード)
第一引数にはユーザー名(メールアドレス)、第二引数にはパスワードを指定します。
result = smtp_obj.login('example@office54.jp', 'Password')
print(result)
# (235, b'2.0.0 OK Authenticated')
上記のように戻り値に235が含まれていれば、ログイン認証が成功したことを意味します。
認証に失敗するとsmtplib.SMTPAuthenticationError例外が発生します。
セキュリティの観点より、スクリプトに直接パスワードは書かないようにしましょう。input()などを用いて、都度パスワードを入力するなど工夫をしましょう
メールの送信
SMTPサーバーにログインができると、以下のメソッドを用いてメールを送信することができます。
- sendmail()メソッド
- send_message()メソッド
sendmail()メソッド
sendmail()メソッドは次のように呼び出すことができます。
SMTPオブジェクト.sendmail(From, To, Message)
引数 | 説明 |
---|---|
From | 送り主のメールアドレス。メールのFrom欄 |
To | 受信者のメールアドレス。メールのTo欄 |
Message | メールの本文 |
メール本文のMessageはSubject:から始めます。Subject:以降にメールの件名を記入します。
メールの件名のあとに\nを記入し、その後に本文を記入します。
obj_smtp.sendmail('from@office54.net', 'to@office54.net', 'Subject: Title.\nDearOffice54, This is Test Email.'))
sendmail()メソッドの戻り値は辞書型となります。メース送信が失敗すると、エラー情報が格納されますので、戻り値が空であれば問題なくすべて送信されたということになります。
日本語でメール送信
上記の方法では日本語の文字列は送信することはできません。
sendmail()メソッドで日本語の文字列を扱いたい場合は、email.mine.text.MIMETextオブジェクトを利用します。
以下に日本語でメール送信する例を記します。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
charset = 'iso-2022-jp'
msg = MIMEText('本文', 'plain', charset)
msg['Subject'] = Header('件名', encode(charset), charset)
obj_smtp = smtplib.SMTP('smtp.office54.net', 587)
obj_smtp.starttls()
obj_smtp.login('example@office54.jp', 'Password')
obj_smtp.sendmail('from@office54.net', 'to@office54.net', msg.as_string())
obj_smtp.quit()
send_message()メソッド
もう一つのメールを送信するメソッドとしてsend_message()メソッドがあります。
send_message()メソッドは次のように使用します。
import smtplib
from email.mime.text import MIMEText
obj_smtp= smtplib.SMTP('smtp.office54.net', 587)
obj_smtp.starttls()
obj_smtp.login('example@office54.net', 'Password')
body = "メールの本文"
msg = MIMEText(body, "html")
msg['Subject'] = "メールの件名"
msg['To'] = 'test@office54.net '
msg['From'] = 'example@office54.net '
obj_smtp.send_message(msg)
obj_smtp.quit()
メールの本文はemailライブラリのMIMETextを使用します。
MIMEText()では引数にメール本文を指定し、それ以外のメール情報はキーワード引数で指定していきます。
この方法であれば英語でも日本語でも文字列に使用して送信することができます。
SMTPサーバーへの接続を切断
メールを無事送信できましたら、最後にSMTPサーバーとの接続を切断します。
SMTPサーバーとの切断にはquit()メソッドを使用します。
SMTPオブジェクト.quit()
quit()メソッドの戻り値で221が返ってきていれば、問題なく接続が切断されたことを意味します。
result = smtp_obj.quit()
print(result)
# (221, b'2.0.0 xxx closing connection')
ファイルをメールに添付する方法
smtplibモジュールを用いて、メールにファイルを添付する方法については以下記事をご参照ください。
【Python】メールにファイルを添付して送信する方法(smtplibモジュール)
まとめ
本記事「【Python】メールを英語・日本語で送信する方法(smtplibモジュール)」はいかがでしたか。
Pythonは業務自動化するプログラムを作成するのに適したプログラミング言語です。
メールの自動化も得意としていますので、ぜひ本記事を参考にして業務自動化に取り組んでみてください。