如何用Blat与批处理脚本按组读取XML邮件地址并发送邮件?
当然可行!用批处理脚本配合Blat完全能实现按组筛选XML里的邮箱并发送邮件的需求,下面我一步步给你拆解实现方法:
1. 先确定你的XML结构参考
首先得有一个清晰的XML结构,这样批处理才能准确提取指定组的邮箱。给你一个示例结构,你可以对齐调整自己的文件:
<emailGroups> <group id="IT"> <email>it_user1@example.com</email> <email>it_user2@example.com</email> </group> <group id="ADMIN"> <email>admin_user@example.com</email> </group> <group id="OTHER"> <email>other_user@example.com</email> <email>another_user@example.com</email> </group> </emailGroups>
要是你的XML结构和这个差异较大,可能需要微调后面的解析逻辑哦。
2. 核心批处理脚本实现
下面是完整的批处理脚本,我加了详细注释,你只需要根据自己的实际情况修改配置参数即可:
@echo off setlocal enabledelayedexpansion :: -------------------------- 配置参数(请根据实际修改) -------------------------- set "XML_FILE=email_groups.xml" :: 你的XML文件路径(相对或绝对路径都可以) set "TARGET_GROUP=IT" :: 要发送邮件的目标组ID(比如IT、ADMIN) set "BLAT_PATH=blat.exe" :: Blat程序的路径,如果已加入系统环境变量,直接写blat就行 set "SMTP_SERVER=smtp.example.com" :: 你的SMTP服务器地址(比如smtp.qq.com、smtp.gmail.com) set "FROM_EMAIL=sender@example.com" :: 发件人邮箱地址 set "EMAIL_SUBJECT=【组通知】测试邮件" :: 邮件主题 set "EMAIL_BODY=这是发送给%TARGET_GROUP%组的测试邮件,请注意查收!" :: 邮件正文 :: ----------------------------------------------------------------------------- :: 提取目标组下的所有邮箱地址 echo 正在提取%TARGET_GROUP%组的邮箱列表... for /f "tokens=2 delims=<>" %%a in ('findstr /C:"<group id=\"%TARGET_GROUP%\"" /C:"<email>" %XML_FILE% ^| findstr /V "<group"') do ( set "RECIPIENT=%%a" :: 调用Blat发送邮件给当前收件人 echo 正在发送邮件到!RECIPIENT!... "%BLAT_PATH%" -body "%EMAIL_BODY%" -subject "%EMAIL_SUBJECT%" -to "!RECIPIENT!" -server "%SMTP_SERVER%" -f "%FROM_EMAIL%" :: 如果SMTP需要认证,把下面这行注释去掉并填写账号密码 :: "%BLAT_PATH%" -body "%EMAIL_BODY%" -subject "%EMAIL_SUBJECT%" -to "!RECIPIENT!" -server "%SMTP_SERVER%" -f "%FROM_EMAIL%" -u "你的SMTP账号" -pw "你的SMTP密码" ) echo 所有邮件发送任务已完成! endlocal
3. Blat的关键配置说明
- 如果你的SMTP服务器需要身份验证(比如QQ、Gmail邮箱的SMTP),要取消脚本里认证行的注释,填写你的SMTP账号和密码
- 第一次使用Blat时,可以先执行
blat -install smtp.example.com sender@example.com配置默认的SMTP服务器和发件人,这样后续脚本里可以省略-server和-f参数 - 要是需要发送带附件的邮件,在Blat命令里加上
-attach "附件路径"即可
4. 注意事项
- 确保XML文件的标签格式和示例一致,比如
<email>标签不要有多余的空格,否则findstr可能提取不到正确的邮箱地址 - 邮件正文或主题里如果有特殊字符(比如&、<、>),一定要用双引号包裹,避免批处理报错
- 测试阶段可以把Blat命令改成
echo 准备发送到!RECIPIENT!,先确认提取的邮箱是否正确,再实际发送邮件
内容的提问来源于stack exchange,提问作者ashim
相关产品推荐
相关产品推荐

