nyanpyou Note

主な目的は調べたり作ったりしたプログラミング備忘録(予定)

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での送信方法についての記載もあり

www.python.ambitious-engineer.com

docs.python.org