当我尝试向python中的多个人发送电子邮件时遇到错误

时间:2013-01-31 22:50:34

标签: python

我正在使用以下代码向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()

如果格式混乱,请注意格式化。电子邮件是一个包含两封电子邮件的预定义列表。我遇到的错误是:         AttributeError:SMTP实例没有属性' find'

有什么想法吗?提前谢谢。

2 个答案:

答案 0 :(得分: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消息的示例”。

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

如果您对原始代码的错误更感兴趣,而不是如何正确地执行此操作,则会立即出现两个问题:

  1. 你正在join每个地址,正如Vader解释的那样。
  2. 您将单个地址作为字符串作为SMTP.sendmail的第二个参数传递,但第二个参数是一系列地址。要解决此问题,请使用[s]代替s,正如大多数示例所做的那样。
  3. 这两者都是由同样的混淆引起的,将每个地址视为地址列表。您可能会遇到由同一问题引起的其他错误。

答案 1 :(得分: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'