You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.6.8下使用Mandrill发送带Excel附件邮件的问题求助

解决Python3.6.8环境下Mandrill发送Excel附件问题

问题根源

  1. Excel文件生成错误:workbook_to_str使用io.StringIO保存xlwt工作簿,而Excel是二进制格式,文本流会破坏文件结构,导致附件无法正常读取。
  2. Base64编码方式错误:字节数组没有toString('base64')方法,原代码的编码逻辑不成立,无法生成Mandrill要求的Base64字符串。

修正步骤

1. 修复Excel生成逻辑

去掉错误的文本流处理,直接用二进制流生成Excel字节数据:

import io
import xlwt

def export(licenses, plain_str=False):  # 默认返回字节数组
    workbook = xlwt.Workbook()
    products_sheet = _create_product_sheet(workbook)
    product_row_offset = 1
    cell_style = xlwt.easyxf('font: underline single; font: color blue')

    if licenses:
        for lic in licenses:
            row = products_sheet.row(product_row_offset)
            _write_product_row(row, lic, cell_style=cell_style)
            product_row_offset += 1

    # 直接生成并返回二进制字节数据
    io_buffer = io.BytesIO()
    workbook.save(io_buffer)
    return io_buffer.getvalue()

2. 修正Mandrill附件编码逻辑

使用Python标准库base64对字节数据进行编码,转换为Mandrill要求的Base64字符串:

import os
import base64

def _send_message(to, subject, htmlbody, add_header=True, cc=None, 
                  bcc=None, attachment=None, attachment_content=None):
    if os.getenv('MGC_ENV') != 'prod':
        subject = '[{0}] '.format(os.getenv('MGC_ENV')) + subject

    if add_header:
        subject = 'MAP {0}'.format(subject)
    
    recipients = _generate_recipients(to, cc, bcc)
    if len(recipients) == 0:
        return

    bundle = {
        'to': recipients,
        'from_email': os.getenv('FROM_EMAIL'),
        'subject': subject,
        'html': htmlbody,
        'tags': _MANDRILL_TAGS,
        'preserve_recipients': True
    }

    if attachment and attachment_content:
        # 正确将字节数组编码为Base64字符串
        base64_content = base64.b64encode(attachment_content).decode('utf-8')
        bundle["attachments"] = [{
            "type": 'application/vnd.ms-excel',  # xlwt生成xls格式,修正MIME类型
            "name": 'OrderConfirmation.xls',  # 文件名对应xls格式
            "content": base64_content
        }]

    if os.getenv('ENABLE_NOTIFICATIONS') == 'false':
        return

    _mandrill_client.messages.send(bundle)

额外注意点

  • xlwt库生成的是Excel 97-2003格式(.xls),对应的MIME类型是application/vnd.ms-excel,原代码中写的application/xlsx是错误的,需同步修正文件名后缀为.xls,避免收件方打开时提示格式不匹配。
  • 调用export函数时,直接使用默认参数plain_str=False,获取二进制字节数据传入_send_message的attachment_content参数即可。

内容的提问来源于stack exchange,提问作者Siva Kishore Bonu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:54:25