smtplib で複数宛先にメールを出そうとしてハマった件
えー、題名どおり(笑)。
import smtplib from email.MIMEText import MIMEText from email.Header import Header from email.Utils import formatdate def create_message( from_addr, to_addr, subject, body, encoding='iso-2022-jp' ): """ creates MIMEText object """ msg = MIMEText(body.encode(encoding), 'plain', encoding ) msg['Subject'] = Header(subject.encode(encoding), charset=encoding, header_name = 'Subject' ) msg['From'] = from_addr msg['To'] = ",".join( to_addr ) # -- ココ<1> msg['Date'] = formatdate(localtime=True) return msg def send( from_addr, to_addr, msg ): """ send message using SMTP """ s = smtplib.SMTP('smtpgateway.somewhere.com') s.sendmail( from_addr, to_addr, msg.as_string()) # -- ココ<2> s.close() def main(): from_addr = 'ore1@somewhere.com' to_addr = ['ore1@somewhere.com','ore2@somewhere.com'] subject = u'題名です' body = u"""本文です""" msg = create_message( from_addr, to_addr, subject, body ) send( from_addr, to_addr, msg )
ポイントは:
- msg['To'] は「宛先名をコンマ区切りで羅列した文字列」で
- s.sendmail() に与える to_addr は、「アドレスのリスト」だってこと
分かってみればなんてことないんだけど、これでかなり悩みましたとさ……orz。
参考:Python Smtplib gotcha | A Drop In A Stream
↑この記事を見つけたとき、「ああ、おんなじところで悩んでる人、いたんだなぁ」と少し安心した。
ちなみに日付にformatdate(localdate=True)を使っているのは、某Tマネージャーの要請によるもの。うるさいことを言う人がいないなら、ココは単に formatdate() だけで桶。