影刀RPA 邮件发送的自动化:从简单文本到HTML模板
影刀RPA 邮件发送的自动化从简单文本到HTML模板作者林焱发邮件是RPA流程里最常见的收尾动作——采集完数据发邮件、生成报表发邮件、出错报警发邮件。但很多人写邮件自动化时卡在附件发不出去、中文标题乱码、HTML邮件排版难看、邮箱认证失败。这篇文章从简单到复杂讲清楚影刀RPA里邮件发送的完整方案。一、什么情况用什么场景推荐方案说明简单通知邮件纯文本邮件最简单几行代码搞定带表格的报表邮件HTML邮件表格排版好看带附件的邮件multipart邮件支持任意文件附件群发邮件抄送/密送设置cc/bcc适合通知多人定时日报邮件模板变量替换每天自动生成不同内容个性化群发逐个发送每人不同内容带图片的邮件HTML内嵌图片图片直接显示在邮件里二、怎么做2.1 最简单的纯文本邮件importsmtplibfromemail.mime.textimportMIMETextdefsend_simple_email(smtp_host,port,sender,password,receiver,subject,body):发送纯文本邮件msgMIMEText(body,plain,utf-8)msg[From]sender msg[To]receiver msg[Subject]subjecttry:serversmtplib.SMTP(smtp_host,port)server.starttls()server.login(sender,password)server.sendmail(sender,[receiver],msg.as_string())server.quit()print(邮件发送成功)returnTrueexceptExceptionase:print(f发送失败:{e})returnFalse# QQ邮箱示例使用授权码不是密码# send_simple_email(# smtp.qq.com, 587,# your_emailqq.com, your_auth_code,# receiverexample.com,# RPA流程完成通知,# 商品采集流程已执行完成共采集50条数据。# )常见SMTP服务器配置拼多多店群自动化报活动上架邮箱SMTP服务器端口说明QQ邮箱smtp.qq.com587用授权码163邮箱smtp.163.com587用授权码Gmailsmtp.gmail.com587用应用专用密码| Outlook | smtp.office365.com | 587 | 用账号密码 || 企业微信邮箱 | smtp.exmail.qq.com | 465 | SSL连接 |2.2 HTML邮件带表格importsmtplibfromemail.mime.textimportMIMETextfromdatetimeimportdatetimedefsend_html_email(smtp_host,port,sender,password,receiver,subject,html_content):发送HTML邮件msgMIMEText(html_content,html,utf-8)msg[From]sender msg[To]receiver msg[Subject]subjecttry:serversmtplib.SMTP(smtp_host,port)server.starttls()server.login(sender,password)server.sendmail(sender,[receiver],msg.as_string())server.quit()print(HTML邮件发送成功)returnTrueexceptExceptionase:print(f发送失败:{e})returnFalse# 生成HTML表格defbuild_report_html(title,data_rows,headers):构建HTML报表rows_htmlforrowindata_rows:cells.join(ftd stylepadding:8px;border:1px solid #ddd;{cell}/tdforcellinrow)rows_htmlftr{cells}/trheader_html.join(fth stylepadding:8px;border:1px solid #ddd;background:#f5f5f5;text-align:left;{h}/thforhinheaders)htmlf html body stylefont-family: Microsoft YaHei, Arial, sans-serif; color: #333; h2 stylecolor: #1890ff;{title}/h2 p stylecolor: #666; font-size: 14px;生成时间:{datetime.now().strftime(%Y-%m-%d %H:%M:%S)}/p table styleborder-collapse: collapse; width: 100%; margin: 20px 0; thead tr{header_html}/tr /thead tbody{rows_html}/tbody /table hr styleborder: none; border-top: 1px solid #eee; margin: 20px 0; p stylecolor: #999; font-size: 12px;此邮件由RPA流程自动发送请勿回复。/p /body /html returnhtml# 使用示例# headers [商品名称, 价格, 库存, 状态]# data [# [商品A, ¥99, 500, 在售],# [商品B, ¥199, 0, 缺货],# [商品C, ¥59, 120, 在售],# ]# html build_report_html(商品采集日报, data, headers)# send_html_email(smtp.qq.com, 587, youqq.com, auth_code, bosscompany.com, 商品采集日报, html)2.3 带附件的邮件importsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipartfromemail.mime.applicationimportMIMEApplicationimportosdefsend_email_with_attachments(smtp_host,port,sender,password,receiver,subject,body,attachmentsNone,ccNone):发送带附件的邮件msgMIMEMultipart()msg[From]sender msg[To]receiverifcc:msg[Cc]cc msg[Subject]subject# 邮件正文msg.attach(MIMEText(body,html,utf-8))# 添加附件ifattachments:forfile_pathinattachments:ifnotos.path.exists(file_path):print(f附件不存在跳过:{file_path})continuewithopen(file_path,rb)asf:attachmentMIMEApplication(f.read())# 设置附件文件名处理中文文件名filenameos.path.basename(file_path)attachment.add_header(Content-Disposition,attachment,filename(utf-8,,filename))msg.attach(attachment)print(f附件已添加:{filename})# 发送receivers[receiver]ifcc:receivers.extend(cc.split(,))try:serversmtplib.SMTP(smtp_host,port)server.starttls()server.login(sender,password)server.sendmail(sender,receivers,msg.as_string())server.quit()print(f邮件发送成功收件人:{receivers})returnTrueexceptExceptionase:print(f发送失败:{e})returnFalse# 使用示例# send_email_with_attachments(# smtp.qq.com, 587, youqq.com, auth_code,# bosscompany.com,# 周报,# h2本周工作周报/h2p详见附件。/p,# attachments[rD:\report\weekly_report.xlsx, rD:\report\chart.png],# cccolleaguecompany.com# )2.4 邮件模板系统每次发邮件都要重写HTML太麻烦。做一个模板系统只替换变量importosfromdatetimeimportdatetimeclassEmailTemplate:邮件模板管理# 日报模板DAILY_REPORT html body stylefont-family: Microsoft YaHei, Arial, sans-serif; color: #333; h2 stylecolor: #1890ff; {{title}}/h2 p stylecolor: #666;日期: {{date}}/p div stylebackground: #f6f8fa; padding: 15px; border-radius: 5px; margin: 15px 0; h3 stylemargin-top: 0;执行概要/h3 ul li流程状态: strong stylecolor: {{status_color}};{{status}}/strong/li li执行耗时: {{duration}}/li li处理数据量: {{data_count}} 条/li li成功率: {{success_rate}}%/li /ul /div {{table_html}} {{error_section}} hr styleborder: none; border-top: 1px solid #eee; margin: 20px 0; p stylecolor: #999; font-size: 12px;此邮件由RPA流程自动发送 | {{send_time}}/p /body /html # 错误报警模板ERROR_ALERT html body stylefont-family: Microsoft YaHei, Arial, sans-serif; color: #333; h2 stylecolor: #ff4d4f;⚠️ 流程异常报警/h2 div stylebackground: #fff2f0; padding: 15px; border-left: 4px solid #ff4d4f; margin: 15px 0; pstrong流程名称:/strong {{flow_name}}/p pstrong发生时间:/strong {{error_time}}/p pstrong错误信息:/strong/p pre stylebackground: #f5f5f5; padding: 10px; overflow-x: auto; font-size: 13px;{{error_message}}/pre /div p stylecolor: #666;请及时检查并处理。/p hr styleborder: none; border-top: 1px solid #eee; margin: 20px 0; p stylecolor: #999; font-size: 12px;RPA自动报警系统 | {{send_time}}/p /body /html classmethoddefrender(cls,template,**kwargs):渲染模板resulttemplateforkey,valueinkwargs.items():resultresult.replace(f{{{{{key}}}}},str(value))returnresult# 使用示例日报# html EmailTemplate.render(# EmailTemplate.DAILY_REPORT,# title商品采集日报,# datedatetime.now().strftime(%Y-%m-%d),# status成功 if success else 失败,# status_color#52c41a if success else #ff4d4f,# duration3分20秒,# data_count50,# success_rate96,# table_htmlp详见附件/p,# error_section,# send_timedatetime.now().strftime(%Y-%m-%d %H:%M:%S)# )# 使用示例错误报警# html EmailTemplate.render(# EmailTemplate.ERROR_ALERT,# flow_name商品采集_v3,# error_timedatetime.now().strftime(%Y-%m-%d %H:%M:%S),# error_messageTimeoutError: 翻页采集第3页时超时\n请检查网络连接,# send_timedatetime.now().strftime(%Y-%m-%d %H:%M:%S)# )2.5 HTML内嵌图片有时候需要把图片直接显示在邮件正文里不是附件importsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipartfromemail.mime.imageimportMIMEImageimportosdefsend_email_with_inline_image(smtp_host,port,sender,password,receiver,subject,html_body,image_path,image_cidreport_chart):发送带内嵌图片的HTML邮件msgMIMEMultipart(related)msg[From]sender msg[To]receiver msg[Subject]subject# HTML正文引用图片用cid:html_with_imagehtml_body.replace(f{{{{image}}}},fcid:{image_cid})msg.attach(MIMEText(html_with_image,html,utf-8))# 添加图片ifos.path.exists(image_path):withopen(image_path,rb)asf:imgMIMEImage(f.read())img.add_header(Content-ID,f{image_cid})img.add_header(Content-Disposition,inline,filenameos.path.basename(image_path))msg.attach(img)print(f图片已内嵌:{image_path})else:print(f图片不存在:{image_path})try:serversmtplib.SMTP(smtp_host,port)server.starttls()server.login(sender,password)server.sendmail(sender,[receiver],msg.as_string())server.quit()print(邮件发送成功)returnTrueexceptExceptionase:print(f发送失败:{e})returnFalse# HTML模板里用 {{image}} 引用图片位置# html # htmlbody# h2销售趋势图/h2# img src{{image}} stylemax-width: 600px;/# /body/html# # send_email_with_inline_image(# smtp.qq.com, 587, youqq.com, auth_code,# bosscompany.com, 销售周报,# html, rD:\charts\sales_trend.png# )三、有什么坑坑1QQ邮箱/163邮箱认证失败用登录密码直接连SMTP会报认证失败。QQ和163邮箱要求使用授权码。解决登录QQ邮箱→设置→账户→开启SMTP服务生成授权码代码里用授权码代替密码坑2中文附件名乱码直接用中文文件名作为附件有些邮箱客户端显示乱码。解决用编码方式设置文件名fromemail.utilsimportformataddrfromemail.headerimportHeader# 正确设置中文附件名attachment.add_header(Content-Disposition,attachment,filename(utf-8,,中文文件名.xlsx))坑3SSL连接 vs STARTTLS有些邮箱用465端口SSL有些用587端口STARTTLS。搞混了连不上。TEMU店群矩阵自动化运营核价报活动# 465端口SSL直连serversmtplib.SMTP_SSL(smtp_host,465)server.login(sender,password)# 587端口STARTTLSserversmtplib.SMTP(smtp_host,587)server.starttls()server.login(sender,password)坑4附件太大发送失败大多数邮箱对附件大小有限制QQ邮箱50MBGmail 25MB。解决大文件先压缩或者上传到网盘后在邮件里放链接importzipfileimportosdefcompress_files(file_paths,zip_path):压缩文件withzipfile.ZipFile(zip_path,w,zipfile.ZIP_DEFLATED)aszf:forfile_pathinfile_paths:ifos.path.exists(file_path):zf.write(file_path,os.path.basename(file_path))original_sizesum(os.path.getsize(f)forfinfile_pathsifos.path.exists(f))zip_sizeos.path.getsize(zip_path)print(f原始:{original_size/1024/1024:.1f}MB → 压缩:{zip_size/1024/1024:.1f}MB)returnzip_path坑5群发邮件被判定为垃圾邮件短时间内发大量邮件或者邮件内容有敏感词可能被邮箱服务商限制。解决控制发送频率每次间隔几秒群发用密送BCC收件人看不到其他人地址避免标题和内容有广告类关键词defsend_batch_emails(smtp_config,email_list,interval5):批量发送邮件带间隔importtime success_count0fori,email_datainenumerate(email_list):print(f[{i1}/{len(email_list)}] 发送给:{email_data[receiver]})resultsend_simple_email(smtp_config[host],smtp_config[port],smtp_config[sender],smtp_config[password],email_data[receiver],email_data[subject],email_data[body])ifresult:success_count1# 间隔等待ifilen(email_list)-1:time.sleep(interval)print(f发送完成:{success_count}/{len(email_list)}成功)总结邮件自动化的核心要点用授权码不用密码——QQ/163邮箱都用授权码HTML邮件用模板——写一次模板每次只换变量中文文件名要编码——否则附件名乱码大文件先压缩——避免超过邮箱附件限制批量发送加间隔——防止被判定为垃圾邮件

