Outlook VBA代码获取发件人地址报错:对象不支持该属性或方法
解决Outlook VBA中
Sender.Address报错的问题 错误原因
- 文件夹内可能存在非邮件项(比如会议邀请、任务请求),这类对象没有
Sender属性,直接访问会触发"对象不支持该属性或方法"的错误。 Sender.Address对Exchange账户发件人兼容性差,可能无法正确返回邮箱地址。
修正后的代码
Private Sub Spedizioni() Dim objNamespace As Outlook.NameSpace Dim sourceFolder As Outlook.MAPIFolder Dim Items As Outlook.Items Dim mailItem As Outlook.MailItem Dim i As Long Dim sName As String Dim sPath As String sPath = "C:\Mail\" Set objNamespace = GetNamespace("MAPI") Set sourceFolder = objNamespace.Folders("Spareparts").Folders("Inbox") Set Items = sourceFolder.Items ' 倒序循环,避免删除邮件后索引混乱 For i = Items.Count To 1 Step -1 ' 先判断当前项是否为邮件类型 If Items.Item(i).Class = olMail Then Set mailItem = Items.Item(i) DoEvents ' 用SenderEmailAddress替代Sender.Address,兼容性更强 If mailItem.SenderEmailAddress = "john@xxx.com" And _ mailItem.To = "michael@yyy.com" And _ Left(mailItem.Subject, 4) = "EXPR" Then ' 生成带时间戳的文件名,避免重复 sName = Format(mailItem.ReceivedTime, "yyyymmdd-hhnnss") & "-" & mailItem.Subject & ".txt" ' 替换文件名里的非法字符,防止保存失败 sName = Replace(Replace(Replace(sName, "/", "-"), "\", "-"), ":", "-") ' 明确指定保存为TXT格式 mailItem.SaveAs sPath & sName, olTXT ' 删除目标邮件 mailItem.Delete End If End If Next i End Sub
关键修改说明
- 类型校验:通过
Class = olMail过滤出邮件项,避免访问非邮件对象的不存在属性。 - 发件人判断优化:改用
SenderEmailAddress,直接返回邮箱地址,适配Exchange和普通邮件账户。 - 循环方式调整:倒序循环解决删除邮件后索引前移导致的漏处理问题。
- 文件名处理:替换非法字符,避免因主题包含特殊符号导致保存失败。
- 明确保存格式:指定
olTXT参数,确保保存为纯文本文件。
内容的提问来源于stack exchange,提问作者Paolo Iseppi
相关产品推荐
相关产品推荐

