如何使用 PowerShell 通过 Excel+Outlook 批量发送个性化邮件
AI摘要
由
Deepseek提供支持
在日常办公场景中(如 HR 发放奖金通知、财务推送对账文件、行政发送批量通知),经常需要向不同收件人发送带专属附件的个性化邮件。手动操作不仅效率低下,还容易出现漏发附件、称呼错误等问题。
重要:必须要保证Outlook处于登录状态!
脚本核心功能
- 直接连接本地已登录的 Outlook 客户端,无需配置 SMTP 账号密码,安全便捷;
- 读取 Excel 指定列数据(第 3 列邮箱、第 4 列附件路径),适配标准办公表格;
- 自动跳过空邮箱行,避免无效发送;
- 从邮箱前缀提取姓名并格式化(首字母大写),实现个性化邮件称呼;
- 智能判断附件路径有效性,仅在文件存在时添加附件;
- 每封邮件间隔 1 秒发送,降低风控风险与客户端卡顿概率;
- 完整进程释放机制,避免 Excel/Outlook 后台残留;
- 异常捕获功能,单个邮件发送失败不影响整批任务。
配置说明
脚本仅需修改以下 3 处配置,无需改动核心逻辑:
前提:安装Excel COM 组件
Install-Module -Name ImportExcel -Scope CurrentUser -Force -AllowClobber
1. Excel 文件路径
$excelPath = "test.xlsx"
2. 邮件主题
$mail.Subject = "XXXXXXXXX"
3. 邮件正文
$mail.HTMLBody = "Dear $showName,<br><br>邮件正文内容<br><br>落款"
Excel 表格格式要求
脚本固定读取 Excel 第一个工作表,表格需满足以下格式:
- 第 1 行可设表头(如「序号、姓名、邮箱、附件路径」),脚本从第 2 行读取数据;
- 第 3 列必须填写收件人邮箱(必填,格式如
zhangsan@company.com); - 第 4 列填写附件完整绝对路径(选填,格式如
C:\Users\XXX\Desktop\张三-奖金明细.pdf); - 支持
.xlsx与.xls格式文件。
| 邮箱 | 附件地址 |
| lee@8i5.net | C:\test.pdf |
复制完整脚本,粘贴到记事本,修改配置项后保存为.ps1后缀文件(如批量发邮件.ps1),编码选 UTF-8
然后保存文件,右键文件,以Powershell运行
Windows 默认的执行策略是 Restricted(受限模式),禁止运行任何 .ps1 脚本文件
解决办法:
在 PowerShell 里先复制粘贴运行这一行命令(临时解禁):
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
永久解禁 – 适合经常用脚本,一次设置终身生效
Set-ExecutionPolicy RemoteSigned -Force
完整代码
$excelPath = "" # Excel文件完整路径
# ======================================================================
# 初始化本地Outlook客户端(提前打开电脑上的Outlook即可)
$Outlook = New-Object -ComObject Outlook.Application
Write-Host "✅ 已连接本地Outlook,开始发送邮件..." -ForegroundColor Green
# 读取Excel,仅提取 第3列邮箱 / 第4列附件
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Open($excelPath)
$sheet = $workbook.Worksheets.Item(1)
$totalRows = $sheet.UsedRange.Rows.Count
# 循环发送每一封邮件
for ($i=2; $i -le $totalRows; $i++) {
# 读取单元格数据,忽略前2列
$toEmail = $sheet.Cells.Item($i, 3).Text.Trim()
$attachFile = $sheet.Cells.Item($i, 4).Text.Trim()
# 跳过空邮箱行
if ([string]::IsNullOrWhiteSpace($toEmail)) { continue }
try {
# 创建新邮件
$mail = $Outlook.CreateItem(0)
$mail.To = $toEmail
$mail.Subject = "邮件标题" # 邮件主题,可按需修改
$namePrefix = ($toEmail -split "@")[0] -split "\." | Select-Object -First 1
$showName = $namePrefix.Substring(0,1).ToUpper() + $namePrefix.Substring(1).ToLower()
$mail.HTMLBody = "Dear $showName,<br><br>这里可以填写邮件正文内容
"
# 添加附件(判断附件是否存在)
if (-not [string]::IsNullOrWhiteSpace($attachFile) -and (Test-Path $attachFile)) {
$mail.Attachments.Add($attachFile)
} elseif (-not [string]::IsNullOrWhiteSpace($attachFile)) {
throw "附件文件不存在:$attachFile"
}
# 发送邮件
$mail.Send()
Write-Host "✅ 发送成功 → $toEmail" -ForegroundColor Green
}
catch {
Write-Host "❌ 发送失败 → $toEmail | 错误原因:$($_.Exception.Message)" -ForegroundColor Red
}
Start-Sleep -Seconds 1
}
# 释放进程
$workbook.Close($false)
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Outlook) | Out-Null
[System.GC]::Collect()
Write-Host "`n📌 全部邮件发送完成!" -ForegroundColor Cyan
温馨提示 : 非特殊注明,否则均为©李联华的博客网原创文章,本站文章未经授权禁止任何形式转载;来自:俄亥俄州·哥伦布 ,欢迎您的访问!
文章链接:https://www.lilianhua.com/how-to-use-powershell-to-send-personalized-emails-in-bulk.html
文章链接:https://www.lilianhua.com/how-to-use-powershell-to-send-personalized-emails-in-bulk.html

