end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

smtplib for python で複数宛先へ送信する場合、smtplib.SMTP.send_message()へ to_addrs の指定も必要

タイトルの通りです。

smtplib for python によるメール送信の例は、 インターネット上で多く見かけますが、 複数宛先へ送信する場合、smtplib.SMTP.send_message()へ to_addrs の指定も 必要なようです。

smtplib.SMTP.send_message()へ to_addrs を指定しない場合、 message["To"]にある先頭アドレスにのみ、送信されるようです。

詳細は以下のpython scriptをご覧ください。

#!python
# -*- coding: utf-8 -*-
from email.mime.text import MIMEText
import smtplib
import socket
import sys

CONF={
    "mail": {"smtp_server" : "tx.xmile.sexy.co.jp",
             "port"    : 587,
             "user_id" : "send_user_id",
             "user_pw" : "send_user_pw",
             "from"    : "send_user_id@sexy.com",
             "cc"      : ["end0tknr@sexy.com"]
             }
}

def main():
    msg_body_tmpl = """
メール本文
"""
    msg_body = msg_body_tmpl.format(
        hostname = socket.gethostname(),
        ip       = socket.gethostbyname( socket.gethostname() ),
        script   = __file__ )
    message = MIMEText(msg_body,"plain", "utf-8")
    message["Subject"] = "エラー検知のお知らせ"
    message["From"] = CONF["mail"]["from"]

    tos = []
    for user_id,manager in notify_info["manager"].items():
        tos.append(manager["mail"])

    if len(tos) == 0 :
        print("no managers",file=sys.stderr)
        return

    message["To"]   = ",".join(tos)
    message["Cc"]   = ",".join( CONF["mail"]["cc"] )
    ## Toや Cc で複数宛先を指定する場合、to_addrs に配列を設定
    to_addrs = tos
    to_addrs += CONF["mail"]["cc"]
    
    try:
        server = smtplib.SMTP(CONF["mail"]["smtp_server"], CONF["mail"]["port"])
        server.set_debuglevel(True)
        server.login( CONF["mail"]["user_id"], CONF["mail"]["user_pw"])
        server.send_message( message,
                             to_addrs=to_addrs ## ココ
                            )
    except Exception as e:
        print(str(e), file=sys.stderr)
    server.quit()

if __name__ == '__main__':
    main()

参考url