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
相关产品推荐
相关产品推荐

