乐于分享
好东西不私藏

27、扣子-COZE智能体-批量EXCEL内容收发邮件

27、扣子-COZE智能体-批量EXCEL内容收发邮件

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_addrs    if 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.params    input_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 = fields    else:        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、结束节点

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