如何使用带有 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 应用程序中获取令牌重定向令牌响应