צעדים ראשונים

Spam Scanner דורש Node.js 18 ומעלה, או שום דבר בכלל עם הקובץ הבינארי העצמאי.

התקנה#

ככלי שורת פקודה:

Shell
npm install --global spamscanner
spamscanner version

כספרייה בפרויקט Node.js:

Shell
npm install spamscanner

כקובץ בינארי עצמאי ל-Linux או ל-macOS, עם Node.js והמודל מובנים בו:

Shell
curl -fsSL https://github.com/spamscanner/spamscanner/releases/latest/download/install.sh | bash

קבצים בינאריים ל-Linux (x64 ו-arm64), ל-macOS (Intel ו-Apple silicon) ול-Windows מצורפים לכל גרסה.

סריקת הודעה#

יש לשמור הודעה כקובץ (רוב תוכנות הדואר קוראות לזה „שמירה בשם” או „הצגת המקור”) ולסרוק אותה:

Shell
spamscanner scan message.eml
Text
SPAM  score 16.3 (spam at 5.0, reject at 15.0)  action: reject  language: en
     +6.3  BAYES_999                    Classifier spam probability 99.9%
     +5.0  PHISHING_LOOKALIKE_DOMAIN    "paypa1-secure.top" imitates paypal by swapping characters
     +3.0  DECEPTIVE_LINK               A link shows "https://www.paypal.com/signin" but goes to paypa1-secure.top
     +2.0  FROM_NAME_BRAND              Display name says "paypal" but the message is from paypa1-secure.top

קוד היציאה הוא 0 ל-ham, 1 לספאם ו-2 לשגיאה, כך שסקריפטים יכולים להשתמש בו ישירות. --json מדפיס את התוצאה המלאה, ו---headers מדפיס את ההודעה עם כותרות X-Spam-* שנוספו לה.

הודעות יכולות להגיע גם מהקלט הסטנדרטי:

Shell
cat message.eml | spamscanner scan -

שימוש מתוך Node.js#

JavaScript
import SpamScanner from 'spamscanner';
import {readFile} from 'node:fs/promises';

const scanner = new SpamScanner();
const result = await scanner.scan(await readFile('message.eml'));

console.log(result.isSpam, result.score, result.action);
for (const test of result.tests) {
  console.log(test.name, test.score, test.description);
}

גם CommonJS עובד:

JavaScript
const SpamScanner = require('spamscanner');

scan() מקבלת את ההודעה הגולמית כ-Buffer, כמחרוזת, כ-Uint8Array או כזרם קריא. מחרוזת היא תמיד טקסט של הודעה: Spam Scanner לעולם לא קורא קובץ רק משום שמחרוזת נראית כמו נתיב. לקבצים יש להשתמש ב-scanner.scanFile(path).

מידע על שיחת ה-SMTP#

כתובת ה-IP של הלקוח, שם המארח המאומת שלו, שם ה-HELO והמעטפה הופכים את התוצאה למדויקת יותר: האימות צריך את כתובת ה-IP, וכלל הזיוף העצמי צריך את הנמענים.

JavaScript
const result = await scanner.scan(raw, {
  session: {
    remoteAddress: '203.0.113.5',
    resolvedClientHostname: 'mail.example.com',
    helo: 'mail.example.com',
    envelope: {
      mailFrom: {address: 'alice@example.com'},
      rcptTo: [{address: 'bob@example.org'}],
    },
  },
});

אותו הדבר משורת הפקודה:

Shell
spamscanner scan message.eml --ip 203.0.113.5 --helo mail.example.com \
  --from alice@example.com --to bob@example.org --auth

הפעלת בדיקות נוספות#

אף אחת מהבדיקות האלה לא מופעלת כברירת מחדל, כי כל אחת מהן צריכה שירות או החלטה:

בדיקהאפשרות בספרייהשורת הפקודה
SPF, DKIM, DMARC, ARCauthentication: true--auth
רשימה שחורה של IPdnsbl: {ip: ['zen.spamhaus.org']}--dnsbl zen.spamhaus.org
רשימה שחורה של דומיינים לקישוריםdnsbl: {domain: ['dbl.spamhaus.org']}--uribl dbl.spamhaus.org
ClamAVclamav: true או clamav: {socket}--clamav [socket]
מודל שפהllm: {provider: 'ollama', model: 'qwen3.5:4b'}--llm ollama
רשימות היתר וחסימהallowlist: [...], denylist: [...]--allowlist, --denylist

כברירת מחדל נשאלים שרתי ה-DNS המסננים של Cloudflare‏ (1.1.1.2 לנוזקות, 1.1.1.3 לתוכן למבוגרים) על המארחים שבקישורים. אפשר לכבות זאת עם phishing: {cloudflare: false} או --no-cloudflare. מה יוצא מהמחשב

Spamhaus ועוד כמה רשימות שחורות לא עונות לשאילתות שנשלחות דרך שרתי DNS ציבוריים כמו 8.8.8.8 או 1.1.1.1. יש להשתמש בהן עם שרת DNS מקומי עם מטמון, ולבדוק את תנאי השימוש שלהן בהתאם לנפח הדואר.

הצעדים הבאים#

עריכת הדף ב-GitHub · Markdown ·