3
respostas

[Dúvida] BODY GMAIL

Tentei fazer a captura do Body utilizando o Gmail ao invés do Outlook, porém aparentemente o gmail não traz o Body.
Tentei usar um codigo depois do trigger da mensagem para aprofundar e estruturar mas tampoco consigo.
Existe uma solução facil para extrair o body do email?

obs:Testei logar com as credenciais de client e secret ID também pra ver se a integração ficava melhor, porém ocorreu o mesmo problema.

3 respostas

Ei, Lucas! Tudo bem?

Você está recebendo alguma mensagem de erro ou de aviso que conta o que está acontecendo ou um código do erro, algo semelhante? Para que eu possa entender melhor o seu cenário, compartilhar mais detalhes por gentileza?

Neste guia tem as informações que mostra exatamente o que precisamos saber para conseguir te ajudar da melhor forma, e com mais agilidade.

Fico no aguardo. Bons estudos e até mais!!

Boa tarde Nathalia!

Eu estive fazendo outros testes e percebi que para e-mails digitados manualmente eu consigo extrair o body do email.
Esses e-mail de marketing ou que utilizam algum sistema para enviar que fica mais dificil pois vem cheio de HTML.
Acredito que pra sistemas de automação de processos, onde um robô vai responder as duvidas de uma pessoa, isso não seja um problema pois a leitura vai ser feita.
De qualquer maneira, vou deixar aqui embaixo um código que usei pra extrair e limpar ao maximo o body de um email promocional/marketing a quem possa interessar.
Eu coloquei esse código em um nó de "Code in Javascript" logo após o node do "gmail Trigger" que recebe o e-mail.

const items = $input.all();

const decodeBase64 = (str) => {
try {
return Buffer.from(str, 'base64').toString('utf-8');
} catch (e) {
return str;
}
};

const removeHtmlTags = (str) => {
return str.replace(/<[^>]*>/g, '');
};

const decodeHtmlEntities = (str) => {
const entities = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
''': "'",
' ': ' ',
};
return str.replace(/&[a-zA-Z0-9#]+;/g, (match) => entities[match] || match);
};

const extractLatestMessage = (text) => {
const patterns = [/^On .* wrote:/m, /^Em .* escreveu:/m, /^.* wrote:/m, /^.* escreveu:/m];
for (const pattern of patterns) {
const match = text.match(pattern);
if (match) {
return text.substring(0, match.index).trim();
}
}
return text;
};

const cleanText = (text) => {
// Remove signatures
text = text.replace(/^--.*$/gm, '');
// Remove extra whitespace
text = text.replace(/\s+/g, ' ').trim();
return text;
};

const getBodyFromParts = (parts) => {
if (!Array.isArray(parts)) return null;
// Prefer text/plain
let part = parts.find(p => p.mimeType === 'text/plain');
if (!part) part = parts.find(p => p.mimeType === 'text/html');
if (!part || !part.body || !part.body.data) return null;
let content = decodeBase64(part.body.data);
if (part.mimeType === 'text/html') {
content = removeHtmlTags(content);
}
content = decodeHtmlEntities(content);
return content;
};

for (const item of items) {
const payload = item.json.payload || item.json;
let body = null;
let source = '';

// 1. payload.parts
if (payload.parts) {
body = getBodyFromParts(payload.parts);
if (body) source = 'payload.parts';
}

// 2. payload.body.data
if (!body && payload.body && payload.body.data) {
body = decodeBase64(payload.body.data);
if (payload.body.mimeType === 'text/html') {
body = removeHtmlTags(body);
}
body = decodeHtmlEntities(body);
source = 'payload.body.data';
}

// 3. html field
if (!body && payload.html) {
body = removeHtmlTags(payload.html);
body = decodeHtmlEntities(body);
source = 'html field';
}

// 4. text field
if (!body && payload.text) {
body = decodeHtmlEntities(payload.text);
source = 'text field';
}

// 5. snippet field
if (!body && payload.snippet) {
body = decodeHtmlEntities(payload.snippet);
source = 'snippet field';
}

if (body) {
body = extractLatestMessage(body);
body = cleanText(body);
} else {
body = '';
}

item.json.cleanBody = body;
console.log(Source used: ${source}, Extracted length: ${body.length});
}

return items;

Tudo bem, Lucas?

Perfeito! A solução com o node de código ficou excelente, tratou base64, HTML e ainda limpou o conteúdo, que é exatamente o caminho usado em cenários reais de automação.

Ótima contribuição, agradeço por compartilhar, isso com certeza ajuda outros alunos.

Continue assim e qualquer dúvida, compartilhe conosco.

Bons estudos e até mais!