发送多封带有相关pdf附件的电子邮件时,显示空白的pdf附件

时间:2019-03-20 09:26:29

标签: python email pypdf2

我是python的新手,并且有一个任务来发送带有相关附件的多封电子邮件。我将详细介绍它,一个文件夹包含多个pdf文件,每个文件包含一些文本,包括电子邮件ID。我需要从每个pdf文件中读取电子邮件ID,并将与pdf文件中mailid附件相同的文件发送出去。下面是参考代码

# Get the count of files in the folder
import os
import re
global str
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase

cpt = sum([len(files) for r, d, files in 
os.walk("D:\MyOfficeDocuments\ADCB\PythonScripts\PdfFiles")])

#Reading Mail from each pdf file and send the same file as attachment to 
these mails
import PyPDF2
from os import listdir
from os.path import isfile, join
from PyPDF2 import PdfFileWriter, PdfFileReader
mypath='D:\MyOfficeDocuments\ADCB\PythonScripts\PdfFiles'
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
for file in onlyfiles:

count = 1
while count <cpt:
    os.chdir(r'D:\MyOfficeDocuments\ADCB\PythonScripts\PdfFiles')
    pdfFileObj = open(file,'rb')
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
    pageObj = pdfReader.getPage(0)
    count +=1
    text = pageObj.extractText()
    email_user='madhugut82@gmail.com'
    eline = re.findall('\S+@\S+.com', text)
    email_send=eline
    print(file)
    password='harshi54537'
    subject='Python !'
    msg=MIMEMultipart()
    msg['From']=email_user
    msg['To']=', '.join(email_send)
    #listalink = " ".join(listalink)
    msg['Subject']=subject
    #print (email_send)
    body='Hi there, sending this email from python using python scripting'
    msg.attach(MIMEText(body,'plain'))
    filename 
    ='D:\MyOfficeDocuments\ADCB\PythonScripts\Destination\Document.txt'
    attachment=open(file,'rb')
    #print(attachment)
    part=MIMEBase('application','pdf')
    part.set_payload(attachment.read())
    part.add_header('Content-Disposition',"attachement; filename="+file)
    msg.attach(part)
    #email.encoders.encode_base64(part)
    print('x')

    text=msg.as_string()

    #text=msg.encode("utf8")
    #text=msg.as_string().encode('utf-8','ignore')
    #text=msg.as_string().encode('ascii','ignore')
    server=smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(email_user,password)
    server.sendmail(email_user,email_send,text)
    #server.sendmail(email_user,email_send,msg.encode("utf8"))
    server.quit()

按照上面的代码,我收到下面显示的错误消息

msg = _fix_eols(msg).encode('ascii')

UnicodeEncodeError:'ascii'编解码器无法在位置559-562处编码字符:序数不在范围内(128)

但是如果我将代码更改如下

text=ms.as_string().encode("UTF")

我没有收到任何错误,但附件显示为空白

请建议我确切的问题在哪里,获取空白pdf附件的问题是什么。

我要求您提供任何代码建议,然后仅建议使用pdf文件

预先感谢 马杜

1 个答案:

答案 0 :(得分:0)

您的问题是,您对(二进制)pdf文件使用了简单的MIMEBase。由于MIMEBase是各种可能的消息类型的父类,因此它不对有效载荷进行编码,并且您的消息包含原始8位字节。

此处有两个可能的解决方法:

  1. 仅以base64编码pdf文件内容:

    ...
    from email.encoders import encode_base64
    ...
        part=MIMEBase('application','pdf')
        part.set_payload(attachment.read())
        part.add_header('Content-Disposition',"attachement; filename="+file)
        encode_base64(part)
        msg.attach(part)
    ...
    
  2. 使用更专业的MIMEApplication,默认情况下会对其进行编码:

    ...
    from email.mime.application import MIMEApplication
    ...
        part=MIMEApplication(attachment.read(),'pdf')
        part.add_header('Content-Disposition',"attachement; filename="+file)
        msg.attach(part)
    ...
    

我建议您使用第二种方法,因为MIMEBase的文档中说:

  

通常,尽管可以,但是您不会创建专门针对MIMEBase的实例。 MIMEBase主要作为方便的基类提供,用于更特定的MIME感知子类。

相关问题