批处理脚本传递日志文件名至邮件模板及多收件人配置问题
批处理脚本邮件通知问题解决方案
问题1:传递日志文件名到邮件模板
核心思路是在邮件模板中设置占位符,通过批处理动态替换占位符生成最终邮件内容,再调用sendmail.exe发送。
步骤:
- 创建带占位符的邮件模板(命名为
email_template.txt):
From: batch-job-notify@yourcompany.com To: it-admin@yourcompany.com Subject: 作业执行状态:{{STATUS}} Content-Type: text/plain; charset=utf-8 作业已完成,状态:*{{STATUS}}* 详细日志文件:{{LOG_FILE}}
- 批处理中实现占位符替换:
用PowerShell完成替换(比批处理原生替换更稳定,支持特殊路径字符),示例代码:
@echo off setlocal enabledelayedexpansion :: 生成日志文件名(按你的规则) set "LOG_DIR=C:\Temp\Logs" for /f "tokens=1-6 delims=/: " %%a in ("%date% %time%") do ( set "LOG_FILE=outputFile_%%a_%%b%%c%%d_%%e%%f%%~g.csv" ) set "LOG_FULL_PATH=!LOG_DIR!\!LOG_FILE!" :: 模拟作业执行结果 set "JOB_STATUS=成功" :: 作业失败时改为"失败" :: 生成临时邮件内容 set "TEMP_MAIL=%TEMP%\temp_mail_content.txt" powershell -Command "(Get-Content 'email_template.txt') -replace '{{STATUS}}','!JOB_STATUS!' -replace '{{LOG_FILE}}','!LOG_FULL_PATH!' | Out-File '!TEMP_MAIL!' -Encoding UTF8" :: 调用sendmail.exe发送邮件 sendmail.exe -t < "!TEMP_MAIL!" :: 清理临时文件 del "!TEMP_MAIL!" >nul 2>&1 endlocal
问题2:邮件模板配置多收件人出错
多数sendmail.exe版本支持在To:字段用逗号分隔多个收件人,只需调整模板格式即可,无需多模板文件。
解决方法:
- 直接在模板中写多收件人:
修改模板的To:行,格式如下(支持纯邮箱或带名称的格式):
To: admin1@yourcompany.com, 运维组 <it-support@yourcompany.com>, admin2@yourcompany.com
- 动态传递多收件人(可选):
如果需要在批处理中动态指定收件人,同样用占位符替换:
- 模板中
To:行改为:To: {{TO_RECIPIENTS}} - 批处理中添加:
set "TO_RECIPIENTS=admin1@yourcompany.com, it-support@yourcompany.com, admin2@yourcompany.com"
- 替换命令中增加对
{{TO_RECIPIENTS}}的替换:
powershell -Command "(Get-Content 'email_template.txt') -replace '{{TO_RECIPIENTS}}','!TO_RECIPIENTS!' -replace '{{STATUS}}','!JOB_STATUS!' -replace '{{LOG_FILE}}','!LOG_FULL_PATH!' | Out-File '!TEMP_MAIL!' -Encoding UTF8"
注意事项:
- 确保收件人格式符合邮件标准,逗号后可加空格(多数sendmail版本兼容)
- 若仍报错,检查
sendmail.exe的版本配置,部分轻量版本可能需要在命令行用多个参数,但优先用模板逗号分隔的方式
内容的提问来源于stack exchange,提问作者user27543998
相关产品推荐
相关产品推荐

