如何使用 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应用、容器环境、电商独立站等
立即前往
扫码进入
扫描二维码购买
文澜千文

文澜千文

请登录以使用此功能。

江中猴姑原味苏打养胃猴头菇饼干40g 营养早餐全家分享健康零食 江中猴姑原味苏打养胃猴头菇饼干40g 营养早餐全家分享健康零食
Loading...