さり海馬

Thoughts walk away, blog stays.

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 )

ポイントは:

  1. msg['To'] は「宛先名をコンマ区切りで羅列した文字列」で
  2. s.sendmail() に与える to_addr は、「アドレスのリスト」だってこと

分かってみればなんてことないんだけど、これでかなり悩みましたとさ……orz。

参考:Python Smtplib gotcha | A Drop In A Stream
↑この記事を見つけたとき、「ああ、おんなじところで悩んでる人、いたんだなぁ」と少し安心した。

ちなみに日付にformatdate(localdate=True)を使っているのは、某Tマネージャーの要請によるもの。うるさいことを言う人がいないなら、ココは単に formatdate() だけで桶。