SPFの設定見直しなんかをやっていると
メールの試送が増えるんですが、
そのときにあったら便利っぽい関数を作りました。
必要最小限の仕様ですが、
関数でメールを送信できるようになると
思った以上に便利だったので共有します。
たぶん、他の方の環境でも動くかと思います。
万が一動かなかった場合には一報ください。
サポートは難しいですが、原因解消には結びつけたく思います。
ソース本体
SMTPy
SMTP mail sender on python
SMTP サーバを利用してメールを送信する Python ユーティリティです。
標準ライブラリのみで構築されており、本コードはポン付けで利用できます(たぶん)。
作ろうと思った経緯
複数のドメインに対して、それぞれのサブドメインでSPFの設定をしています。
SPFの設定自体は慣れてしまっているので難なくできるのですが、
念のために確認をしようと思うと、
あれこれメーラーの設定をしたりとめんどくさかったりします。
そこで、Python上で送信できる関数ができると楽ちんだなと考えて作りました。
本質的なコードは数行なのですが、試行用や他の関数と組み合わせて使うときに
あったら良さげな挙動(少なくとも私が欲しいと思う挙動)に対応させてあります。
機能的には最小限、テキストメールを送るというぐらいのものです。
TSLのみに対応させてありますので、SSLに対応させたいなどがありましたら、
このコードに適宜変更を加えていただいてご利用ください。
手元でのテストはレンタルサーバーのSMTPのみですが、
Gmail等でも動くと思います。きっと。
機能
- テキストメールの送信
-
STARTTLSによる暗号化通信 -
Cc・Bccを含む複数宛先対応 -
Message-Idヘッダの自動生成 -
Return-Pathの指定 -
smtplib.set_debuglevel(2)のデバッグログをキャプチャして出力
インストール
このリポジトリをクローンするだけで利用可能です。
git clone https://github.com/hama-caffeine/SMTPy.git
cd SMTPy
外部ライブラリは不要です(Python 標準ライブラリのみ使用)。
もしくは、コードを直接コピペして関数を呼び出しても利用可能です。
使い方
import smtpy
def main():
mail_text, mail_log = smtpy.send(
smtp_server = "smtp.example.com",
smtp_port = 587,
smtp_user = "your-username",
smtp_pwd = "your-password",
from_address = "username@example.com",
to_list = ["recipient@example.com"],
subject = "テストメール",
body = "これはテストメールです。",
)
print("=== Mail Text ===")
print(mail_text)
print("=== SMTP Log ===")
print(mail_log)
if __name__ == '__main__':
main()
関数仕様
send(...)
| 引数 | 型 | 説明 |
|---|---|---|
smtp_server |
str |
SMTP サーバアドレス |
smtp_port |
int |
ポート番号(例: 587) |
smtp_user |
str |
SMTP 認証ユーザー |
smtp_pwd |
str |
SMTP 認証パスワード |
from_address |
str |
実際の送信元(envelope-from, Return-Path) |
from_display |
str |
表示用の差出人名(例: "山田太郎") |
return_path |
str |
Return-Path を明示指定(省略時は from_address) |
to_list |
list |
宛先アドレス(To) |
cc_list |
list |
CC 宛先(省略可) |
bcc_list |
list |
BCC 宛先(省略可) |
subject |
str |
件名 |
body |
str |
本文 |
返り値
-
mail_text: 設定された要素で組み立てたメールのテキスト -
mail_log: SMTP 通信ログ(デバッグ情報を含む)
注意点
-
Return-Pathヘッダは受信サーバ側で上書きされる場合があります。sendmail()の envelope-from 引数によって決まるのが本来の挙動ですが、ここは私が使いやすい挙動にて。 -
set_debuglevel(2)の出力は通常標準出力/標準エラーに流れますが、本ユーティリティではStringIOにキャプチャし、mail_logとして返り値にしています。 - HTML メールや添付ファイルの送信は未対応です(拡張する場合は
email.mime.multipart等を利用してください)。