Pythonでメールを送信する
例のウイルスにより諸々の対応に追われてしばらく何も書けていなかったが、その間に学んだことを忘れないように書いておく。
今回はPythonを使ったメール送信について。
テキストのみの送信(一番シンプルな例)
import smtplib, ssl from email.mime.text import MIMEText from getpass import getpass # SMTP認証情報 account = "メールを送信させたいアドレス" password = getpass("email password?:") # 送受信先 to_email = "送り先" cc_email = "CCの宛先1, CCの宛先2" bcc_email = "BCCの宛先" from_email = "送り主" # MIMEの作成 subject = "送信テスト" message = "Pythonプログラムから送信しています。" msg = MIMEText(message, "html") msg["Subject"] = subject msg["To"] = to_email msg['Cc'] = cc_email msg['Bcc'] = bcc_email msg["From"] = from_email server = smtplib.SMTP_SSL("smtpサーバーのアドレス", ポート番号, context=ssl.create_default_context()) server.login(account, password) server.send_message(msg) server.quit()
Pythonは電子メールの形式であるMIMEも、メール送信のプロトコルであるsmtpも標準のライブラリで使えるようになっているため、これらを用いることで簡単に電子メールが送信できる。セキュリティを少しでも強化するため、パスワードはgetpassでコマンドラインから引っ張ってくるようにした。
MIMEText()は今回引数でhtmlを指定しているが、何も指定しないとplainテキストになる。
from_emailは送信させたいアドレスと同じである必要はないので、送り主は好きなアドレスを設定できる。Pythonで送信したメールはThunderbirdなどのメーラーの送信済みボックスには残らないため、何かしらの記録を残す手段は用意しておく必要がある(CCに自分のアドレスを入れておくとか、送信ログを出力するようにしておくとか)。
添付ファイル付きの送信
import smtplib, ssl from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from os.path import basename from getpass import getpass # SMTP認証情報 account = "メールを送信させたいアドレス" password = getpass("email password?:") # 送受信先 to_email = "送り先" cc_email = "CCの宛先" bcc_email = "BCCの宛先" from_email = "送り主" # MIMEの作成 subject = "送信テスト" message = "Pythonプログラムから送信しています。" msg = MIMEMultipart() msg.attach(MIMEText(message)) msg["Subject"] = subject msg["To"] = to_email msg['Cc'] = cc_email msg['Bcc'] = bcc_email msg["From"] = from_email file_path = "添付したいファイルのパス" with open(file_path, "rb") as f: part = MIMEApplication( f.read(), Name=basename(file_path) ) part['Content-Disposition'] = 'attachment; filename="%s"' % basename(file_path) msg.attach(part) server = smtplib.SMTP_SSL("smtpサーバーのアドレス", ポート番号, context=ssl.create_default_context()) server.login(account, password) server.send_message(msg) server.quit()
添付ファイル付きのメールを作成する場合は、MIMEMultipartオブジェクトに本文と添付ファイルをくっつけていく(らしい)。
添付ファイルを添付している部分(filepath = ~の部分からmsg.attachまで)は、調べても添付ファイルをバイナリ形式で開いて何かをしている事しか分からなかったが、確かに添付ファイル付きでメールの送信はできた。
添付ファイル添付の部分を複数書くと、複数ファイルを添付することもできた(当然変数partは被らないように名前を変える)。
「ブラックボックスやけど動けばとりあえずええわ~」のスタンスはあまり好きではないので、この部分についてはいずれちゃんと理解したい。良い参考書や記事があればぜひ教えてください。
参考元
SSL接続以外での送信方法やGmailでの送信方法についての記載もあり