Multipart email PDF附件空白

问题描述:

任何人都可以指出下面的代码有什么问题吗?Multipart email PDF附件空白

我想用Python发送多部分电子邮件。我可以让电子邮件正文显示,但PDF显示为空白。

我可以收到一封电子邮件,上面只有一个工作机构,或者只有一个PDF,但是一起工作将无法工作。

s = smtplib.SMTP('smtp.gmail.com',587) 
s.starttls() 
s.ehlo 
try: 
    s.login(gmail, password) 
except: 
    print 'SMTPAuthenticationError' 

fp = file(attachment_path) 
pdfAttachment = MIMEApplication(fp.read(), _subtype = "pdf", _encoder=encoders.encode_base64) 
pdfAttachment.add_header('content-disposition', 'attachment', filename = ('utf-8', '', basename(attachment_path))) 
text = MIMEMultipart('alternative') 

t = open(email_body_path).read() 
text.attach(MIMEText(t, "plain", _charset="utf-8")) 
message = MIMEMultipart('mixed') 
message.attach(text) 
message.attach(pdfAttachment) 
message['Subject'] = 'Test multipart message' 

s.sendmail(gmail, '[email protected]', message.as_string()) 
s.close() 

我认为你可能会过度复杂的事情。旨在用于相同数据的不同表示,例如,纯文本版本的消息和HTML中的相同消息。在你的情况下,你可以创建一个multipart/mixed并附上文本和PDF消息。

from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 
from email.mime.application import MIMEApplication 

with open(attachment_path) as pdf_file, open(email_body_path) as text_file: 
    pdf = MIMEApplication(pdf_file.read(), _subtype = 'pdf') 
    pdf.add_header('content-disposition', 'attachment', filename=basename(attachment_path)) 
    text = MIMEText(text_file.read(), _charset='UTF-8') 

msg = MIMEMultipart(_subparts=(text, pdf)) 
msg['Subject'] = 'Test multipart message' 

这将创建一个消息,看起来像这样:

>>> print msg 
From nobody Tue Mar 3 16:35:45 2015 
Content-Type: multipart/mixed; boundary="===============4785752000147824692==" 
MIME-Version: 1.0 
Subject: Test multipart message 

--===============4785752000147824692== 
MIME-Version: 1.0 
Content-Type: text/plain; charset="utf-8" 
Content-Transfer-Encoding: base64 

VGhpcyBpcyB0aGUgZW1haWwgdGV4dCBib2R5LgpBbmQgdGhlcmUgaXMgYW4gYXR0YWNoZWQgUERG 
Lgo= 

--===============4785752000147824692== 
Content-Type: application/pdf 
MIME-Version: 1.0 
Content-Transfer-Encoding: base64 
content-disposition: attachment; filename="quickref.pdf" 

JVBERi0xLjQKJcfsj6IKNiAwIG9iago8PC9MZW5ndGggNyAwIFIvRmlsdGVyIC9GbGF0ZURlY29k 
ZT4+CnN0cmVhbQp4nOVbSXMctxW+T+We6xxnkkwb+3KUY9lVTizHFm1XyuUDTUk0o6Eka2Hik/56 
. 
. 
. 
--===============4785752000147824692==-- 

我有一个类似的问题。问题是,当你用python打开一个文件时,它是以人类可读的形式读取的(即接口库试图解码信息并以可编辑的形式呈现)。 但是我们无法使用python读取和解码pdf。因此,要重视你的PDF文件打开它字节读:

fp = open(attachment_path,'rb') 

现在,当你做到以下几点念你读它的机器可读格式的文件(因为它是存储在磁盘上,无需解码的任何企图的话) 。这会将您的文件按原样添加到消息中。这解决了我的问题。下面是我的文件attachement代码完整片段

attachment_path = "FILENAME.pdf" 
fp = open(attachment_path,'rb') 
x = fp.read() 
fp.close() 
fileMsg = email.mime.base.MIMEBase('application','pdf') 
fileMsg.set_payload(x) 
email.encoders.encode_base64(fileMsg) 
fileMsg.add_header('Content-Disposition','attachment;filename=FILENAME.pdf') 

希望这有助于:)