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

Outlook VBA疑问:为何Sender与ReceivedByName返回相同名称?

问题原因与解决方案

嘿,这个问题其实是Outlook对象模型里属性的适用场景搞混啦!我来给你掰扯清楚:

为什么原来的代码在已发送文件夹里不对?

你用的这两个属性,其实是为收件箱类场景设计的:

  • Sender/SenderName:在收件箱里,它就是给你发邮件的人(他人);但在已发送文件夹里,邮件是你发的,所以这个属性自然返回你自己,这完全是正常的属性行为。
  • ReceivedByName:这个属性的本质是记录邮件的本地接收者——对于收件箱里的邮件,接收者是你;但对于已发送文件夹里的邮件,这个“接收者”指的是你的邮箱接收到了这条发送记录,所以还是返回你自己,它根本不是用来记录你发送邮件时的目标收件人的!

正确的处理方式

要让宏同时适配收件箱和已发送文件夹,我们需要根据邮件所在的文件夹(或者邮件的发送场景)来选择对应的属性:

1. 区分文件夹场景的代码示例

For Each objItem In ActiveExplorer.Selection
    If objItem.MessageClass = "IPM.Note" Then
        Set oMail = objItem
        ' 判断当前邮件是否在已发送邮件文件夹(注意:文件夹名称可能因Outlook语言版本变化,英文是"Sent Items")
        Dim isSentFolder As Boolean
        isSentFolder = (oMail.Parent.Name = "已发送邮件")
        
        If isSentFolder Then
            ' 已发送邮件:发件人是你自己,收件人用To属性(目标收件人列表)
            mSender = oMail.SenderName
            mRecipient = oMail.To
        Else
            ' 收件箱类文件夹:发件人是发件者,收件人是接收者(你自己)
            mSender = oMail.SenderName
            mRecipient = oMail.ReceivedByName
        End If
        
        MsgBox "Sender: " & mSender & "_ Recipient: " & mRecipient
    End If
Next objItem

2. 进阶:处理多收件人场景

如果你的已发送邮件有多个收件人,oMail.To会返回分号分隔的字符串。要是你需要单独提取每个收件人,可以遍历Recipients集合:

' 替换已发送邮件里的mRecipient赋值部分
Dim recip As Recipient
Dim recipientList As String
recipientList = ""
For Each recip In oMail.Recipients
    recipientList = recipientList & recip.Name & "; "
Next recip
' 移除末尾多余的分号和空格
If Len(recipientList) > 0 Then
    recipientList = Left(recipientList, Len(recipientList) - 2)
End If
mRecipient = recipientList

总结一下核心要点

  • ReceivedByName是本地接收者,不是邮件的目标收件人
  • 已发送邮件的目标收件人要从To/CC/BCC或者Recipients集合里取
  • 通过判断文件夹可以让宏自动适配不同场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:33:36