You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何发送带多附件的邮件且避免重复发送给同一收件人

按唯一ID生成带对应附件的邮件(VBA实现)

针对你的需求:表格A列是唯一ID(避免同一收件人重复收信),B列存收件人邮箱,D、E列是对应附件,需要生成与A列最大ID数一致的邮件,每封邮件包含对应ID下的所有附件,修改后的VBA代码如下:

Sub 按ID生成邮件()
    Dim ws As Worksheet
    Dim dict As Object
    Dim cell As Range
    Dim outlookApp As Object, mailItem As Object
    Dim id As String, email As String
    Dim attachmentsList As String
    Dim lastRow As Long
    
    ' 指定数据所在工作表
    Set ws = ThisWorkbook.Sheets("Base")
    ' 用字典按ID分组存储邮箱和附件
    Set dict = CreateObject("Scripting.Dictionary")
    ' 获取A列最后一行数据
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 遍历所有数据行,收集每个ID对应的邮箱和附件
    For Each cell In ws.Range("A2:A" & lastRow)
        id = cell.Value
        email = cell.Offset(0, 1).Value ' 取B列邮箱
        attachD = cell.Offset(0, 3).Value ' 取D列附件路径
        attachE = cell.Offset(0, 4).Value ' 取E列附件路径
        
        ' 首次遇到该ID时,初始化存储结构
        If Not dict.Exists(id) Then
            dict(id) = Array(email, "")
        End If
        
        ' 把D列非空附件加入列表
        If attachD <> "" Then
            dict(id)(1) = dict(id)(1) & attachD & ";"
        End If
        ' 把E列非空附件加入列表
        If attachE <> "" Then
            dict(id)(1) = dict(id)(1) & attachE & ";"
        End If
    Next cell
    
    ' 启动Outlook应用
    Set outlookApp = CreateObject("Outlook.Application")
    
    ' 遍历每个ID,生成对应邮件
    For Each id In dict.Keys
        Set mailItem = outlookApp.CreateItem(0)
        email = dict(id)(0)
        ' 去掉附件列表末尾多余的分号
        attachmentsList = Left(dict(id)(1), Len(dict(id)(1)) - 1)
        
        With mailItem
            .To = email
            .Subject = "ID:" & id & " 对应的附件" ' 可自定义邮件主题
            .Body = "这是ID " & id & " 的所有附件:" & vbCrLf & Replace(attachmentsList, ";", vbCrLf)
            ' 逐个添加附件,先检查文件是否存在
            For Each attachPath In Split(attachmentsList, ";")
                If Dir(attachPath) <> "" Then
                    .Attachments.Add attachPath
                End If
            Next attachPath
            .Display ' 显示邮件,要直接发送就改成.Send
        End With
    Next id
    
    ' 释放占用的对象
    Set mailItem = Nothing
    Set outlookApp = Nothing
    Set dict = Nothing
    Set ws = Nothing
    
    MsgBox "邮件生成完成!"
End Sub

代码关键说明

  • 用字典按A列ID分组,确保每个ID只生成一封邮件,彻底避免重复发送
  • 自动收集对应ID下D、E列的所有附件,空单元格会自动跳过
  • 添加附件前会检查文件路径是否有效,避免因文件不存在报错
  • 邮件正文会列出所有附件路径,清晰明了;主题和正文可根据需求自行修改

内容的提问来源于stack exchange,提问作者KHIZRANE Salim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:15:39