无法找到文件作为附件发送文件在python

问题描述:

我发现这个代码从另一个网站存储库,它用于发送电子邮件使用python和attach的文件以及。它在将文件发送到base64之前将其编码。在使用'.xlsx'文件之前,我测试了代码并发送了一个问题。但现在该程序不会因为某些原因发送它。该文件与代码位于同一文件夹中。无法找到文件作为附件发送文件在python

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' 

任何帮助,将不胜感激。

+1

不应该是'open('05 -11-2016 - Saturday.xlsx','rb')'? –

+0

当我这样做的消息发送,但它没有扩展名。所以这是一个没有扩展名的文件 – ashkl

+0

顺便说一句,谢谢你的提示,我只是试图修改和使用你的脚本,它的工作原理:)也许会有所帮助:) – Ilja

你已经在上面定义了filename - 那你为什么不使用它? :) (你忘了扩展的open声明“XLSX”)

您现在已经学会的DRY原则的usefullnes: http://wiki.c2.com/?DontRepeatYourself

通过键入两次,你可以更改文件名定义和没有注意到,open使用另一个文件...

+0

我也试过这个,它发送消息但没有xlsx文件扩展名。 – ashkl

+0

好吧,你打印的错误是“找不到文件”,原因是文件名错误。并用正确的文件名发送文件,但收件人看到它的名称没有扩展名?这与查找本地文件无关,但必须是sendmail脚本的设置。它是正确的文件,发送(尝试将其重命名为.xlsx并打开它)?也许如果你将'part.add_header(...)'改成了一些不同的字符串,你会看到会发生什么......? – Ilja

+0

是的,你可能是对的,谢谢你的帮助。 – ashkl

我刚刚使用我的凭据运行您的代码,并在与代码相同的目录中创建一个小的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") 

这两个会工作得很好。