相关新闻

影刀RPA 进程与窗口管理:系统级操作

影刀RPA 进程与窗口管理:系统级操作

影刀RPA 进程与窗口管理:系统级操作 作者:林焱 写RPA流程时,经常需要和系统打交道:启动一个外部程序、关闭卡死的进程、切换到指定窗口、等待某个程序启动完成。这些操作超出了网页自动化的范围,需要用到Windows系统级…

2026/8/17 23:59:39 阅读更多 →
如何高效使用Zotero PDF翻译插件:学术研究的终极翻译解决方案

如何高效使用Zotero PDF翻译插件:学术研究的终极翻译解决方案

如何高效使用Zotero PDF翻译插件:学术研究的终极翻译解决方案 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_m…

2026/8/17 17:13:31 阅读更多 →
AI技术如何变革教材编写:降查重与提效实战

AI技术如何变革教材编写:降查重与提效实战

1. 教材编写行业的痛点与变革契机教材编写这个行当,干了十几年的人都知道有多折磨人。传统编写流程就像在走钢丝:既要保证内容权威性,又要控制查重率;既要符合教学大纲,又要体现创新性。我见过太多团队花半年时间写出来…

2026/8/17 7:21:25 阅读更多 →

最新新闻

智能体决策可重构性实践:基于锚点实现跨SDK决策追溯

