Python で Office 365 からメールを送信する

Disclaimer: 本エントリの内容は2018年1月3日時点の Office 365 の仕様に基づいています。

Python で Office 365 からメールを送信する方法を検証してみた。

検証条件

メールの送信者となる Office 365 のユーザーには多要素認証を適用していない。

使用するライブラリ

smtplib パッケージと email パッケージを使用する。 smtplilb パッケージは SMTP サーバ(Office 365)との通信に用いる。一方、 email パッケージはメッセージの組み立てに用いる。

なお、 Office 365 からメールを送るための専用のパッケージもあるようだが、 smtplib のほうが汎用性が高そうなので、勉強がてら今回は smtplib を使うことにした。

コード

必要最小限ではあるが、以下のコードで Office 365 からメール送信できる。smtp.ehlo() 以降の行には、 Python インタプリタで一行ずつ実行した際の出力(SMTP サーバからの応答)をコメントとして併記している。

import smtplib
from email.message import EmailMessage

# 接続先 SMTP サーバの定義
smtp = smtplib.SMTP('smtp.office365.com', 587)  # FQDN とポート番号

# 認証情報の定義
user = 'USER@DOMAIN'  # SMTP サーバに接続するためのユーザ
password = "PASSWORD"

# メッセージの組み立て
message = EmailMessage()
message['From'] = 'SENDER@DOMAIN'  # 送信者のメールアドレス
message['To'] = 'RECIPIENT@DOMAIN'  # 受信者のメールアドレス
message['Subject'] = 'SUBJECT'  # 件名
message.set_content('CONTENT')  # 本文

# SMTP サーバへの接続とメールの送信
smtp.ehlo()
    # (250, ...
smtp.starttls()  # TLS の開始(以降の通信は暗号化される)
    # (220, b'2.0.0 SMTP server ready') 
smtp.ehlo()
    # (250, ...
smtp.login(user, password)  # SMTP サーバにログイン
    # (235, ...
smtp.send_message(message)  # メッセージの送信
    # {}
smtp.quit()  # SMTP セッションの終了と TCP コネクションの切断
    # (221, b'2.0.0 Service closing transmission channel')

参考