如何在Snowflake中配置任务将表数据导出为CSV并邮件发送
修改Snowflake Python存储过程以发送CSV格式邮件内容
以下是调整后的存储过程,可实现将指定表的查询结果转为CSV格式并作为附件发送给指定收件人:
with csv_email_results as procedure() returns string language python packages = ('snowflake-snowpark-python') handler = 'send_csv_email' runtime_version=3.8 as $$ def send_csv_email(session): # 查询目标表数据并转为CSV字符串(不含索引列) df = session.sql("select * from table").to_pandas() csv_content = df.to_csv(index=False) # 将CSV内容编码为Base64,满足邮件附件传输要求 encoded_csv = session.sql(f"SELECT UTIL$ENCODE_BASE64('{csv_content}')").collect()[0][0] # 构造带附件的MIME格式邮件体 email_body = f""" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="csv_boundary" --csv_boundary Content-Type: text/plain; charset=utf-8 任务A已完成,查询结果CSV附件已附上。 --csv_boundary Content-Type: text/csv; name="query_results.csv" Content-Disposition: attachment; filename="query_results.csv" Content-Transfer-Encoding: base64 {encoded_csv} --csv_boundary-- """ # 调用内置函数发送邮件 session.call('system$send_email', 'my_email_int', 'test@email.com', 'Email Alert: Task A has finished.', email_body) return "邮件发送成功" $$ call csv_email_results();
关键修改说明:
- 移除冗余依赖:删除不需要的
tabulate包,仅保留snowflake-snowpark-python - 替换格式生成逻辑:把
to_markdown()改为to_csv(index=False),生成纯CSV格式内容 - 适配邮件附件要求:用Snowflake内置的
UTIL$ENCODE_BASE64对CSV内容编码,避免传输乱码 - 重构邮件体结构:采用MIME多部分格式,同时包含纯文本说明和CSV附件,确保收件人能正常下载附件
注意事项:
- 确认已配置的电子邮件集成
my_email_int支持发送带附件的邮件 - 若表数据量过大,需留意存储过程的内存限制,必要时可拆分数据分批处理
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