智能体决策可重构性实践:基于锚点实现跨SDK决策追溯

1. 项目缘起:从“黑盒”到“白盒”的决策追溯困境在智能体(Agent)开发领域,尤其是当我们深度集成来自不同供应商的SDK来构建复杂决策系统时,一个长期困扰开发者和算法工程师的痛点日益凸显:我们常常无法清晰…

2026/8/18 6:55:17 阅读更多 →
Git全流程开发指南:从配置到协作最佳实践

Git全流程开发指南:从配置到协作最佳实践

1. Git贡献全流程概述作为一个分布式版本控制系统,Git已经成为现代软件开发中不可或缺的工具。无论是个人项目还是团队协作,掌握完整的Git贡献流程都是程序员必备的核心技能。这套流程不仅仅是一系列命令的堆砌,更是一种高效协作的方法论。在…

2026/8/18 6:55:17 阅读更多 →
STM32串口中断接收:从轮询到中断的实战指南与避坑技巧

STM32串口中断接收:从轮询到中断的实战指南与避坑技巧

1. 从“轮询”到“中断”:为什么串口通信必须迈出这一步如果你刚开始接触STM32的串口通信,大概率是从HAL库的HAL_UART_Transmit和HAL_UART_Receive这两个函数入门的。它们简单直接:调用Transmit,程序就卡在那里,直到所…

