在Python电子邮件中附加文件
所以我尝试了多种方法将文件(特别是CSV文件)附加到python中的电子邮件并发送。我的文本电子邮件工作正常,我确实收到了一个CSV文件,只是一个空文件。我目前正在发送附件,如下所示:在Python电子邮件中附加文件,python,mime,Python,Mime,所以我尝试了多种方法将文件(特别是CSV文件)附加到python中的电子邮件并发送。我的文本电子邮件工作正常,我确实收到了一个CSV文件,只是一个空文件。我目前正在发送附件,如下所示: ctype, encoding = mimetypes.guess_type("results.csv") if ctype is None or encoding is not None: ctype = "application/octet-stream" maintype, subtype = c
ctype, encoding = mimetypes.guess_type("results.csv")
if ctype is None or encoding is not None:
ctype = "application/octet-stream"
maintype, subtype = ctype.split("/", 1)
# organizing receivers
receiver = receivers.split(',')
# creating subject
subject = 'BLAH BLAH'
timestamp = time.strftime("%m/%d/%Y:%H:%M:%S")
subject += str(timestamp)
# form email
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = " ".join(receivers)
msg['Subject'] = subject
msg['Message-Id'] = make_msgid()
msg['Date'] = formatdate(localtime=True)
msg.attach(MIMEText(msgstr, 'plain'))
if maintype == "text":
fp = open("results.csv")
attachment = MIMEText(fp.read(), _subtype=subtype)
fp.close()
else:
fp = open('results.csv', "rb")
attachment = MIMEBase(maintype, subtype)
attachment.set_payload(fp.read())
fp.close()
encoders.encode_base64(attachment)
attachment.add_header("Content-Disposition", "attachment", filename='results.csv')
msg.attach(attachment)
try:
smtpobj = smtplib.SMTP('smtp.gmail.com:587')
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(username, password)
smtpobj.sendmail(sender, receiver, msg.as_string())
smtpobj.quit()
except smtplib.SMTPException:
print 'Error: unable to send mail'
这与这里的答案类似:
我还尝试过更简单的方法,类似于:
和其他人,但没有成功。如何发送完整的附件?请按此方式编辑此部分
else:
with open('results.csv', "rb") as fp:
fp.seek(0)
attachment = MIMEBase(maintype, subtype)
attachment.set_payload(fp.read())
encoders.encode_base64(attachment)
因此,在多次调试之后,我意识到在再次尝试阅读该文件以了解电子邮件的组成之前,我没有正确地关闭该文件。我有如下类似的代码:
with open('results.csv', "rb") as csvfile:
#compose the csv file
#blah
#blah
#blah
#then I called my email function but the file hadn't yet been closed and I was trying to reopen.
为了解决这个问题,我只需使用语句在之外调用我的email函数来关闭文件
with open('results.csv', "rb") as csvfile:
#compose the csv file
#blah
#blah
#blah
send_the_email()
我希望这可以避免其他人像我一样在这么简单的事情上浪费太多时间。我尝试过,但不幸的是仍然收到空的附件(0 kb)。fp
后缺少分号,但这并不重要。