如何使用带有 OAuth 令牌的 Asp.Net MVC 中的 gmail API 更快地获取日期明智的电子邮件

Posted

技术标签:

【中文标题】如何使用带有 OAuth 令牌的 Asp.Net MVC 中的 gmail API 更快地获取日期明智的电子邮件【英文标题】:how to get date wise email faster using gmail API in Asp.Net MVC with OAuth Token 【发布时间】:2020-11-27 02:49:31 【问题描述】:

这里我为 Gmail API 编写了代码,以使用日期过滤器获取邮件 我可以使用第一个 API 获取 MessageId 和 ThreadId。在 MessageId 的基础上,我将该 messageId 参数放在 List 对象中,并在 foreach 循环中将此参数从 List 发送到下一个 API,以根据 messageID 获取电子邮件正文。但是从 Gmail 中提取邮件的过程非常缓慢

public async Task<ActionResult> DisplayEmailWithFilter (string fromDate, string toDate) 

    Message messageObj = new Message ();
    Example exampleObj = new Example ();
    List<GmailMessage> gmailMessagesList = new List<GmailMessage> ();
    GmailMessage gmailMessage = new GmailMessage ();
    var responseData = "";
    //dateFilter string parameter Created with Date Values 
    string dateFilter = "in:Inbox after:" + fromDate + " before:" + toDate;

    try 
        // calling Gmail API to get MessageID Details by Date Filter
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue (scheme: "Bearer",
            parameter : Session["Token"].ToString ());
        HttpResponseMessage responseMessage = await client.GetAsync ("https://www.googleapis.com/gmail/v1/users/me/messages?q=" + dateFilter);
        if (responseMessage.IsSuccessStatusCode) 
            var data = responseMessage.Content;
        

        try 
            responseData = responseMessage.Content.ReadAsStringAsync ().Result;
            //This Json Data Converted into List Object
            var msgList = JsonConvert.DeserializeObject<Root1> (responseData);
            //loop for Fetching EmailMessageData by MessageID
            if (msgList.resultSizeEstimate != 0) 

                foreach (var msgItem in msgList.messages) 
                    messageObj.id = msgItem.id;

                    //Calling API with MessageID Parameter to fetch Respective Message Data 
                    HttpResponseMessage responseMessageList = await client.GetAsync ("https://www.googleapis.com/gmail/v1/users/userId/messages/id?id=" + messageObj.id.ToString () + "&userId=me&format=full");
                    if (responseMessageList.IsSuccessStatusCode) 
                        var dataNew = responseMessageList.Content;
                        var responseDataNew = responseMessageList.Content.ReadAsStringAsync ().Result;
                        //Converting json string in Object
                        exampleObj = JsonConvert.DeserializeObject<Example> (responseDataNew);

                        gmailMessage.Body = exampleObj.snippet;
                        //fetching Header Values comparing with string to get Data
                        for (int i = 1; i < exampleObj.payload.headers.Count; i++) 
                            if (exampleObj.payload.headers[i].name.ToString () == "Date") 
                                gmailMessage.RecievedDate = exampleObj.payload.headers[i].value;
                            
                            if (exampleObj.payload.headers[i].name.ToString () == "Subject") 
                                gmailMessage.Subject = exampleObj.payload.headers[i].value;
                            
                            if (exampleObj.payload.headers[i].name.ToString () == "Message-ID") 
                                gmailMessage.SenderEmailID = exampleObj.payload.headers[i].value;
                            
                            if (exampleObj.payload.headers[i].name.ToString () == "From") 
                                gmailMessage.SenderName = exampleObj.payload.headers[i].value;
                            
                        

                        //Adding This Object Values in GmailMessgage List Object
                        gmailMessagesList.Add (
                            new GmailMessage 
                                Body = exampleObj.snippet,
                                    SenderEmailID = gmailMessage.SenderEmailID,
                                    RecievedDate = gmailMessage.RecievedDate,
                                    SenderName = gmailMessage.SenderName,
                                    Subject = gmailMessage.Subject,
                            );
                    

                
            
         catch (Exception e) 

            string errorMgs = e.Message.ToString ();
            throw;
        
     catch (Exception e) 

        string errorMgs = e.Message.ToString ();
        throw;
    

    return View (gmailMessagesList);


我可以按日期获取 Gmail 电子邮件,但获取时间太长了。如何更快地改进代码和性能?

【问题讨论】:

相对于您的期望而言,花费“这么多时间”的编码可能是完全正常的。在这些情况下,请尝试提供事实信息,多少秒,与直接在 UI 中执行此操作相比如何?还有不使用C# library的原因是什么? @Raserhin 我无法理解指南参考中显示的 Google 的 C# 库示例以及如何添加 Credential.json 文件它是如何工作的,所以我编写了这种类型的代码。正如您询问执行 API 需要 1 秒,但我正在使用 Foreach 循环通过 MessageId 获取电子邮件数据,因此 API 使用不同的 MessageID 调用多次。你能建议我从收件箱中获取日期消息的任何其他选项吗 我认为在查询单个消息方面您无能为力,这真的会影响您的工作流程吗?您是否因为这个性能问题而有问题? @Raserhin 是的,这影响了我的工作流程。我正在使用 msgID 参数循环调用第二个 API 以获取选择性电子邮件以读取主题和正文。这个过程使工作流程变慢,因为我每天收到 150 到 200 封电子邮件。API 在循环中调用 200 次以获取带有请求日期过滤器的电子邮件主题和正文。我可以使用特定的主题和正文过滤器获取日期明智的电子邮件吗?我只想阅读那些具有特定主题和正文的邮件。我知道我每天都会收到特定类型的邮件,我只想根据起始日期和截止日期阅读这些电子邮件。 【参考方案1】:

查询似乎是您能做的最多的事情。如果您了解有关这些电子邮件的更多信息,例如特定主题或始终来自同一发件人,您也可以尝试过滤这些信息,就像您在 Gmail interface 中所做的那样。

否则你会有点不走运。您受到从User.messages.list 检索到的文件的限制。

如果您需要摆脱 API 限制,也许尝试以其他方式检索消息将是正确的方法。考虑创建一个小代码来检索消息by the IMAP protocol。本主题中的几个问题可能会对您有所帮助:

Reading Gmail messages using Python IMAP Reading Gmail Email in Python How can I get an email message's text content using Python?

【讨论】:

以上是关于如何使用带有 OAuth 令牌的 Asp.Net MVC 中的 gmail API 更快地获取日期明智的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.Net Web API 2 中使用 Owin OAuth2 修改令牌端点响应正文

ASP .NET Web Api OAuth 刷新令牌过期时间

ASP.net core web api:使用 Facebook/Google OAuth 访问令牌进行身份验证

处理 OAuth 2.0 身份验证 - 在 ASP.NET MVC 应用程序中获取令牌重定向令牌响应

ASP.NET Identity(使用 IdentityServer4)获取外部资源 oauth 访问令牌

Aurelia 的 Oauth2 托管在 asp .net 核心中