通过 Gmail API 发送 Excel 文件,但附件已损坏

Posted

技术标签:

【中文标题】通过 Gmail API 发送 Excel 文件,但附件已损坏【英文标题】:Send Excel file via Gmail API but attachment is corrupted 【发布时间】:2018-04-23 00:55:40 【问题描述】:

我试图让 python 程序通过 Gmail 发送附件。 我使用了找到的示例代码: Sending email via gmail & python

问题是当我向自己发送 .xls、.xlsx、.xlsm 等 Excel 文件时,我无法打开附件,因为它们已损坏,即使原始文件很好。但是发送 .csv 可以正常工作。整个过程不弹出任何警告或错误。

问题是:oauth2.0 或 Gmail 或 MIME 是否将某些格式的附件弄乱了?以及如何在不修改的情况下告诉程序上传和发送附件?

【问题讨论】:

【参考方案1】:

有类似的问题。

错误可能是在将文件编码为字节。

当我想发送 xlsx 时,我的 gmail 仍然发送损坏的文件,但我设法收到了 xls 格式的正确电子邮件。

这是我的代码:

def create_message_with_excel_attachment(sender, to, subject, message_text, file):

    message = MIMEMultipart()
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject

    msg = MIMEText(message_text)
    message.attach(msg)

    part = MIMEBase('application', "vnd.ms-excel")
    part.set_payload(open(file, "rb").read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment', filename=file)
    message.attach(part)

    raw = base64.urlsafe_b64encode(message.as_bytes())
    raw = raw.decode()
    return 'raw': raw


def send_message(service, user_id, message):
    message = (service.users().messages().send(userId=user_id, body=message).execute())
    try:

        print ('Message Id: %s' % message['id'])
        return message
    except:
        print ('An error occurred:')

【讨论】:

也适用于 xlsx 文件。仅供参考 xls 文件和 xlsx 具有不同的底层格式:xls 是二进制格式,xlsx 是文本(Open XML)格式。干杯 encoders.encode_base64(part) 为我修复了它。您可以从电子邮件中导入编码器。 是的,encoders.encode_base64 来救援了!不错!

以上是关于通过 Gmail API 发送 Excel 文件,但附件已损坏的主要内容,如果未能解决你的问题,请参考以下文章

退回 <nobody@gmail.com> Gmail API 发送失败

使用 Gmail api 通过 Android 应用发送邮件

通过 Gmail API 发送电子邮件时应用 MSO 条件语句

如何通过 gmail-api for python 发送 HTML 格式的电子邮件

无法通过 gmail api 向多个发件人发送电子邮件

如何通过 Gmail API 从 .net 核心控制台应用程序发送电子邮件?