如何从 Gmail API 获取没有原始消息的回复消息

问题描述 投票:0回答:5

我想在没有原始消息的线程中获得回复消息。但是,当我使用 Users.messages: GET 或 Users.threads: GET 时,我也会收到带有原始消息(不需要的)的回复(根据需要)。请参阅下面的代码截图。

(据我所知,这个问题也在here中提出,但是我没有发现建议的解决方案回答了这个问题,并且建议的解决方案的张贴者建议我开始一个新问题。我尝试与用户一起。然而,Tholle 建议的线程收到了相同的结果。)

我是菜鸟,所以非常感谢任何和所有的帮助,如果我遗漏了一些明显的东西,我深表歉意。

代码

var gapiGETRequest = function (gapiRequestURL)
  {
      var xmlHttp = new XMLHttpRequest();
      xmlHttp.open( "GET", gapiRequestURL, false );
      xmlHttp.send( null );
      return xmlHttp.responseText;
  }

var gapiRequestInboxMessagesAndToken = "https://www.googleapis.com/gmail/v1/users/me/messages?q=-label%3ASENT+in%3AINBOX&access_token=" + thisToken
var allMessagesReceived = gapiGETRequest(gapiRequestInboxMessagesAndToken)
var allMessagesObject = JSON.parse(allMessagesReceived)
var messageIdsOfReceivedMessages = [];
var getIdsOfReceivedMessages = function(responseObject){
  for(var i=0; i < responseObject.messages.length; i ++) {
    messageIdsOfReceivedMessages.push(responseObject.messages[i].id);
  }
}

var messageContentsArr = [];
var getMessageContents = function(messageIdList)
{
  for(var i=0; i < messageIdList.length; i++)
  {
    var gapiRequestMessageWithId = "https://www.googleapis.com/gmail/v1/users/me/messages/" + messageIdList[i] + "?access_token=" + thisToken
    var currentMessage = JSON.parse(gapiGETRequest(gapiRequestMessageWithId))
    var encodedMessageContents = currentMessage.payload.parts[0].body.data
    var decodedMessageContents = atob(encodedMessageContents.replace(/-/g, '+').replace(/_/g, '/'));
    messageContentsArr.push(decodedMessageContents)
  }
}

getIdsOfReceivedMessages(allMessagesObject);
getMessageContents(messageIdsOfReceivedMessages);

回应

result

gmail gmail-api
5个回答
4
投票

您将收到完整的回复消息。报道回复时,他们引用了原文,原文在回复文中。您可能只想像 Gmail 和许多其他现代电子邮件应用程序一样折叠/隐藏任何以 > 开头的回复文本。


3
投票

这是我的解决方案。它有点长,但我试图尽可能详细地记录它。

处理 Gmail API 返回的

message
https://developers.google.com/gmail/api/v1/reference/users/messages#resource

输入:

Hello. This is my reply to message.

On Thu, Apr 30, 2020 at 8:29 PM John Doe <[email protected]>
wrote:

> Hey. This is my message.
>


-- 
John Doe
My Awesome Signature

输出:

Hello. This is my reply to message.

代码:(不幸的是这没有语法高亮:P)

const message = await getMessageFromGmailApi();

const text = getGoogleMessageText(message);

console.log(text, '<= AWESOME RESULT');


function getGoogleMessageText(message) {
    let text = '';

    const fromEmail = getGoogleMessageEmailFromHeader('From', message);
    const toEmail = getGoogleMessageEmailFromHeader('To', message);

    let part;
    if (message.payload.parts) {
        part = message.payload.parts.find((part) => part.mimeType === 'text/plain');
    }

    let encodedText;
    if (message.payload.parts && part && part.body.data) {
        encodedText = part.body.data;
    } else if (message.payload.body.data) {
        encodedText = message.payload.body.data;
    }

    if (encodedText) {
        const buff = new Buffer(encodedText, 'base64');
        text = buff.toString('ascii');
    }

    // NOTE: We need to remove history of email.
    // History starts with line (example): 'On Thu, Apr 30, 2020 at 8:29 PM John Doe <[email protected]> wrote:'
    //
    // We also don't know who wrote the last message in history, so we use the email that
    // we meet first: 'fromEmail' and 'toEmail'
    const fromEmailWithArrows = `<${fromEmail}>`;
    const toEmailWithArrows = `<${toEmail}>`;
    // NOTE: Check if email has history
    const isEmailWithHistory = (!!fromEmail && text.indexOf(fromEmailWithArrows) > -1) || (!!toEmail && text.indexOf(toEmailWithArrows) > -1);

    if (isEmailWithHistory) {
       // NOTE: First history email with arrows
       const historyEmailWithArrows = this.findFirstSubstring(fromEmailWithArrows, toEmailWithArrows, text);

       // NOTE: Remove everything after `<${fromEmail}>`
       text = text.substring(0, text.indexOf(historyEmailWithArrows) + historyEmailWithArrows.length);
       // NOTE: Remove line that contains `<${fromEmail}>`
       const fromRegExp = new RegExp(`^.*${historyEmailWithArrows}.*$`, 'mg');
       text = text.replace(fromRegExp, '');
    }

    text = text.trim()

    return text;
}


function getGoogleMessageEmailFromHeader(headerName, message) {
    const header = message.payload.headers.find((header) => header.name === headerName);

    if (!header) {
        return null;
    }

    const headerValue = header.value; // John Doe <[email protected]>

    const email = headerValue.substring(
        headerValue.lastIndexOf('<') + 1,
        headerValue.lastIndexOf('>')
    );

    return email; // [email protected]
}


function findFirstSubstring(a, b, str) {
    if (str.indexOf(a) === -1) return b;
    if (str.indexOf(b) === -1) return a;

    return (str.indexOf(a) < str.indexOf(b))
        ? a
        : b; // NOTE: (str.indexOf(b) < str.indexOf(a))
}

0
投票

根据您在完整电子邮件字符串中的电子邮件 ID 位置,单独对回复内容进行子字符串化。

$str = "VGhhbmtzIGZvciB0aGUgbWFpbC4NCg0KT24gVHVlLCBKdWwgMTIsIDIwMjIgYXQgMjo1OCBQTSA8aW5mb0BhaXJjb25uZWN0aW5kaWEuY29tPiB3cm90ZToNCg0KPiBTLk5vIFZlbmRvciBQcm9kdWN0IEJhbmR3aWR0aCBGcm9tIExvY2F0aW9uIFRvIExvY2F0aW9uDQo-IDEgQWlydGVsIEludGVybmV0IDEwMCAyMS4xNzAyNDAxLDcyLjgzMTA2MDcwMDAwMDAxDQo-IDE5LjA0NjE5NTY4NjA2MjMxMiw3Mi44MjAyNzY0Mzc4MjA0Mw0KPg0K";

$str_raw = strtr($str, array('+' => '-', '/' => '_'));

$full_email = utf8_decode(base64_decode($str_raw));

$split_position = strpos($full_email, "your_mail_id") - 33; //33 - before that some date time available, remove those also
$final_string = substr($full_email, 0, $split_position);

echo $final_string;

0
投票

要在没有以前的 gmail 的情况下发送 gmail,请单击“转发” 删除 Gmail 内容 在左侧的向下箭头选择回复 输入新内容并发送


-2
投票

让我拯救你的一天

console.log(message.split("On")[0])

输出:你好。这是我对消息的回复

© www.soinside.com 2019 - 2024. All rights reserved.