多部分电子邮件PDF附件blan

2024-10-01 17:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能指出下面的代码有什么问题吗?在

我想用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, 'me@gmail.com', message.as_string())
s.close()

Tags: pathtextcommessagereadattachmentpdf电子邮件
2条回答

我想你可能把事情搞得太复杂了。multipart/alternative用于相同数据的不同表示,例如消息的纯文本版本和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'

这将创建一条如下所示的消息:

^{pr2}$

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

fp = open(attachment_path,'rb')

现在,当您执行以下读取操作时,您将以机器可读的格式读取该文件(因为它存储在磁盘上,没有任何解码尝试)。这会将您的文件按原样附加到邮件中。这就解决了我的问题。这是我的文件附件代码的完整片段

^{pr2}$

希望这有帮助:)

相关问题 更多 >

    热门问题