从 gmail 获取消息 ID 非常慢

Posted

技术标签:

【中文标题】从 gmail 获取消息 ID 非常慢【英文标题】:getting messaged id's from gmail is very slow 【发布时间】:2020-12-14 23:38:31 【问题描述】:

我使用 .net 4.5 版创建了类库,语言是 c#。从 gmail API 获取 6 封电子邮件需要花费几分钟的时间。 下面是我用来获取邮件详细信息的代码

public Message GetMailDetails(GmailService service, string EmailId, string MessageID)

            try
            
                var a = service.Users.Messages.Get(EmailId, MessageID);
                a.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Metadata;
                var retMessage = a.Execute();


                //a.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Metadata;
                //retMessage = a.Execute();
                //a.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Minimal;
                //retMessage = a.Execute();
                //a.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw;
                //retMessage = a.Execute();
                return service.Users.Messages.Get(EmailId, MessageID).Execute();
            
            catch (Exception e)
            
                return null;
            
 

【问题讨论】:

听起来您的互联网连接有问题。不知道我们如何回答我看不出您发布的代码有什么问题。可以是任何东西。 你有什么想法吗,我怎样才能在这段代码中实现部分响应,以便我可以只提取我需要的那些参数,而不是提取所有数据? 根据 Gmail API docs list 返回资源仅包含一个 id 和一个 threadId - 所以至少 list 调用不会返回所有数据。 @ShubhamAngne 尝试使用 Fields 参数,它将允许您限制响应。 我添加了用于获取邮件详细信息的代码,您能帮忙传递字段参数@DaImTo 【参考方案1】:

您可以尝试使用名为 Partial response 的东西来进行测试,最简单的测试方法是浏览 try me 页面 try me,您需要一个消息 ID 来测试它

message.get 的完整响应如下所示


  "id": "1742abfd3a4f1c5",
  "threadId": "1742a8c81816e51",
  "labelIds": [
    "CHAT"
  ],
  "snippet": "I'm surprised nobody questioned me when I said that the tag was 2 weeks old, but clearly has questions from longer than 2 weeks ago. :",
  "payload": 
    "partId": "",
    "mimeType": "text/html",
    "filename": "",
    "headers": [
      
        "name": "From",
        "value": "Axxxx"
      
    ],
    "body": 
      "size": 139,
      "data": "SSYjMzk7bSBzdXJwcmlzZWQgbm9ib2R5IHF1ZXN0aW9uZWQgbWUgd2hlbiBJIHNhaWQgdGhhdCB0aGUgdGFnIHdhcyAyIHdlZWtzIG9sZCwgYFybHkgaGFzIHF1ZXN0aW9ucyBmcm9tIGxvbmdlciB0aGFuIDIgd2Vla3MgYWdvLiB7Og=="
    
  ,
  "sizeEstimate": 100,
  "historyId": "6172496",
  "internalDate": "1598445048740"

通过将字段参数添加到您的请求 fields=id,threadid 响应看起来像这样


  "id": "1742abfd3a4f16c5",
  "threadId": "1742a8c181816e51"

基本上,您只请求要查看的数据字段。

示例

var request =  service.Users.Messages.Get(EmailId, MessageID)
request.Fields = "id,threadid";
var response = request.Execute();

当您尝试从数组或列表中挑选内容时,字段可能会有点棘手,我真的建议您在 try me 中对其进行测试。

【讨论】:

我让它像这样工作 a.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Metadata;列表 标头 = 新列表(); headers.Add("日期"); headers.Add("主题"); headers.Add("抄送"); headers.Add("发件人"); headers.Add("密件抄送"); headers.Add("To"); a.MetadataHeaders = 标头;

以上是关于从 gmail 获取消息 ID 非常慢的主要内容,如果未能解决你的问题,请参考以下文章

Gmail API:在使用查询执行 messages.list 时,有没有办法获取 RFC822 消息 ID?

通过 Mailcore 2 获取 Gmail:线程 ID、消息 ID 和 UID

如何在gmail中发送电子邮件之前或之后获取消息ID? [复制]

使用 Powershell 从 GMAIL API 获取消息正文

通过 Google API 获取 gmail 消息的直接链接

Gmail REST API 获取消息函数返回无效的 historyId