我正在使用以下代码向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'
有什么想法吗?提前谢谢。
答案 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。)
如果您对原始代码的错误更感兴趣,而不是如何正确地执行此操作,则会立即出现两个问题:
join
每个地址,正如Vader解释的那样。SMTP.sendmail
的第二个参数传递,但第二个参数是一系列地址。要解决此问题,请使用[s]
代替s
,正如大多数示例所做的那样。这两者都是由同样的混淆引起的,将每个地址视为地址列表。您可能会遇到由同一问题引起的其他错误。
答案 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'