无法在python

时间:2017-03-04 18:18:45

标签: python email attachment mime smtplib

我从另一个网站存储库中找到了这个代码,它用于使用python发送电子邮件,并附加了一个文件。它将文件编码到base64 brfore发送之前。我在使用“.xlsx”文件之前测试了代码,并且发送时没有出现问题。但是现在该程序由于某种原因没有发送它。该文件与代码位于同一文件夹中。

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

fromaddr = "FROM EMAIL"
toaddr = "TO EMAIL"

msg = MIMEMultipart()

msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT"

body = "MESSAGE"

msg.attach(MIMEText(body, 'plain'))

filename = "05-11-2016 - Saturday.xlsx"
attachment = open("05-11-2016 - Saturday", "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

msg.attach(part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "PASSWORD")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()

当我运行时,这是输出的错误:

line 21, in <module>
    attachment = open("05-11-2016 - Saturday", "rb")
FileNotFoundError: [Errno 2] No such file or directory: '05-11-2016 - Saturday'

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您已在上面的行中定义了filename - 那么为什么不使用它? :) (您忘记了open声明中的扩展名'xlsx')

您现在已经学会了DRY原则的有用内容: http://wiki.c2.com/?DontRepeatYourself

通过输入两次,您可以更改文件名定义而不注意open使用其他文件......

答案 1 :(得分:0)

我只是使用我的凭据运行您的代码,并在与代码相同的目录中创建一个小的txt文件来复制您的条件。以下是您需要修改的内容:

filename = "ExplicitFileName.txt"
attachment = open("/USE/COMPLETE/PATH/TO/FILE/ExplicitFileName.txt", "rb")

或者正如Ilja指出DRY原则你可以这样做:

filename = "ExplicitFileName.txt"
attachment = open("/COMPLETE/PATH/TO/FILE/" + filename, "rb")

这两种方法都可以正常使用。