影刀RPA 邮件自动化入门:SMTP收发邮件与附件处理完全指南
影刀RPA 邮件自动化入门:SMTP收发邮件与附件处理完全指南
每天手动发几十封邮件、从邮箱里扒附件、盯着收件箱等某封邮件——这些是自动化最该接手的活。
影刀对邮件自动化的支持分两个层面:一是内置的邮件相关动作(简单场景够用),二是Python节点的 smtplib 和 imaplib 库(复杂场景绕不开)。
这篇文章把两种方式都讲透,从发一封简单邮件到批量下载附件,一步到位。
什么情况用邮件自动化
和手动操作相比,自动化的优势在三个场景特别明显:
定时发送报表。 每天早上9点,把昨天的销售数据汇总成Excel,自动发给老板。人可以做,但人会忘、会请假、会有起床气。自动化的不会。
批量下载附件。 供应商每天发来几十封带附件的对账单,一个个下载、解压、汇总。手工做半小时,自动化3分钟。
监控收件箱触发流程。 收到客户的订单邮件 → 自动解析内容 → 写入ERP → 回复确认邮件。整条链路无人值守。
批量发送个性化邮件。 给100个客户发不同的报价单,每人一个专用附件。手工发你一天都干不完,自动化10分钟。
方式一:影刀内置邮件动作(简单场景)
影刀在"网络"分类下提供了一套邮件动作,核心就三个:
- 【发送邮件】:通过SMTP发邮件,支持正文、附件、抄送
- 【读取邮件】:通过IMAP读取收件箱,支持筛选条件
- 【下载附件】:把邮件里的附件保存到本地
发送一封邮件
入门操作:
-
拖入**【发送邮件】**动作
-
配置SMTP服务器信息:
- 发件服务器:
smtp.qq.com(QQ邮箱)/smtp.163.com(163邮箱)/smtp.gmail.com(Gmail) - 端口:QQ邮箱用465(SSL),163用465,Gmail用587
- 发件邮箱地址和密码(注意:不是邮箱登录密码,是SMTP授权码)

- 发件服务器:
-
填写收件人、主题、正文
-
如果有附件,在附件栏添加文件路径
配置大概长这样:
SMTP服务器:smtp.qq.com
端口:465
SSL:是
发件邮箱:dauuhuang@qq.com
授权码:xxxxxxxxxxxxxx(从QQ邮箱设置里获取)
收件人:boss@company.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的授权码可以自定义(比如设置成容易记的)。有效期默认长期,也可以在设置里调。
Gmail:Google账号 → 安全性 → 两步验证 → 应用专用密码。生成时选择"邮件"和你的设备,然后会得到一个16位密码。
关键提醒:授权码只显示一次,关了页面就看不到了。务必当场复制保存。截图也行,但那串字符截图丢了更麻烦。
读取邮件

