使用关键词匹配、域名验证和智能检测方法构建垃圾邮件过滤系统,实现有效的邮件安全。
通过关键词匹配和域名验证实现简单的垃圾邮件检测:
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";
}若要获得更复杂的垃圾邮件检测能力,你可以使用 Workers AI 增强基础过滤器,通过机器学习模型分析邮件内容。这种方法可以识别基于关键词的过滤器可能遗漏的细微垃圾邮件模式。
- Email handler — 此处所用
setReject()和forward()操作的参考文档。 - Hard bounce handling — 检测通常源自垃圾邮件基础设施的退信通知。
- Email storage and processing — 将经过过滤的邮件记录到 KV 以供后续审查。