Python3.6.8下使用Mandrill发送带Excel附件邮件的问题求助
解决Python3.6.8环境下Mandrill发送Excel附件问题
问题根源
- Excel文件生成错误:
workbook_to_str使用io.StringIO保存xlwt工作簿,而Excel是二进制格式,文本流会破坏文件结构,导致附件无法正常读取。 - 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
相关产品推荐
相关产品推荐

