diff --git a/lib/email-headers.ts b/lib/email-headers.ts index 4d0cd390..53a79345 100644 --- a/lib/email-headers.ts +++ b/lib/email-headers.ts @@ -118,7 +118,8 @@ export function parseAuthenticationResults(header: string): AuthenticationResult */ export function parseSpamScore(header: string): { score: number; status: string } | null { // Try X-Spam-Status format: "No, score=-0.25" - const statusMatch = header.match(/^(Yes|No),?\s+score=([-\d.]+)/i); + // And try X-Spam-Score format (Stalwart): "ham, score=-0.25" + const statusMatch = header.match(/^(Yes|No|spam|ham),?\s+score=([-\d.]+)/i); if (statusMatch) { return { status: statusMatch[1].toLowerCase(), diff --git a/lib/jmap/client.ts b/lib/jmap/client.ts index dc5ea898..184c5883 100644 --- a/lib/jmap/client.ts +++ b/lib/jmap/client.ts @@ -1243,10 +1243,10 @@ export class JMAPClient implements IJMAPClient { email.authenticationResults = parseAuthenticationResults(value); } - for (const headerName of ['X-Spam-Status', 'X-Spam-Result', 'X-Rspamd-Score']) { + for (const headerName of ['X-Spam-Score', 'X-Spam-Status', 'X-Spam-Result', 'X-Rspamd-Score']) { if (!headersRecord[headerName]) continue; const value = Array.isArray(headersRecord[headerName]) ? headersRecord[headerName][0] : headersRecord[headerName]; - const spamResult = parseSpamScore(value as string); + const spamResult = parseSpamScore((value as string).trim()); if (spamResult) { email.spamScore = spamResult.score; email.spamStatus = spamResult.status;