如何使用 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. 第 1 行可设表头(如「序号、姓名、邮箱、附件路径」),脚本从第 2 行读取数据;
  2. 第 3 列必须填写收件人邮箱(必填,格式如zhangsan@company.com);
  3. 第 4 列填写附件完整绝对路径(选填,格式如C:\Users\XXX\Desktop\张三-奖金明细.pdf);
  4. 支持.xlsx.xls格式文件。
邮箱附件地址
lee@8i5.netC:\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
请先登录才能参与答题
距本场结束剩 00 00 00 00
轻量应用服务器 2核2G
200M峰值带宽,适用于网站搭建、Web应用、容器环境、电商独立站等
立即前往
扫码进入
扫描二维码购买
文澜千文

文澜千文

请登录以使用此功能。

思朗纤麸 木糖醇粗粮消化饼干1020g早餐饼干代餐零食礼盒  代餐饱腹 思朗纤麸 木糖醇粗粮消化饼干1020g早餐饼干代餐零食礼盒 代餐饱腹
Loading...
OpenClaw

OpenClaw 龙虾

AI AGENT GATEWAY
在您的服务器部署 OpenClaw,打造专属极速 AI 助手。
零门槛一键部署环境
支持 QQ/飞书/微信 渠道
跨平台指令分发执行
立即安装