Преобразование Google Doc в PDF и отправка электронной почты с вложением PDF - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь преобразовать Google Doc в PDF (используя Drive API), а затем прикрепляю файл к электронному письму (используя Gmail API).

Сценарий выполняется, передает Google Doc в PDF, отправляет электронное письмо с вложением, но вложение PDF пустое / повреждено.

Я подозреваю, что проблема в строке: msg.set_payload(fh.read())

Соответствующая документация: set_payload и io.Bytes ()

Любое руководство очень ценится.

import base64
import io
from apiclient.http import MediaIoBaseDownload
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase

fileId = '1234'
content_type = 'application/pdf'

response = drive.files().export_media(fileId=fileId, mimeType=content_type)

fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, response)
done = False
while done is False:
    status, done = downloader.next_chunk()
    logging.info("Download %d%%." % int(status.progress() * 100))

message = MIMEMultipart()
message['to'] = 'myemail@gmail.com'
message['from'] = 'myemail@gmail.com'
message['subject'] = 'test subject'

msg = MIMEText('test body')
message.attach(msg)

main_type, sub_type = content_type.split('/', 1)
msg = MIMEBase(main_type, sub_type)
msg.set_payload(fh.read()) # i suspect the issue is here

msg.add_header('Content-Disposition', 'attachment', filename='an example file name.pdf')
message.attach(msg)

message_obj = {'raw': base64.urlsafe_b64encode(message.as_string())}

service.users().messages().send(userId="me", body=message_obj).execute()

1 Ответ

1 голос
/ 11 марта 2019

Как насчет этой модификации?Я думаю, что по поводу загрузки с Google Drive, ваш скрипт правильный.Поэтому я хотел бы предложить изменить скрипт для отправки электронного письма с вложенным файлом.

Я подумал, что msg.set_payload(fh.read()) - одна из точек модификации, как вы говорите.Таким образом, данные, полученные с помощью getvalue(), были преобразованы в email.encoders.encode_base64().А также я изменил message_obj.

Модифицированный скрипт:

Пожалуйста, измените следующим образом.

С:

msg = MIMEText('test body')
message.attach(msg)

main_type, sub_type = content_type.split('/', 1)
msg = MIMEBase(main_type, sub_type)
msg.set_payload(fh.read()) # i suspect the issue is here

msg.add_header('Content-Disposition', 'attachment', filename='an example file name.pdf')
message.attach(msg)

message_obj = {'raw': base64.urlsafe_b64encode(message.as_string())}

service.users().messages().send(userId="me", body=message_obj).execute()

Кому:

from email import encoders  # Please add this.

msg = MIMEText('test body')
message.attach(msg)

main_type, sub_type = content_type.split('/', 1)
msg = MIMEBase(main_type, sub_type)
msg.set_payload(fh.getvalue())  # Modified
encoders.encode_base64(msg)  # Added

msg.add_header('Content-Disposition', 'attachment', filename='an example file name.pdf')
message.attach(msg)

message_obj = {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode()}  # Modified

service.users().messages().send(userId="me", body=message_obj).execute()

Примечание:

  • Эта модификация предполагает, что вы уже смогли отправлять электронные письма с помощью Gmail API.Если вы не можете использовать Gmail API, подтвердите области действия и включите ли Gmail API на консоли API.

В моей среде я могу подтвердить, что измененный сценарий работает.Но если это не сработало в вашей среде, я прошу прощения.

...