我想在 Excel 中使用 VBA 从 Office 365 Outlook 邮件中读取 SenderAddress?

Posted

技术标签:

【中文标题】我想在 Excel 中使用 VBA 从 Office 365 Outlook 邮件中读取 SenderAddress?【英文标题】:I want to read SenderAddress from office 365 Outlook mail using VBA in excel? 【发布时间】:2022-01-08 22:24:30 【问题描述】:

我已尽一切努力从 Office 365 Outlook 阅读邮件,但无法阅读。每次发件人地址都是空的。 我得到的错误是: 运行时错误:“287” 应用程序定义或对象定义的错误。

请找到我正在使用的代码。

Option Explicit

Sub Mail()

    Dim xNameSpace As Outlook.Namespace
    Dim xFolder As Outlook.Folder
    Dim xOutlookApp As Outlook.Application
    
    Set xOutlookApp = New Outlook.Application
    Set xNameSpace = xOutlookApp.Session
    Set xFolder = xNameSpace.GetDefaultFolder(olFolderInbox)
    
    Set xFolder = xFolder.Folders("Retail")
        ' Set Outlook application object.
    Dim objOutlook As Object
    Set objOutlook = CreateObject("Outlook.Application")
    
    Dim objNSpace As Object     ' Create and Set a NameSpace OBJECT.
    ' The GetNameSpace() method will represent a specified Namespace.
    Set objNSpace = objOutlook.GetNamespace("MAPI")
    
    Dim myFolder As Object  ' Create a folder object.
    Set myFolder = objNSpace.GetDefaultFolder(olFolderInbox)
    
    Dim objItem As Object
    Dim iRows, iCols As Integer
    iRows = 2

    ' Loop through each item in the folder.
    For Each objItem In xFolder.Items
        If objItem.Class = olMail Then
            Dim GetSenderAddress As String
            
            Dim objMail As Outlook.MailItem
            Set objMail = objItem
            
            Dim mailType As String
            mailType = objMail.SenderEmailType
            
            
            If mailType = "EX" Then
                ' GetSenderAddress = GetExchangeSenderAddressNew(objMail)
                FindAddress (objMail.SenderEmailAddress)
            Else
                GetSenderAddress = objMail.SenderEmailAddress
            End If

            Cells(iRows, 1) = objMail.SenderEmailAddress
            Cells(iRows, 2) = objMail.To
            Cells(iRows, 3) = objMail.Subject
            Cells(iRows, 4) = objMail.ReceivedTime
        End If
        iRows = iRows + 1
    Next
    Set objMail = Nothing
   
    ' Release.
    Set objOutlook = Nothing
    Set objNSpace = Nothing
    Set myFolder = Nothing

End Sub

Private Function GetExchangeSenderAddress(objMsg As MailItem) As String
    
    Dim oSession As Object
    Set oSession = CreateObject("MAPI.Session")
    oSession.Logon "", "", False, False
    
    Dim sEntryID As String
    Dim sStoreID As String
    Dim oCdoMsg As Object
    Dim sAddress As String
    Const g_PR_SMTP_ADDRESS_W = &H39FE001F
    
    sEntryID = objMsg.EntryID
    sStoreID = objMsg.Parent.StoreID
    Set oCdoMsg = oSession.GetMessage(sEntryID, sStoreID)
    
    sAddress = oCdoMsg.Sender.Fields(g_PR_SMTP_ADDRESS_W).Value
    Set oCdoMsg = Nothing
    oSession.Logoff
    Set oSession = Nothing
    
    GetExchangeSenderAddress = sAddress
    
End Function

另一个代码是:

Sub Mail()

    Dim jsObj As New ScriptControl
    
    jsObj.Language = "JScript"
    
    With jsObj
        .AddCode "outlookApp = new ActiveXObject('Outlook.Application'); nameSpace = outlookApp.getNameSpace('MAPI'); nameSpace.logon('','',false,false); mailFolder = nameSpace.getDefaultFolder(6); var Inbox = mailFolder.Folders; var box = Inbox.Item('Retail').Items;  "
    End With
    
    
End Sub

如果我可以在 Office 365 Outlook 中读取邮件的发件人地址,请告诉我。

【问题讨论】:

你试过在调试器下运行代码吗?哪一行代码准确给出了错误信息? Outlook 数据无法通过 Excel 获得,之前已进行过描述。例如***.com/questions/52776954/… 尝试使用 Outlook VBA 检索数据,然后将数据传递到 Excel。 【参考方案1】:

首先,以下代码行遍历文件夹中的所有项目:

' Loop through each item in the folder.
For Each objItem In xFolder.Items
    If objItem.Class = olMail Then

您不检查它是收到还是组成的项目。撰写的电子邮件可能尚未设置与发件人相关的属性,因此您可以使用CurrentUser 属性,它将当前登录用户的显示名称作为Recipient 对象返回。

注意,如果配置了 Exchange 帐户,您可以使用 AddressEntry.GetExchangeUser 属性,如果 AddressEntry 属于 Exchange AddressList 对象(例如全局地址),则该属性返回代表 AddressEntryExchangeUser 对象列表 (GAL) 并对应于 Exchange 用户。

ExchangeUser.PrimarySmtpAddress 属性返回一个字符串,该字符串表示 ExchangeUser 的主要简单邮件传输协议 (SMTP) 地址。

【讨论】:

我仍然收到同样的错误:运行时错误:'287' 应用程序定义或对象定义错误。 您能说得更具体些吗?哪一行代码准确给出了错误信息? objMail.SenderEmailAddress 这是给我错误的属性

以上是关于我想在 Excel 中使用 VBA 从 Office 365 Outlook 邮件中读取 SenderAddress?的主要内容,如果未能解决你的问题,请参考以下文章

VBA - 如何在 Excel 2010 的目录中获取最后修改的文件或文件夹

从Excel vba中的SQL Server数据中检索/创建记录集

在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

如何在 VBA 中使用 Excel 的内置模函数 (MOD)?

想在excel里用VBA,点击按钮复制一行数据到另外一行,可是不知道该怎么写

使用 VBA 在 SQL Server 中上传 Excel 文件数据