snapshot of https://github.com/marmelab/atomic-crm.git (main, 2026-09-18; blobs > 131072B omitted)
Some checks failed
✅ Check / 🔬 ESLint (push) Failing after 21s
✅ Check / 🏷️ Typecheck (push) Failing after 11s
✅ Check / 🔎 Test (push) Failing after 11s
✅ Check / e2e-test (push) Failing after 11s
✅ Check / 🔨 Build (push) Failing after 11s
🚀 Deploy / 🚀 Deploy (doc) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (demo) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (supabase) (push) Failing after 18s
Some checks failed
✅ Check / 🔬 ESLint (push) Failing after 21s
✅ Check / 🏷️ Typecheck (push) Failing after 11s
✅ Check / 🔎 Test (push) Failing after 11s
✅ Check / e2e-test (push) Failing after 11s
✅ Check / 🔨 Build (push) Failing after 11s
🚀 Deploy / 🚀 Deploy (doc) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (demo) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (supabase) (push) Failing after 18s
This commit is contained in:
83
supabase/functions/postmark/forwardedParser.ts
Normal file
83
supabase/functions/postmark/forwardedParser.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
/** Patterns that mark the beginning of a forwarded block in the email body. */
|
||||
const FORWARD_SEPARATOR_PATTERNS = [
|
||||
// Gmail
|
||||
/^-{5,}\s*Forwarded message\s*-{5,}/im,
|
||||
// Apple Mail
|
||||
/^Begin forwarded message:/im,
|
||||
// Outlook / Exchange
|
||||
/^-{5,}\s*Original Message\s*-{5,}/im,
|
||||
// French clients (Transféré / Message transféré)
|
||||
/^-{5,}\s*Message transf[eé]r[eé]\s*-{5,}/im,
|
||||
/^-{5,}\s*Transf[eé]r[eé]\s*-{5,}/im,
|
||||
// German (Weitergeleitet)
|
||||
/^-{5,}\s*Weitergeleitete Nachricht\s*-{5,}/im,
|
||||
];
|
||||
|
||||
export const stripForwardingHeaderBlock = (text: string): string => {
|
||||
const lines = text.split("\n");
|
||||
let bodyStartIndex = 0;
|
||||
|
||||
// First check that the first line matches a known forwarding separator pattern
|
||||
const hasForwardedSeparator = FORWARD_SEPARATOR_PATTERNS.some((pattern) => {
|
||||
const match = lines[0].match(pattern);
|
||||
return !!match;
|
||||
});
|
||||
if (!hasForwardedSeparator) {
|
||||
// No known forwarding pattern detected, return the original text
|
||||
return text.trim();
|
||||
}
|
||||
|
||||
// Walk through the header-like lines at the top of the block
|
||||
let i = 0;
|
||||
while (i < lines.length) {
|
||||
const line = lines[i];
|
||||
// Blank line signals end of the forwarded header block
|
||||
if (line.trim() === "") {
|
||||
bodyStartIndex = i + 1;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
// No blank line found after the header → no body to extract
|
||||
if (bodyStartIndex === 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return lines.slice(bodyStartIndex).join("\n").trim();
|
||||
};
|
||||
|
||||
export const stripSubjectForwardingPrefix = (subject: string): string => {
|
||||
const result = subject
|
||||
.replace(/^(Fwd|FW|FWD|Tr|SV|VS|WG|WG:)\s*[:-]\s*/i, "")
|
||||
.trim();
|
||||
|
||||
if (result.length === 0) {
|
||||
console.warn(
|
||||
`Stripping forwarding prefix from subject "${subject}" resulted in empty string, returning original subject`,
|
||||
);
|
||||
return subject;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
export const stripMailSignature = (text: string): string => {
|
||||
const signatureSeparatorIndex = text.indexOf("\n-- \n");
|
||||
if (signatureSeparatorIndex !== -1) {
|
||||
return text.substring(0, signatureSeparatorIndex).trim();
|
||||
}
|
||||
return text.trim();
|
||||
};
|
||||
|
||||
export const getForwardedMailContent = (body: string): string => {
|
||||
const strippedBody = stripForwardingHeaderBlock(stripMailSignature(body));
|
||||
|
||||
if (strippedBody.length === 0) {
|
||||
console.warn(
|
||||
"Stripping mail signature and forwarded header block resulted in empty note content, returning original body",
|
||||
);
|
||||
return body.trim();
|
||||
}
|
||||
return strippedBody;
|
||||
};
|
||||
Reference in New Issue
Block a user