簡體   English   中英

獲取Javascript中電子郵件地址的每個附件

[英]Get every attachment of an email address in Javascript

我想從電子郵件中獲取所有附件。 問題是,對於附件,我必須執行列表請求以從頁面​​中獲取電子郵件,然后對於每個電子郵件,另一個請求以獲取完整信息,然后對每個附件進行另一個請求。

這就是我現在要做的,因為有太多請求,我遇到了一些並發請求錯誤(我使用setTimout進行測試)

async function listMessagesWithAttachments(
  auth,
  pageToken = "08116115363713650026"
) {
  const gmail = google.gmail({ version: "v1", auth });
  console.log(123);
  await gmail.users.messages.list(
    {
      userId: "me",
      maxResults: 50,
      pageToken,
    },
    async (err, { data }) => {
      const { nextPageToken } = data;
      console.log("test", nextPageToken);
      if (err)
        return console.log(
          "Error in listMessageswithAttachments, messages list: " + err
        );
      let { messages } = data;
      let fullMessages = [];
      messages.forEach(async (message, id) => {
        setTimeout(() => {
          gmail.users.messages.get(
            {
              userId: "me",
              id: message.id,
              format: "full",
            },
            (err, { data } = { data: "" }) => {
              if (err) console.log("Error ", err);
              fullMessages = [...fullMessages, data];
              if (fullMessages.length === messages.length) {
                let attachmentIds = [];
                let attachments = [];

                fullMessages.forEach(
                  (message = { payload: { parts: [] } }, messageIndex) => {
                    if (!message.payload) {
                      message.payload = { parts: [] };
                    }
                    let parts =
                      (message && message.payload && message.payload.parts) ||
                      [];
                    parts &&
                      parts.forEach((part, partId) => {
                        if (
                          part.body.size &&
                          part.body.size > 0 &&
                          part.body.attachmentId
                        ) {
                          let object = {
                            index: `${partId}`,
                            messageId: message.id,
                            attachmentId: part.body.attachmentId,
                          };
                          attachmentIds = [...attachmentIds, object];
                        }
                      });
                    if (fullMessages.length - 1 === messageIndex) {
                      attachmentIds.forEach(attachment => {
                        gmail.users.messages.attachments.get(
                          {
                            userId: "me",
                            messageId: attachment.messageId,
                            id: attachment.attachmentId,
                          },
                          (err, { data }) => {
                            if (err) {
                              console.log("Error getting attachement: " + err);
                              return 0;
                            }
                            attachments = [...attachments, data];
                            if (attachments.length === attachmentIds.length) {
                              if (nextPageToken) {
                                console.log(nextPageToken);
                                listMessagesWithAttachments(
                                  auth,
                                  nextPageToken
                                );
                              }
                            }
                            console.log(attachments);
                          }
                        );
                      });
                    }
                  }
                );
              }
            }
          );
        }, id * 20);
      });
      listMessagesWithAttachments(auth, nextPageToken);
    }
  );
}

有一個更好的方法嗎? 例如,一種獲取list請求中完整消息的方法,然后我可以僅對附件提出請求。 但是主要的問題是找到一種減少請求並發的方法。

謝謝。

避免嵌套循環

相反,您可以創建單獨的函數,這些函數返回您的請求響應,並將其作為參數傳遞給下一個函數。

例如

var list=gmail.users.messages.list(...)

要么:

gmail.users.messages.get()
{
...
if (part.body.size && part.body.size > 0 &&part.body.attachmentId){
...
IdArray.push(messageId)
...)
return array;
...
}

getAttachmentId(IdArray){
...
}

這將不必使代碼更短或更有效,但是它將減少並發請求超時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM