feat: add suppression list (#192)

This commit is contained in:
KM Koushik
2025-07-27 23:51:59 +10:00
committed by GitHub
parent a28f132428
commit e6dd8673b4
20 changed files with 2026 additions and 58 deletions
+46 -1
View File
@@ -1,4 +1,9 @@
import { EmailStatus, Prisma, UnsubscribeReason } from "@prisma/client";
import {
EmailStatus,
Prisma,
UnsubscribeReason,
SuppressionReason,
} from "@prisma/client";
import {
SesBounce,
SesClick,
@@ -19,6 +24,7 @@ import {
} from "../queue/queue-constants";
import { getChildLogger, logger, withLogger } from "../logger/log";
import { randomUUID } from "crypto";
import { SuppressionService } from "./suppression-service";
export async function parseSesHook(data: SesEvent) {
const mailStatus = getEmailStatus(data);
@@ -101,6 +107,45 @@ export async function parseSesHook(data: SesEvent) {
mailStatus === EmailStatus.BOUNCED &&
(mailData as SesBounce).bounceType === "Permanent";
// Add emails to suppression list for hard bounces and complaints
if (isHardBounced || mailStatus === EmailStatus.COMPLAINED) {
const recipientEmails = Array.isArray(email.to) ? email.to : [email.to];
try {
await Promise.all(
recipientEmails.map((recipientEmail) =>
SuppressionService.addSuppression({
email: recipientEmail,
teamId: email.teamId,
reason: isHardBounced
? SuppressionReason.HARD_BOUNCE
: SuppressionReason.COMPLAINT,
source: email.id,
})
)
);
logger.info(
{
emailId: email.id,
recipients: recipientEmails,
reason: isHardBounced ? "HARD_BOUNCE" : "COMPLAINT",
},
"Added emails to suppression list due to bounce/complaint"
);
} catch (error) {
logger.error(
{
emailId: email.id,
recipients: recipientEmails,
error: error instanceof Error ? error.message : "Unknown error",
},
"Failed to add emails to suppression list"
);
// Don't throw error - continue processing the webhook
}
}
if (
[
"DELIVERED",