【问题标题】:Fetching gmail inbox mail messages via CDO in vba excel在 vba excel 中通过 CDO 获取 gmail 收件箱邮件
【发布时间】:2012-11-29 07:10:45
【问题描述】:

我想在 VBA 中使用 CDO 访问 gmail 帐户中的收件箱。 我已经设法发送了一封邮件,但不知道如何将收件箱消息提取到 Excel 表中。 如果可能的话,我也希望能够识别每条消息的标签。

【问题讨论】:

    标签: excel gmail cdo.message vba


    【解决方案1】:

    虽然问题特别要求 CDO,但从 this similar SO question 看来,这似乎无法直接使用 CDO。

    作为获取收件箱邮件消息的替代方法,Google 最近发布了可以与 Excel 一起使用的 Gmail API。下面是一个使用VBA-Web的例子:

    ' Setup client and authenticator (cached between requests)
    Private pGmailClient As WebClient
    Private Property Get GmailClient() As WebClient
        If pGmailClient Is Nothing Then
            ' Create client with base url that is appended to all requests
            Set pGmailClient = New WebClient
            pGmailClient.BaseUrl = "https://www.googleapis.com/gmail/v1/"
    
            ' Use the pre-made GoogleAuthenticator found in authenticators/ folder
            ' - Automatically uses Google's OAuth approach including login screen
            ' - Get API client id and secret from https://console.developers.google.com/
            ' - https://github.com/timhall/Excel-REST/wiki/Google-APIs for more info
            Dim Auth As New GoogleAuthenticator
            Auth.Setup "Your client id", "Your client secret"
            Auth.AddScope "https://www.googleapis.com/auth/gmail.readonly"
            Auth.Login
            Set pGmailClient.Authenticator = Auth
        End If
    
        Set GmailClient = pGmailClient
    End Property
    
    ' Load messages for inbox
    Function LoadInbox() As Collection
        Set LoadInbox = New Collection
    
        ' Create inbox request with userId and querystring for inbox label
        Dim Request As New WebRequest
        Request.Resource = "users/{userId}/messages"
        Request.AddUrlSegment "userId", "me"
        Request.AddQuerystringParam "q", "label:inbox"
    
        Dim Response As WebResponse
        Set Response = GmailClient.Execute(Request)
    
        If Response.StatusCode = WebStatusCode.Ok Then
            Dim MessageInfo As Dictionary
            Dim Message As Dictionary
    
            For Each MessageInfo In Response.Data("messages")
                ' Load full messages for each id
                Set Message = LoadMessage(MessageInfo("id"))
                If Not Message Is Nothing Then
                    LoadInbox.Add Message
                End If
            Next MessageInfo
        End If
    End Function
    
    ' Load message details
    Function LoadMessage(MessageId As String) As Dictionary
        Dim Request As New WebRequest
        Request.Resource = "users/{userId}/messages/{messageId}"
        Request.AddUrlSegment "userId", "me"
        Request.AddUrlSegment "messageId", MessageId
    
        Dim Response As WebResponse
        Set Response = GmailClient.Execute(Request)
    
        If Response.StatusCode = WebStatusCode.Ok Then
            Set LoadMessage = New Dictionary
    
            ' Pull out relevant parts of message (from, to, and subject from headers)
            LoadMessage.Add "snippet", Response.Data("snippet")
    
            Dim Header As Dictionary
            For Each Header In Response.Data("payload")("headers")
                Select Case Header("name")
                Case "From"
                    LoadMessage.Add "from", Header("value")
                Case "To"
                    LoadMessage.Add "to", Header("value")
                Case "Subject"
                    LoadMessage.Add "subject", Header("value")
                End Select
            Next Header
        End If
    End Function
    
    Sub Test()
        Dim Message As Dictionary
        For Each Message In LoadInbox
            Debug.Print "From: " & Message("from") & ", Subject: " & Message("subject")
            Debug.Print Message("snippet") & vbNewLine
        Next Message
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多