feat: .devops/TileOPs-Metax PR自动验收.yml
批量发送个性化邮件工具。从 Excel 或 CSV 读取收件人信息,为每位收件人单独生成邮件;支持发件人配置、变量替换、HTML 正文、附件、演练预览、发送日志和断点续发。
如果以演练模式运行,不会连接 SMTP 服务器发送真实邮件。
.xlsx
.xlsm
{{姓名}}
{{公司}}
.eml
需要 Python 3.9 或更高版本。Excel 读取依赖 openpyxl;图形界面使用 Python 自带的 Tkinter。
openpyxl
pip install -r requirements.txt
Windows PowerShell 可使用:
Windows 下可双击 start_gui.vbs;需要看到命令行输出时运行:
start_gui.vbs
python bulk_invite_mailer.py --gui
macOS 下首次使用时,在项目目录执行:
chmod +x start_gui.command
之后可双击 start_gui.command 启动。
start_gui.command
不带命令行参数直接运行 python bulk_invite_mailer.py 也会打开图形界面。
python bulk_invite_mailer.py
开始前会显示发送模式、发件人、收件人数、标题模板和首封邮件标题的确认窗口。可在界面中生成当前收件人的 HTML 与 .eml 预览,或在任务结束后直接打开日志和输出目录。
首行必须是列名。邮箱列会从以下名称中自动识别:邮箱、电子邮箱、邮件、收件邮箱、邮箱地址、email、e-mail、mail。姓名列也会自动识别 姓名、名字、收件人、客户姓名、嘉宾姓名 和 name。
邮箱
电子邮箱
邮件
收件邮箱
邮箱地址
email
e-mail
mail
姓名
名字
收件人
客户姓名
嘉宾姓名
name
姓名,邮箱,公司,场次 张三,zhangsan@example.com,示例公司,上海场 李四,lisi@example.com,示例公司,北京场
正文、标题和附件路径都能引用任意列:
{{姓名}},您好: 诚邀您参加 {{公司}} 的 {{场次}} 活动。
附件支持多个路径,以英文分号分隔:
attachments/{{姓名}}.pdf;attachments/活动说明.pdf
附件路径不存在时,当前收件人会暂停等待处理,不会静默跳过。
勾选“附加个性化邀请函”,选择 JSON 配置文件后,程序会在开始任务前为每位收件人生成邀请函,并作为普通附件附加到邮件。生成过程在连接 SMTP 前完成;姓名、字体、底图或像素尺寸不符合配置时,任务不会开始发送。
配置文件可放在收件人表格同目录。当前示例位于 app_data/recipients/06-发邀请函/邀请函配置.json:
app_data/recipients/06-发邀请函/邀请函配置.json
{ "template_image": "邀请函底图.jpg", "expected_image_size": [2568, 5511], "output": { "format": "pdf", "file_name_template": "{{真实姓名}}邀请函" }, "layers": [ { "text_template": "{{真实姓名}}", "position": { "x": 510, "y": 3030 }, "anchor": "mm", "max_width": 450, "font": { "path": "%WINDIR%/Fonts/msyh.ttc", "size": 92, "min_size": 48 }, "color": "#382066" } ] }
position 使用底图原始像素坐标;anchor: "mm" 表示文字中心对准坐标。max_width 限制文字宽度,姓名过长时会在 size 和 min_size 之间自动缩小。每次任务会在输出目录生成 invitations/ 和所用的 invitation_config.json 副本。
position
anchor: "mm"
max_width
size
min_size
invitations/
invitation_config.json
发件人配置保存在 app_data/config/senders.csv,包含 SMTP 地址、端口、安全方式、发件人信息和授权码或密码。授权凭据以明文保存在本机,请妥善保护该目录。
app_data/config/senders.csv
界面设置保存在 app_data/config/mailer_config.json。默认运行数据目录如下:
app_data/config/mailer_config.json
app_data/ config/ mailer_config.json senders.csv recipients/ previews/ current_email_preview.html current_email_preview.eml outputs/ 20260723_100000/ send_log.csv send_status.csv previews/
app_data/ 已被 Git 忽略。不要强制加入、压缩或上传其中的配置、收件人表格、预览和日志。
app_data/
PREVIEWED
DONE
SKIPPED_DUPLICATE
--output-dir
send_log.csv
send_status.csv
previews/
日志记录收件人邮箱和发送状态,输出目录同样属于敏感数据。
列出已保存的发件人配置:
python3 bulk_invite_mailer.py --list-senders
保存发件人配置。推荐从环境变量读取授权码,避免把密码写入终端历史:
export SMTP_PASSWORD='授权码' python3 bulk_invite_mailer.py \ --smtp-host smtp.example.com \ --smtp-port 465 \ --security ssl \ --sender sender@example.com \ --sender-name '活动组' \ --password-env SMTP_PASSWORD \ --save-sender-profile '默认发件人'
演练模式(默认,不会发送):
python3 bulk_invite_mailer.py \ --excel recipients.xlsx \ --sender-profile '默认发件人' \ --subject '{{姓名}},活动邀请' \ --body-file invite.html \ --html
真实发送:
python3 bulk_invite_mailer.py \ --excel recipients.xlsx \ --sender-profile '默认发件人' \ --subject '{{姓名}},活动邀请' \ --body-file invite.html \ --html \ --attachments 'attachments/{{姓名}}.pdf' \ --send
常用参数:
--sheet
--name-column
--email-column
--data-dir
./app_data
--senders-csv
--password-env
SMTP_PASSWORD
--delay
1.0
--auto-retry-seconds
180
--send
查看全部参数:
python3 bulk_invite_mailer.py --help
python3 -m unittest tests_mailer.py
本地批量定制邀请函邮件工具。它读取 Excel/CSV 中的姓名列和邮箱列,一封一封发送邮件,每封邮件只有一个收件人;支持 `{{姓名}}`、`{{公司}}` 等占位符生成定制正文和附件路径。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
Bulk Invitation Mailer
批量发送个性化邮件工具。从 Excel 或 CSV 读取收件人信息,为每位收件人单独生成邮件;支持发件人配置、变量替换、HTML 正文、附件、演练预览、发送日志和断点续发。
如果以演练模式运行,不会连接 SMTP 服务器发送真实邮件。
功能
.xlsx、.xlsm和 UTF-8 CSV 收件人文件。{{姓名}}、{{公司}}。.eml预览文件,不发送邮件。环境与安装
需要 Python 3.9 或更高版本。Excel 读取依赖
openpyxl;图形界面使用 Python 自带的 Tkinter。Windows PowerShell 可使用:
启动图形界面
Windows 下可双击
start_gui.vbs;需要看到命令行输出时运行:macOS 下首次使用时,在项目目录执行:
之后可双击
start_gui.command启动。不带命令行参数直接运行
python bulk_invite_mailer.py也会打开图形界面。图形界面使用流程
开始前会显示发送模式、发件人、收件人数、标题模板和首封邮件标题的确认窗口。可在界面中生成当前收件人的 HTML 与
.eml预览,或在任务结束后直接打开日志和输出目录。收件人表格
首行必须是列名。邮箱列会从以下名称中自动识别:
邮箱、电子邮箱、邮件、收件邮箱、邮箱地址、email、e-mail、mail。姓名列也会自动识别姓名、名字、收件人、客户姓名、嘉宾姓名和name。正文、标题和附件路径都能引用任意列:
附件支持多个路径,以英文分号分隔:
附件路径不存在时,当前收件人会暂停等待处理,不会静默跳过。
个性化邀请函附件
勾选“附加个性化邀请函”,选择 JSON 配置文件后,程序会在开始任务前为每位收件人生成邀请函,并作为普通附件附加到邮件。生成过程在连接 SMTP 前完成;姓名、字体、底图或像素尺寸不符合配置时,任务不会开始发送。
配置文件可放在收件人表格同目录。当前示例位于
app_data/recipients/06-发邀请函/邀请函配置.json:position使用底图原始像素坐标;anchor: "mm"表示文字中心对准坐标。max_width限制文字宽度,姓名过长时会在size和min_size之间自动缩小。每次任务会在输出目录生成invitations/和所用的invitation_config.json副本。发件人配置与隐私
发件人配置保存在
app_data/config/senders.csv,包含 SMTP 地址、端口、安全方式、发件人信息和授权码或密码。授权凭据以明文保存在本机,请妥善保护该目录。界面设置保存在
app_data/config/mailer_config.json。默认运行数据目录如下:app_data/已被 Git 忽略。不要强制加入、压缩或上传其中的配置、收件人表格、预览和日志。发送行为与日志
.eml文件,状态记为PREVIEWED。DONE。SKIPPED_DUPLICATE。--output-dir指定该目录以继续未完成任务。send_log.csv与send_status.csv;演练模式还会在previews/生成邮件文件。日志记录收件人邮箱和发送状态,输出目录同样属于敏感数据。
命令行
列出已保存的发件人配置:
保存发件人配置。推荐从环境变量读取授权码,避免把密码写入终端历史:
演练模式(默认,不会发送):
真实发送:
常用参数:
--sheet--name-column、--email-column--data-dir./app_data。--senders-csv--password-envSMTP_PASSWORD。--output-dir--delay1.0。--auto-retry-seconds180。--send查看全部参数:
测试