отображение пустого вложения в формате PDF при отправке нескольких электронных писем с соответствующим вложением в формате PDF - PullRequest
0 голосов
/ 20 марта 2019

Я новичок в Python, и у меня была задача отправить несколько электронных писем с соответствующими вложениями.Я выделю его, папка содержит несколько файлов PDF, каждый файл содержит некоторый текст, включая идентификатор электронной почты. Мне нужно прочитать идентификатор электронной почты из каждого файла PDF и отправить тот же файл, что и вложение к mailid в файле PDF.ниже приведен код для справки

# 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-файла

Спасибо заранее Madhu

1 Ответ

0 голосов
/ 20 марта 2019

Ваша проблема в том, что вы используете простой MIMEBase для (двоичного) файла PDF.Поскольку 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.

...