如何使用Python的SendGrid API发送带有dataframe附件的邮件
实现方案
实现思路
- 不需要落地生成本地文件,直接在内存中将DataFrame转换为目标格式(CSV/Excel均可,以下以常用的CSV为例)
- 对转换后的内容进行base64编码,适配SendGrid附件的格式要求
- 将编码后的内容封装为SendGrid附件对象,添加到原有邮件实例中即可
依赖导入
确保提前导入所需模块:
import base64 from io import BytesIO from sendgrid.helpers.mail import Attachment, FileContent, FileName, FileType, Disposition
修改后的完整代码
def send_mail(content, df_to_attach=None): # 定义邮件正文 html_content='Hi Team,</br><strong>{}</br></br>Thanks</strong></br></br>'.format(content) # 构造基础邮件对象 message = Mail( from_email='XXXXXX@.com', to_emails=['XXXXXX@.com'], subject='test', html_content=html_content ) # 有传入DataFrame时处理附件 if df_to_attach is not None: # 内存中生成CSV字节流,设置utf-8-sig编码避免中文乱码,不导出索引列 buffer = BytesIO() df_to_attach.to_csv(buffer, index=False, encoding='utf-8-sig') buffer.seek(0) # base64编码 encoded_csv = base64.b64encode(buffer.read()).decode() # 构造附件对象 attachment = Attachment() attachment.file_content = FileContent(encoded_csv) attachment.file_name = FileName('业务数据.csv') attachment.file_type = FileType('text/csv') attachment.disposition = Disposition('attachment') # 附件添加到邮件 message.attachment = attachment try: sg = SendGridAPIClient(SENDGRID_API_KEY) response = sg.send(message) except Exception as e: logging.error(e.message) return None
扩展说明
如果需要导出为Excel格式附件,仅需修改附件处理部分的代码即可:
# 生成Excel字节流部分替换为以下代码 df_to_attach.to_excel(buffer, index=False, engine='openpyxl') # 对应文件配置修改为 attachment.file_name = FileName('业务数据.xlsx') attachment.file_type = FileType('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
注意:使用Excel格式需要提前安装openpyxl依赖,执行pip install openpyxl即可
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

