Coze的玩法在自媒体领域应用广泛,像公众号爆文创作、漫画生成、小红书内容产出等都能轻松驾驭。
其实它还有一个高频实用的场景——办公自动化,不管是和Word、Excel、Markdown,还是飞书这类办公工具打交道,都能派上大用场。
后续还会增加更多办公自动化场景案例,学透这些内容后,大家完全可以举一反三,灵活迁移到其他类似场景中。

今天要分享的案例,就是用Coze实现批量发邮件的操作。这类需求在办公场景中很常见,比如固定给公司不同人员发送邮件,邮件的标题、内容、发送邮箱以及抄送邮箱都长期固定,可以把这些信息统一整理在Excel表格里,每月甚至每天重复执行批量发送操作。看似繁琐的工作,借助Coze就能轻松搞定。
下面,就来详细拆解具体的操作步骤:

用Coze实现批量发邮件的流程总共涉及5个节点,整体操作可以拆解为3个简单步骤:
1、上传Excel文件:把包含收件人地址、邮件标题、正文等信息的Excel表格上传至平台,注意将变量类型设置为Excel
2、解析表格内容:借助Coze的Excel读取插件,把表格数据转换为数组格式输出
3、批量发送邮件:通过循环遍历数组,将数组里的每一组数据(对应表格中的一行信息)解析后,自动完成邮件发送
说白了就是把原本需要人工重复执行的批量发邮件工作,用Coze平台实现自动化处理,大幅节省时间和精力。

1、开始节点
直接点击上传按钮,选择本地存储的Excel文件即可,务必在变量类型选项里选择「Excel」,确保平台能正确识别文件格式。

2、读取Excel文件内容节点
在Coze插件库中找到「读取Excel文件」插件并添加,该插件会自动将表格里的收件人地址、邮件标题、正文等内容提取出来,并转换为数组格式输出,为后续的循环发送做准备。

选中这个插件后,直接添加到你的工作流中即可。添加完成后可以点击试运行按钮,验证是否能成功读取Excel文件的内容,读取后的数据会呈现为指定格式。

3、循环节点配置
循环节点的作用是遍历前序节点输出的records数组内容,逐行提取Excel表格里的信息,然后依次完成邮件发送操作。简单来说,就是把数组里的每一组数据(对应表格中的一行内容)拆解出来,分别作为单封邮件的发送参数。

4、发送邮件节点配置(核心)
这里要重点说下发送邮件的节点配置,目前Coze插件市场的邮件发送插件有不少局限性,比如部分仅支持QQ邮箱或163邮箱,适配性不强。我直接让DeepSeek生成了一段通用代码来实现邮件发送功能,这样不管是QQ、163还是其他主流邮箱都能支持。
具体配置时,把代码节点添加到循环体内部,将循环提取出的收件人地址、邮件标题、正文等内容,对应填入代码的参数位置即可。

核心代码配置(关键)
这部分是实现通用邮箱发送的核心代码,支持阿里云、QQ、163等主流邮箱,具体配置和使用说明如下:
import smtplibimport json# ======= 发件人配置(建议后续改为环境变量)=======FROM_ADDR = "xxx@aliyun.com" # 替换为你的发件邮箱PASSWORD = "xxx" # 邮箱授权码,正式环境请勿写死SMTP_SERVER = "smtp.aliyun.com" # 对应邮箱的SMTP服务器地址SMTP_PORT = 465 # 阿里云SSL端口,其他邮箱需对应修改def parse_addrs(value):"""将收件人/抄送地址字段转换为列表,支持多种格式:- 单个邮箱:"a@b.com"- 分号分隔:"a@b.com;b@c.com"- 逗号分隔:"a@b.com,b@c.com"- 直接传入列表"""if not value:return []if isinstance(value, list):return [x.strip() for x in value if x.strip()]if isinstance(value, str):parts = value.split(";") if ";" in value else value.split(",")return [p.strip() for p in parts if p.strip()]return []def send_mail_from_row(row: dict):"""根据表格单行数据发送邮件,row示例:{"姓名": "张三","发送的邮箱": "8xxxxxxxx@qq.com","抄送的地址": "hi123@sohu.com","标题": "测试邮件标题","邮箱的内容": "测试邮件正文"}"""name = row.get("姓名", "")to_field = row.get("发送的邮箱", "")cc_field = row.get("抄送的地址", "")subject = row.get("标题", "自动邮件通知")body = row.get("邮箱的内容", "")to_addrs = parse_addrs(to_field)cc_addrs = parse_addrs(cc_field)all_receivers = to_addrs + cc_addrsif not all_receivers:raise ValueError("收件人地址为空,请检查发送的邮箱/抄送的地址字段")if not body:body = f"您好 {name},这是一封自动发送的测试邮件。"# 手动拼接邮件内容,兼容性更强header_lines = [f"From: {FROM_ADDR}",f"To: {', '.join(to_addrs)}" if to_addrs else "",f"Cc: {', '.join(cc_addrs)}" if cc_addrs else "",f"Subject: {subject}"]message = "\r\n".join([line for line in header_lines if line]) + "\r\n\r\n" + body# 发送邮件with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as server:server.login(FROM_ADDR, PASSWORD)server.sendmail(FROM_ADDR, all_receivers, message.encode("utf-8"))return {"name": name,"to_addrs": to_addrs,"cc_addrs": cc_addrs,"subject": subject}# ============ Coze 节点入口 ============async def main(args: Args) -> Output:params = args.paramsinput_obj = params.get("input", {})fields = input_obj.get("fields")if fields is None:return {"status": "error","error": "未找到'fields'字段,请检查数据格式","params": params}# 解析表格单行数据if isinstance(fields, str):try:row = json.loads(fields)except Exception as e:return {"status": "error","error": f"解析数据失败: {str(e)}","raw_fields": fields}elif isinstance(fields, dict):row = fieldselse:return {"status": "error","error": "数据格式错误,fields需为字符串或对象","type": str(type(fields))}# 执行发件try:info = send_mail_from_row(row)return {"status": "success","detail": info,"row": row}except Exception as e:return {"status": "error","error": str(e),"row": row}
参数配置说明
FROM_ADDR:填写你的发件邮箱地址,比如xxx@aliyun.com
PASSWORD:填写邮箱的授权码(非登录密码),正式环境建议通过环境变量配置,避免泄露
SMTP_SERVER:根据邮箱服务商填写对应SMTP服务器地址,比如QQ邮箱为smtp.qq.com,163邮箱为smtp.163.com
SMTP_PORT:对应邮箱的SMTP端口,一般SSL加密端口为465,非加密端口为587
代码关键逻辑
地址解析:支持多种格式的收件人/抄送地址,自动转换为标准列表
邮件拼接:手动拼接邮件头部和正文,兼容性更强,避免依赖第三方模块
异常处理:对空地址、空正文等异常情况做了兜底处理,确保流程稳定
Coze适配:通过main函数作为Coze节点入口,完美适配平台的工作流机制

5、结束节点
完成邮件发送后,添加结束节点即可完成整个工作流的闭环,平台会自动记录发送结果,方便后续查看和追溯。
夜雨聆风