【问题标题】:Multipart email PDF attachment blank多部分电子邮件 PDF 附件空白
【发布时间】:2015-05-03 11:53:12
【问题描述】:

谁能指出下面的代码有什么问题?

我正在尝试使用 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()

【问题讨论】:

    标签: python email mime


    【解决方案1】:

    我认为您可能过于复杂了。 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'
    

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

    >>> 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==--
    

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题。问题是当您在 python 中打开文件时,它以人类可读的形式读取(即接口库尝试解码信息并以可编辑的形式呈现)。 但是我们无法使用 python 以他的方式读取和解码 pdf。因此,要附加您的 pdf 文件,请将其打开为字节可读:

      fp = open(attachment_path,'rb')
      

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

      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')
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-12
        • 2015-11-25
        • 2019-08-10
        • 2013-07-13
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多