如何使用 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
English (US)
Español (ES)
Português (PT)
Français (CA)
Español (MX)
Español (VE)
Español (CO)
Español (AR)
Português (BR)
Quechua (PE)
Guaraní (PY)
简体中文 (ZH)
繁體中文 (HK)
日本語 (JP)
한국어 (KR)
हिन्दी (HI)
Pilipino (PH)
ไทย (TH)
Tiếng Việt (VN)
Bahasa Melayu (MY)
Bahasa Indonesia (ID)
বাংলা (BD)
اردو (PK)
සිංහල (LK)
ភាសាខ្មែរ (KH)
English (UK)
Français (FR)
Deutsch (DE)
Italiano (IT)
Русский (RU)
Nederlands (NL)
Türkçe (TR)
Polski (PL)
Svenska (SE)
Norsk (NO)
Dansk (DK)
Suomi (FI)
Ελληνικά (GR)
Čeština (CZ)
Magyar (HU)
Română (RO)
Български (BG)
Српски (RS)
Українська (UA)


