【问题标题】:Convert Google Doc to PDF and send email with PDF attachment将 Google Doc 转换为 PDF 并发送带有 PDF 附件的电子邮件
【发布时间】:2019-03-11 06:56:49
【问题描述】:

我正在尝试将 Google Doc 转换为 PDF(使用 Drive API),然后将文件附加到电子邮件中(使用 Gmail API)。

脚本运行,将 Google Doc 转换为 PDF,发送带有附件的电子邮件,但 PDF 附件为空白/损坏。

我怀疑问题出在以下行:msg.set_payload(fh.read())

相关文档:set_payloadio.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()

【问题讨论】:

    标签: python-2.7 google-drive-api gmail


    【解决方案1】:

    这个修改怎么样?我认为关于从 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,请在 API 控制台确认范围以及是否启用了 Gmail API。

    在我的环境中,我可以确认修改后的脚本有效。但如果这在您的环境中不起作用,我深表歉意。

    【讨论】:

    • 我唯一需要做的改变就是message_obj。 base64.urlsafe_b64encode(message.as_bytes()).decode() 为我返回了一个属性错误,但 base64.urlsafe_b64encode(message.as_string()) 的原始代码工作正常。 Python 版本可能存在差异。非常感谢您的帮助!
    • @beano 感谢您测试和添加信息。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多