**【读取邮件】**动作的配置:
IMAP服务器:imap.qq.com(QQ)/ imap.163.com(163)/ imap.gmail.com(Gmail)
端口: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节点发一封带表格的邮件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
# 构建邮件
msg = MIMEMultipart()
msg['From'] = 'dauuhuang@qq.com'
msg['To'] = 'boss@company.com'
msg['Subject'] = '【日报】2026-07-01 销售数据'
# HTML正文
html_body = """
<h2>昨日销售汇总</h2>
<p>销售额:<b style="color:red">¥35,280.00</b></p>
<table border="1" cellpadding="5">
<tr style="background:#eee">
<th>商品</th><th>销量</th><th>金额</th>
</tr>
<tr><td>商品A</td><td>120</td><td>¥12,000</td></tr>
<tr><td>商品B</td><td>85</td><td>¥23,280</td></tr>
</table>
<br><p>详情见附件。</p>

"""
msg.attach(MIMEText(html_body, 'html', 'utf-8'))
# 添加附件
filepath = r'C:\reports\daily_20260701.xlsx'
with open(filepath, 'rb') as f:
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(f.read())
encoders.encode_base64(attachment)
attachment.add_header(
'Content-Disposition',
f'attachment; filename="daily_20260701.xlsx"'
)
msg.attach(attachment)
# 发送
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
server.login('dauuhuang@qq.com', '你的授权码')
server.send_message(msg)
server.quit()
print("邮件发送成功")
这段代码的核心价值在于 html_body——你可以嵌任何HTML,表格、图片链接、彩色文字、加粗强调,全都可以。发给老板的报表看起来专业得多。
批量个性化发送
给不同客户发不同内容、不同附件。把客户列表放在一个Excel里:
| 客户名 | 邮箱 | 报价单路径 | 备注 |
|---|---|---|---|
| A公司 | a@a.com | A报价.xlsx | 已签约老客户 |
| B公司 | b@b.com | B报价.xlsx | 新客户 |
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import openpyxl
# 读取客户列表(假设Excel已通过影刀读取到变量中)
# customers = 影刀传入的客户数据列表
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
server.login('dauuhuang@qq.com', '你的授权码')
for customer in customers:
name = customer['客户名']
email_addr = customer['邮箱']
filepath = customer['报价单路径']
remark = customer['备注']
msg = MIMEMultipart()
msg['From'] = 'dauuhuang@qq.com'
msg['To'] = email_addr
msg['Subject'] = f'{name} — 本月报价单'
body_text = f"""
<p>{name}的负责人,您好:</p>
<p>附件是本月的报价明细,请查收。</p>
<p>如有疑问,请回复本邮件。</p>
"""
# 老客户额外加一句
if '老客户' in remark:
body_text += '<p style="color:blue">感谢您一直以来的信任与支持!</p>'
msg.attach(MIMEText(body_text, 'html', 'utf-8'))
# 添加附件
with open(filepath, 'rb') as f:
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(f.read())
encoders.encode_base64(attachment)
attachment.add_header(
'Content-Disposition',
f'attachment; 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 可以直接操作原始邮件数据。
读取未读邮件并解析

import imaplib
import email
from email.header import decode_header
# 连接IMAP服务器
mail = imaplib.IMAP4_SSL('imap.qq.com', 993)
mail.login('dauuhuang@qq.com', '你的授权码')
mail.select('INBOX')
# 搜索未读邮件
status, message_ids = mail.search(None, 'UNSEEN')
id_list = message_ids[0].split()
results = []
for msg_id in id_list[-10:]: # 只读最近10封
status, msg_data = mail.fetch(msg_id, '(RFC822)')
raw_email = msg_data[0][1]
msg = email.message_from_bytes(raw_email)
# 解码主题
subject, encoding = decode_header(msg['Subject'])[0]
if isinstance(subject, bytes):
subject = subject.decode(encoding or 'utf-8', errors='ignore')
# 解码发件人
from_str = msg['From']
# 提取正文
body = ''
if msg.is_multipart():
for part in msg.walk():
content_type = part.get_content_type()
if content_type == 'text/plain' or content_type == 'text/html':
payload = part.get_payload(decode=True)
if payload:
body += payload.decode('utf-8', errors='ignore')
else:
payload = msg.get_payload(decode=True)
if payload:
body = payload.decode('utf-8', errors='ignore')
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)')
下载附件并自动重命名
import imaplib
import email
import os
mail = imaplib.IMAP4_SSL('imap.qq.com', 993)
mail.login('dauuhuang@qq.com', '你的授权码')
mail.select('INBOX')
save_dir = r'C:\downloads\attachments'
os.makedirs(save_dir, exist_ok=True)
# 读取最近50封邮件的附件
status, ids = mail.search(None, 'ALL')
for msg_id in ids[0].split()[-50:]:
status, msg_data = mail.fetch(msg_id, '(RFC822)')
msg = email.message_from_bytes(msg_data[0][1])
# 获取发件人和日期用于重命名
from_name = msg['From'].split('@')[0].replace('<', '').replace('>', '').strip()
date_str = msg['Date'][:10].replace(' ', '-')
for part in msg.walk():
if part.get_content_disposition() == 'attachment':
filename = part.get_filename()
if filename:
# 解码文件名
decoded_name = email.header.decode_header(filename)[0][0]
if isinstance(decoded_name, bytes):
filename = decoded_name.decode('utf-8', errors='ignore')
else:
filename = decoded_name
# 加前缀防重名
save_name = f'{date_str}_{from_name}_{filename}'
save_path = os.path.join(save_dir, save_name)
with open(save_path, 'wb') as f:
f.write(part.get_payload(decode=True))
print(f'已下载:{save_name}')
mail.logout()
重命名的逻辑很有用——如果所有附件都叫"报价单.xlsx",下载到同一个文件夹里后下载的会覆盖前面的。加上日期和发件人前缀后就不会了。
容易踩的四个坑

坑1:授权码和登录密码搞混
temu店群自动化报活动案例
这是新手翻车第一现场。SMTP/IMAP登录用的不是邮箱登录密码,是授权码。
很多人在QQ邮箱设置里折腾半天,把邮箱密码填进去,结果一直报"认证失败"。原因就是这个。
另外,QQ邮箱和163邮箱的SMTP/IMAP服务默认是关闭的,需要先去设置里手动开启。如果开都还没开,连授权码都获取不到。
坑2:Gmail需要开启"低安全性应用"或使用应用专用密码
Gmail的安全策略比较严格。如果你用的是普通Gmail账号,需要在Google账户设置里开启"两步验证",然后生成"应用专用密码"给SMTP/IMAP使用。
如果用的是企业Gmail(Google Workspace),可能还需要管理员在后台开启SMTP/IMAP访问权限。
坑3:大附件发送超时

SMTP发邮件默认没有超时控制,但大附件(20MB以上)可能导致连接被邮件服务器掐断。
解决方案:如果附件超过10MB,压缩一下再发,或者上传到云盘在邮件正文里放下载链接。别硬传,硬传必翻。
import zipfile
# 压缩大文件
def compress_file(src_path, zip_path):
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:
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,读完邮件要标记已读。这三条记住了,邮件自动化就不会有大坑。
作者:林焱
更多推荐

所有评论(0)