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;