影刀RPA 邮件自动化入门:SMTP收发邮件与附件处理完全指南

📅 2026/7/25 9:03:34
影刀RPA 邮件自动化入门:SMTP收发邮件与附件处理完全指南
影刀RPA 邮件自动化入门SMTP收发邮件与附件处理完全指南每天手动发几十封邮件、从邮箱里扒附件、盯着收件箱等某封邮件——这些是自动化最该接手的活。影刀对邮件自动化的支持分两个层面一是内置的邮件相关动作简单场景够用二是Python节点的smtplib和imaplib库复杂场景绕不开。这篇文章把两种方式都讲透从发一封简单邮件到批量下载附件一步到位。什么情况用邮件自动化和手动操作相比自动化的优势在三个场景特别明显定时发送报表。每天早上9点把昨天的销售数据汇总成Excel自动发给老板。人可以做但人会忘、会请假、会有起床气。自动化的不会。批量下载附件。供应商每天发来几十封带附件的对账单一个个下载、解压、汇总。手工做半小时自动化3分钟。监控收件箱触发流程。收到客户的订单邮件 → 自动解析内容 → 写入ERP → 回复确认邮件。整条链路无人值守。批量发送个性化邮件。给100个客户发不同的报价单每人一个专用附件。手工发你一天都干不完自动化10分钟。方式一影刀内置邮件动作简单场景影刀在网络分类下提供了一套邮件动作核心就三个【发送邮件】通过SMTP发邮件支持正文、附件、抄送【读取邮件】通过IMAP读取收件箱支持筛选条件【下载附件】把邮件里的附件保存到本地发送一封邮件入门操作拖入**【发送邮件】**动作配置SMTP服务器信息发件服务器smtp.qq.comQQ邮箱/smtp.163.com163邮箱/smtp.gmail.comGmail端口QQ邮箱用465SSL163用465Gmail用587发件邮箱地址和密码注意不是邮箱登录密码是SMTP授权码填写收件人、主题、正文如果有附件在附件栏添加文件路径配置大概长这样SMTP服务器smtp.qq.com 端口465 SSL是 发件邮箱dauuhuangqq.com 授权码xxxxxxxxxxxxxx从QQ邮箱设置里获取 收件人bosscompany.com 主题【日报】2026-07-01 销售数据 正文老板好昨日销售额为 ¥35,280.00详见附件。 附件C:\reports\daily_20260701.xlsx获取SMTP授权码这是个新手必踩的坑。不同邮箱的授权码获取方式店群矩阵自动化突破运营极限QQ邮箱登录QQ邮箱 → 设置 → 账户 → POP3/IMAP/SMTP服务 → 开启 → 生成授权码。系统会弹出一个16位字符串复制下来。注意生成授权码时QQ邮箱会要求短信验证。163邮箱登录163邮箱 → 设置 → POP3/SMTP/IMAP → 开启 → 新增授权码。163的授权码可以自定义比如设置成容易记的。有效期默认长期也可以在设置里调。GmailGoogle账号 → 安全性 → 两步验证 → 应用专用密码。生成时选择邮件和你的设备然后会得到一个16位密码。关键提醒授权码只显示一次关了页面就看不到了。务必当场复制保存。截图也行但那串字符截图丢了更麻烦。读取邮件**【读取邮件】**动作的配置IMAP服务器imap.qq.comQQ/ imap.163.com163/ imap.gmail.comGmail 端口993 SSL是 邮箱地址你的邮箱 授权码同上 筛选条件未读 / 指定发件人 / 指定主题关键词 / 指定日期范围 返回结果邮件列表发件人、主题、时间、正文、附件列表返回的邮件列表是一个结构化数据每条邮件包含字段字段说明发件人发件邮箱地址主题邮件标题时间发送时间正文邮件文本内容附件列表附件文件名和下载链接邮件ID唯一标识符实际操作时要注意IMAP读取邮件默认只返回前20封。如果你的收件箱里囤了几千封未读需要配置读取数量或分页。下载附件**【下载附件】**动作需要嵌套在读取邮件之后流程 1. 【读取邮件】→ 得到邮件列表 mail_list 2. 【ForEach】遍历 mail_list 中的每封邮件 3. 【IF】该邮件的附件列表不为空 4. 【下载附件】 邮件ID 当前邮件的邮件ID 保存路径 C:\attachments\ 文件名 5. 【END IF】 6. 【END ForEach】内置动作的局限性影刀内置邮件动作确实方便但有几个硬伤不支持HTML格式邮件。只能发纯文本不能发带排版、图片、表格的富文本邮件。附件大小限制。大附件超过10MB容易超时没有断点续传。邮件筛选能力弱。只能按未读、发件人、主题关键词筛选不能按邮件正文内容或附件类型筛选。不能标记已读/移动邮件。读取完后邮件状态不变下次还会读到同一批。这些限制在简单场景下不影响使用。一旦你的需求稍微复杂一点就得切换到Python节点了。方式二Python节点发邮件进阶玩家Python的smtplib和email库是标准库影刀Python节点默认就支持不需要额外安装。它能做到影刀内置动作做不到的一切。发HTML邮件用Python节点发一封带表格的邮件importsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipartfromemail.mime.baseimportMIMEBasefromemailimportencoders# 构建邮件msgMIMEMultipart()msg[From]dauuhuangqq.commsg[To]bosscompany.commsg[Subject]【日报】2026-07-01 销售数据# HTML正文html_body h2昨日销售汇总/h2 p销售额b stylecolor:red¥35,280.00/b/p table border1 cellpadding5 tr stylebackground:#eee th商品/thth销量/thth金额/th /tr trtd商品A/tdtd120/tdtd¥12,000/td/tr trtd商品B/tdtd85/tdtd¥23,280/td/tr /table brp详情见附件。/p ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6b8235cbfda44506800dec9027a5a1c0.png#pic_center) msg.attach(MIMEText(html_body,html,utf-8))# 添加附件filepathrC:\reports\daily_20260701.xlsxwithopen(filepath,rb)asf:attachmentMIMEBase(application,octet-stream)attachment.set_payload(f.read())encoders.encode_base64(attachment)attachment.add_header(Content-Disposition,fattachment; filenamedaily_20260701.xlsx)msg.attach(attachment)# 发送serversmtplib.SMTP_SSL(smtp.qq.com,465)server.login(dauuhuangqq.com,你的授权码)server.send_message(msg)server.quit()print(邮件发送成功)这段代码的核心价值在于html_body——你可以嵌任何HTML表格、图片链接、彩色文字、加粗强调全都可以。发给老板的报表看起来专业得多。批量个性化发送给不同客户发不同内容、不同附件。把客户列表放在一个Excel里客户名邮箱报价单路径备注A公司aa.comA报价.xlsx已签约老客户B公司bb.comB报价.xlsx新客户importsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipartfromemail.mime.baseimportMIMEBasefromemailimportencodersimportopenpyxl# 读取客户列表假设Excel已通过影刀读取到变量中# customers 影刀传入的客户数据列表serversmtplib.SMTP_SSL(smtp.qq.com,465)server.login(dauuhuangqq.com,你的授权码)forcustomerincustomers:namecustomer[客户名]email_addrcustomer[邮箱]filepathcustomer[报价单路径]remarkcustomer[备注]msgMIMEMultipart()msg[From]dauuhuangqq.commsg[To]email_addr msg[Subject]f{name}— 本月报价单body_textf p{name}的负责人您好/p p附件是本月的报价明细请查收。/p p如有疑问请回复本邮件。/p # 老客户额外加一句if老客户inremark:body_textp stylecolor:blue感谢您一直以来的信任与支持/pmsg.attach(MIMEText(body_text,html,utf-8))# 添加附件withopen(filepath,rb)asf:attachmentMIMEBase(application,octet-stream)attachment.set_payload(f.read())encoders.encode_base64(attachment)attachment.add_header(Content-Disposition,fattachment; filename{filepath.split(chr(92))[-1]})msg.attach(attachment)server.send_message(msg)print(f已发送给{name}({email_addr}))server.quit()print(全部发送完成)关键点SMTP连接只建立一次循环里复用同一个连接。如果每次都smtplib.SMTP_SSL()然后quit()100个客户就要建立100次连接大部分时间浪费在TCP握手上了。方式三Python节点读邮件IMAP影刀内置的**【读取邮件】**在内容解析上能力有限特别是处理复杂邮件格式时。Python的imaplib可以直接操作原始邮件数据。读取未读邮件并解析importimaplibimportemailfromemail.headerimportdecode_header# 连接IMAP服务器mailimaplib.IMAP4_SSL(imap.qq.com,993)mail.login(dauuhuangqq.com,你的授权码)mail.select(INBOX)# 搜索未读邮件status,message_idsmail.search(None,UNSEEN)id_listmessage_ids[0].split()results[]formsg_idinid_list[-10:]:# 只读最近10封status,msg_datamail.fetch(msg_id,(RFC822))raw_emailmsg_data[0][1]msgemail.message_from_bytes(raw_email)# 解码主题subject,encodingdecode_header(msg[Subject])[0]ifisinstance(subject,bytes):subjectsubject.decode(encodingorutf-8,errorsignore)# 解码发件人from_strmsg[From]# 提取正文bodyifmsg.is_multipart():forpartinmsg.walk():content_typepart.get_content_type()ifcontent_typetext/plainorcontent_typetext/html:payloadpart.get_payload(decodeTrue)ifpayload:bodypayload.decode(utf-8,errorsignore)else:payloadmsg.get_payload(decodeTrue)ifpayload:bodypayload.decode(utf-8,errorsignore)results.append({id:msg_id.decode(),subject:subject,from:from_str,body:body[:200]# 只取前200字符做摘要})mail.logout()# 将 results 传回影刀变量按发件人主题日期组合筛选IMAP的搜索语法非常强大比影刀内置动作灵活得多# 搜索发件人包含供应商且主题包含对账单mail.search(None,FROM,供应商,SUBJECT,对账单)# 搜索最近7天的邮件mail.search(None,SINCE,24-Jun-2026)# 搜索带附件的邮件mail.search(None,HAS,attachment)# 组合搜索最近7天 发件人是供应商 有附件mail.search(None,(SINCE 24-Jun-2026 FROM 供应商 HAS attachment))下载附件并自动重命名importimaplibimportemailimportos mailimaplib.IMAP4_SSL(imap.qq.com,993)mail.login(dauuhuangqq.com,你的授权码)mail.select(INBOX)save_dirrC:\downloads\attachmentsos.makedirs(save_dir,exist_okTrue)# 读取最近50封邮件的附件status,idsmail.search(None,ALL)formsg_idinids[0].split()[-50:]:status,msg_datamail.fetch(msg_id,(RFC822))msgemail.message_from_bytes(msg_data[0][1])# 获取发件人和日期用于重命名from_namemsg[From].split()[0].replace(,).replace(,).strip()date_strmsg[Date][:10].replace( ,-)forpartinmsg.walk():ifpart.get_content_disposition()attachment:filenamepart.get_filename()iffilename:# 解码文件名decoded_nameemail.header.decode_header(filename)[0][0]ifisinstance(decoded_name,bytes):filenamedecoded_name.decode(utf-8,errorsignore)else:filenamedecoded_name# 加前缀防重名save_namef{date_str}_{from_name}_{filename}save_pathos.path.join(save_dir,save_name)withopen(save_path,wb)asf:f.write(part.get_payload(decodeTrue))print(f已下载{save_name})mail.logout()重命名的逻辑很有用——如果所有附件都叫报价单.xlsx下载到同一个文件夹里后下载的会覆盖前面的。加上日期和发件人前缀后就不会了。容易踩的四个坑坑1授权码和登录密码搞混temu店群自动化报活动案例这是新手翻车第一现场。SMTP/IMAP登录用的不是邮箱登录密码是授权码。很多人在QQ邮箱设置里折腾半天把邮箱密码填进去结果一直报认证失败。原因就是这个。另外QQ邮箱和163邮箱的SMTP/IMAP服务默认是关闭的需要先去设置里手动开启。如果开都还没开连授权码都获取不到。坑2Gmail需要开启低安全性应用或使用应用专用密码Gmail的安全策略比较严格。如果你用的是普通Gmail账号需要在Google账户设置里开启两步验证然后生成应用专用密码给SMTP/IMAP使用。如果用的是企业GmailGoogle Workspace可能还需要管理员在后台开启SMTP/IMAP访问权限。坑3大附件发送超时SMTP发邮件默认没有超时控制但大附件20MB以上可能导致连接被邮件服务器掐断。解决方案如果附件超过10MB压缩一下再发或者上传到云盘在邮件正文里放下载链接。别硬传硬传必翻。importzipfile# 压缩大文件defcompress_file(src_path,zip_path):withzipfile.ZipFile(zip_path,w,zipfile.ZIP_DEFLATED)aszf:zf.write(src_path,os.path.basename(src_path))坑4读取邮件后不标记已读如果不标记已读下次读又是同一批邮件处理过的数据会重复。# 处理完后标记已读mail.store(msg_id,FLAGS,\\Seen)或者更安全的做法——读完后移动到已处理文件夹原收件箱保持干净# 先创建归档文件夹如果不存在mail.create(已处理)# 移动邮件mail.copy(msg_id,已处理)mail.store(msg_id,FLAGS,\\Deleted)mail.expunge()选型指南场景推荐方式理由发纯文本日报影刀内置动作配置即用不用写代码发带表格/图片的报表Python节点内置不支持HTML格式批量发个性化邮件Python节点循环模板组合灵活下载20MB以下附件两者都可看个人熟悉程度按复杂条件筛选邮件Python节点(IMAP)内置筛选太弱处理邮件→触发后续流程Python节点需要解析正文/提取关键信息新手建议先从内置动作入手碰到内置动作搞不定的场景再切Python。不用一步到位追求最优雅的方案能跑通再优化。核心就三条授权码不是登录密码HTML邮件得靠Python读完邮件要标记已读。这三条记住了邮件自动化就不会有大坑。作者林焱