0

我正在使用以下代码向 python 中的人发送电子邮件。

import smtplib
from email.mime.multipart import MIMEMultipart, MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate

    def send_mail(send_from,send_to, subject, text, files=[], server = "localhost"):
        for s in send_to:
               COMMASPACE = ', '
               msg = MIMEMultipart()
               msg['From'] = send_from
               msg['To'] = COMMASPACE.join(s)
               msg['Date'] = formatdate(localtime=True)
               msg['Subject'] = subject

               msg.attach( MIMEText(text) )

               for f in files:
                       part = MIMEBase('application', "octet-stream")
                       part.set_payload( open(f,"rb").read() )
                       Encoders.encode_base64(part)
                       part.add_header('Content-Disposition', 'attachment; filename="%s"' %os.path.basename(f))
                       msg.attach(part)

               server = smtplib.SMTP(server)
               server.sendmail(send_from, s, msg.as_string())
               server.close()

如果格式混乱,请见谅。emails 是一个包含两封电子邮件的预定义列表。我遇到的错误是:AttributeError: SMTP instance has no attribute 'find'

任何的想法?提前致谢。

4

2 回答 2

1

您无需为每个收件人创建单独的电子邮件;只需发送一条包含多个收件人的消息:

def send_mail(send_from,send_to, subject, text, files=[], server = "localhost"):
   msg = MIMEMultipart()
   msg['From'] = send_from
   msg['To'] = COMMASPACE.join(send_to)

   # ... 

   server = smtplib.SMTP(server)
   server.sendmail(send_from, send_to, msg.as_string())
   server.close()

这与docs中的示例“这是一个如何发送包含一堆可能位于目录中的家庭照片的 MIME 消息的示例”几乎相同。

(如果您不希望每个人都看到对方的地址,您可以将它们全部设为BCCs 而不是Tos。)

如果您对原始代码的问题而不是如何正确执行更感兴趣,那么有两个立即可见的问题:

  1. join正如维德解释的那样,你正在输入每个地址。
  2. 您将单个地址作为字符串作为第二个参数传递给SMTP.sendmail,但第二个参数是地址序列。要解决此问题,请使用[s]而不是s,就像大多数示例一样。

这两者都是由相同的混淆引起的,将每个地址视为地址列表。您可能会遇到由相同问题引起的其他错误。

于 2013-01-31T23:33:58.337 回答
0

我认为你的问题在这里:

>>> COMMASPACE = ', '
>>> send_to = ('test@example.com','test2@example.com')
>>> for s in send_to:
...  print COMMASPACE.join(s)
...
t, e, s, t, @, e, x, a, m, p, l, e, ., c, o, m
t, e, s, t, 2, @, e, x, a, m, p, l, e, ., c, o, m

这就是我认为您正在尝试做的事情:

    >>> COMMASPACE.join(send_to)
    'test@example.com, test2@example.com'
于 2013-01-31T23:17:30.927 回答