как быстрее получать электронную почту с датой, используя gmail API в Asp. Net MVC с токеном OAuth - PullRequest
0 голосов
/ 06 августа 2020

Здесь я написал код для Gmail API для получения почты с фильтром даты
Я могу получить MessageId и ThreadId с помощью First API. На основе MessageId я поместил этот параметр messageId в объект List и отправил этот параметр в foreach l oop из 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 по дате, но это заняло очень много времени. как я могу улучшить свой код и производительность быстрее?

1 Ответ

0 голосов
/ 20 августа 2020

Запрос кажется максимальным, на что вы способны. Если вам известна дополнительная информация об этих письмах, например, c тем или они всегда приходят от одного и того же отправителя, вы можете попробовать отфильтровать и это, как в интерфейсе Gmail .

Иначе бы вам не повезло. Вы ограничены файлами, полученными из User.messages.list.

Если вам нужно выйти из ограничений API, возможно, попытка получить сообщение другим способом будет правильным способом go . Рассмотрите возможность создания небольшого кода для получения сообщения по протоколу IMAP . Несколько вопросов в этом топе c могут вам помочь:

...