【发布时间】:2016-07-26 16:23:12
【问题描述】:
我想要达到的目标:
我正在使用 Gmail API 基本上我想连接到我的 GMail 帐户来阅读我的电子邮件,收件箱类别,并获取每封邮件的基本信息(标题/主题, from、to、date 和发件人)。
问题:
我正在尝试使 this Google 示例(用 C# 编写)适应我自己的需求,我正在寻找 C# 或 Vb.Net 中的解决方案,无论如何。 p>
(请注意,Google 会针对不同的用户国家/地区显示不同的代码示例,因此该网页的代码可能不会对每个人都相同,Google 的逻辑真的很糟糕。)
下面的代码我遇到的问题是:
- 我在
lblInbox.MessagesTotal属性中得到一个空值。 -
msgItem.Raw属性也始终为空。 - 我还没有发现如何只解析收件箱类别中的消息。
- 我还没有发现如何确定一条消息是已读还是未读。
- 我还没有发现如何确定邮件的基本信息(主题、发件人、收件人、日期、发件人)。
这是我尝试过的,请注意,在调整 Google 的示例时,我假设 "user" 参数应该是 Gmail 用户帐户名 ("MyEmail@GMail.com"),但我不确定它应该是那个。
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Imports Google.Apis.Auth.OAuth2
Imports Google.Apis.Services
Imports Google.Apis.Util.Store
Imports Google.Apis.Gmail
Imports Google.Apis.Gmail.v1
Imports Google.Apis.Gmail.v1.Data
Imports Google.Apis.Gmail.v1.UsersResource
Public Class Form1 : Inherits Form
Private Async Sub Test() Handles MyBase.Shown
Await GmailTest()
End Sub
Public Async Function GmailTest() As Task
Dim credential As UserCredential
Using stream As New FileStream("C:\GoogleAPIKey.json", FileMode.Open, FileAccess.Read)
credential = Await GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
{GmailService.Scope.MailGoogleCom},
"MyEmail@GMail.com",
CancellationToken.None)
End Using
' Create the service.
Dim service As New GmailService(New BaseClientService.Initializer() With {
.HttpClientInitializer = credential,
.ApplicationName = "What I need to put here?"
})
' Get the "INBOX" label/category.
Dim lblReq As UsersResource.LabelsResource.ListRequest = service.Users.Labels.List("me")
Dim lblInbox As Data.Label = lblReq.Execute().Labels.Where(Function(lbl) lbl.Name = "INBOX").Single
Dim msgCount As Integer? = lblInbox.MessagesTotal
MsgBox("Messages Count: " & msgCount)
If (msgCount <> 0) Then
' Define message parameters of request.
Dim msgReq As UsersResource.MessagesResource.ListRequest = service.Users.Messages.List("me")
' List messages of INBOX category.
Dim messages As IList(Of Data.Message) = msgReq.Execute().Messages
Console.WriteLine("Messages:")
If (messages IsNot Nothing) AndAlso (messages.Count > 0) Then
For Each msgItem As Data.Message In messages
MsgBox(msgItem.Raw)
Next
End If
End If
End Function
End Class
问题:
我会询问最重要的需求(但是,非常欢迎任何帮助解决其他提到的问题):
- 在 C# 或 VB.Net 中,如何获取一个集合来迭代所有收件箱组中的电子邮件?
更新:
这是我现在正在使用的代码,目的是检索指定邮箱标签的所有Messages的集合,问题是Payload和Body newMsg 对象的成员为空,所以我无法阅读电子邮件。
我做错了什么?
Public Async Function GetMessages(ByVal folder As Global.Google.Apis.Gmail.v1.Data.Label) As Task(Of List(Of Global.Google.Apis.Gmail.v1.Data.Message))
If Not (Me.isAuthorizedB) Then
Throw New InvalidOperationException(Me.authExceptionMessage)
Else
Dim msgsRequest As UsersResource.MessagesResource.ListRequest = Me.client.Users.Messages.List("me")
With msgsRequest
.LabelIds = New Repeatable(Of String)({folder.Id})
.MaxResults = 50
'.Key = "YOUR API KEY"
End With
Dim msgsResponse As ListMessagesResponse = Await msgsRequest.ExecuteAsync()
Dim messages As New List(Of Global.Google.Apis.Gmail.v1.Data.Message)
Do While True
For Each msg As Global.Google.Apis.Gmail.v1.Data.Message In msgsResponse.Messages
Dim msgRequest As UsersResource.MessagesResource.GetRequest = Me.client.Users.Messages.Get("me", msg.Id)
msgRequest.Format = MessagesResource.GetRequest.FormatEnum.Full
Dim newMsg As Message = Await msgRequest.ExecuteAsync()
messages.Add(newMsg)
Next msg
If Not String.IsNullOrEmpty(msgsResponse.NextPageToken) Then
msgsRequest.PageToken = msgsResponse.NextPageToken
msgsResponse = Await msgsRequest.ExecuteAsync()
Else
Exit Do
End If
Loop
Return messages
End If
End Function
【问题讨论】:
-
"user" 由 filedatastore 用于更改存储凭据的名称。它可以是任何随机字符串。
-
@DaImTo 感谢您提供有用的信息,那么现在我完全误解了如何以及在何处指定我想要访问的 Gmail 用户帐户。
-
当用户对他们授予您访问权限的应用程序进行身份验证时,您并没有真正做到。您并没有通过验证您的代码来真正指定他们所做的事情。
标签: c# .net vb.net google-api gmail