2026/8/18 6:55:17 阅读更多 →
智能体原生组织设计:构建流体协作与刚性记录的分层框架

智能体原生组织设计:构建流体协作与刚性记录的分层框架

1. 从“流体”与“刚性”的悖论谈起:为什么传统组织设计在智能体时代失灵了最近和几位在搞AI Agent创业的朋友聊天,大家普遍被一个看似矛盾的问题困扰:一方面,我们构建的Agent组织需要像流体一样灵活,能根据任务流实时…

2026/8/18 6:55:17 阅读更多 →
混合Max与Sum类型Agent的防策略设施选址与委员会选举机制设计

混合Max与Sum类型Agent的防策略设施选址与委员会选举机制设计

1. 问题背景:当“公平选址”遇上“委员会选举”在算法机制设计这个领域里,有两个看似不同但底层逻辑相通的核心问题:设施选址和委员会选举。乍一听,一个像是城市规划部门要考虑的“把医院建在哪里能让居民看病最方便”&#xff0c…

2026/8/18 6:55:17 阅读更多 →
Python自动化金融信息监控:构建英格兰银行公告抓取机器人

Python自动化金融信息监控:构建英格兰银行公告抓取机器人

1. 项目概述:什么是Python BOE Bot?如果你在金融、交易或者数据分析圈子里混过一阵子,大概率听说过“BOE”这个词。它不是什么新潮的缩写,而是指“Bank of England”,也就是英格兰银行。对于全球金融市场,尤…

2026/8/18 6:54:17 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →