← Cloudflare Email Service / email-service / examples / email-routing
Filtrování spamu
Vytvářejte systémy filtrování spamu pomocí porovnávání klíčových slov, validace domény a inteligentních metod detekce pro efektivní zabezpečení e-mailů.
Základní spamový filtr
Jednoduchá detekce spamu pomocí porovnávání klíčových slov a ověřování domény:
interface Env {
EMAIL: SendEmail;
EMAIL_ANALYTICS: AnalyticsEngine;
}
interface SpamFilter {
checkSpam(
message: any,
): Promise<{ isSpam: boolean; score: number; reasons: string[] }>;
}
class SimpleSpamFilter implements SpamFilter {
private spamKeywords = [
"buy now",
"limited time",
"act fast",
"click here",
"free money",
"guaranteed",
"risk free",
"urgent",
"winner",
"congratulations",
"inheritance",
"lottery",
];
private trustedDomains = ["example.com", "trusted-partner.com", "vendor.net"];
async checkSpam(
message,
): Promise<{ isSpam: boolean; score: number; reasons: string[] }> {
let score = 0;
const reasons = [];
const sender = message.from;
const subject = message.headers.get("subject") || "";
const senderDomain = sender.split("@")[1];
// Check sender domain
if (this.trustedDomains.includes(senderDomain)) {
score -= 2; // Trusted sender
}
// Check subject for spam keywords
const subjectLower = subject.toLowerCase();
for (const keyword of this.spamKeywords) {
if (subjectLower.includes(keyword)) {
score += 1;
reasons.push(`Spam keyword: ${keyword}`);
}
}
// Check for excessive capitalization
const capsRatio = (subject.match(/[A-Z]/g) || []).length / subject.length;
if (capsRatio > 0.7 && subject.length > 10) {
score += 1;
reasons.push("Excessive capitalization");
}
// Check for suspicious patterns
if (subject.includes("!!!") || subject.includes("$$$")) {
score += 1;
reasons.push("Suspicious punctuation");
}
// Check for suspicious sender patterns
if (
sender.includes("noreply") &&
subject.toLowerCase().includes("urgent")
) {
score += 2;
reasons.push("Suspicious noreply + urgent combination");
}
return {
isSpam: score >= 2,
score,
reasons,
};
}
}
const spamFilter = new SimpleSpamFilter();
export default {
async email(message, env, ctx): Promise<void> {
const startTime = Date.now();
// Check for spam
const spamCheck = await spamFilter.checkSpam(message);
// Track spam check metrics
env.EMAIL_ANALYTICS?.writeDataPoint({
blobs: [
"spam_check_completed",
message.from,
message.to,
spamCheck.isSpam ? "spam" : "legitimate",
],
doubles: [
1, // Count
spamCheck.score,
Date.now() - startTime,
],
indexes: [
`spam_detected:${spamCheck.isSpam}`,
`score_range:${getScoreRange(spamCheck.score)}`,
],
});
if (spamCheck.isSpam) {
console.log(
`Rejected spam email from ${message.from}: ${spamCheck.reasons.join(", ")}`,
);
message.setReject(`Message rejected: ${spamCheck.reasons[0]}`);
return;
}
// Add spam score headers and forward
const headers = new Headers();
headers.set("X-Spam-Score", spamCheck.score.toString());
headers.set("X-Spam-Reasons", spamCheck.reasons.join(", "));
headers.set("X-Spam-Check-Time", (Date.now() - startTime).toString());
await message.forward("[email protected]", headers);
},
};
function getScoreRange(score: number): string {
if (score < 0) return "trusted";
if (score === 0) return "neutral";
if (score === 1) return "suspicious";
return "spam";
}Pokročilá detekce spamu pomocí AI
Pro sofistikovanější detekci spamu můžete základní filtr rozšířit pomocí Workers AI k analýze obsahu e-mailů pomocí modelů strojového učení. Tento přístup dokáže odhalit jemné vzorce spamu, které mohou filtrům založeným na klíčových slovech uniknout.
Další kroky
- Email handler : reference pro
setReject()aforward()zde použitých akcí. - Zpracování hard bounce : detekujte oznámení o nedoručení, která často pocházejí ze spamové infrastruktury.
- Ukládání a zpracování e-mailů : zaznamenávejte filtrované e-maily do KV pro pozdější kontrolu.