Forward Email

بنت Forward Email، خدمة البريد الإلكتروني مفتوحة المصدر التي تركّز على الخصوصية، Spam Scanner لخوادم بريدها. لا تحتفظ Forward Email بأي سجلات لمحتوى الرسائل، فلم تكن أي خدمة ترشيح خارجية مناسبة: كان على المرشِّح أن يعمل على خوادمها، وأن يشرح كل قرار دون أن يقرأ أي شخص البريد.

تعرض هذه الصفحة كيف يستخدمه خادم بريد مثل خادم Forward Email، وما الذي تغيّر للشيفرة المكتوبة لـ Spam Scanner 5 أو 6.

على خادم بريد وارد#

تستقبل Forward Email البريد باستخدام smtp-server. النمط، لأي خادم مبني عليه:

JavaScript
const SpamScanner = require('spamscanner');

const scanner = new SpamScanner({
  clamav: true,                  // clamd on its default socket
  authentication: true,          // SPF, DKIM, DMARC, ARC
  dnsbl: {ip: ['zen.spamhaus.org'], domain: ['dbl.spamhaus.org']},
  dns: {servers: ['127.0.0.1']}, // a local caching resolver
});

async function onData(stream, session, callback) {
  const scan = await scanner.scan(stream, {
    session: {
      remoteAddress: session.remoteAddress,
      resolvedClientHostname: session.clientHostname,
      helo: session.hostNameAppearsAs,
      envelope: session.envelope,
    },
  });

  if (scan.results.viruses.length > 0) {
    return callback(Object.assign(new Error(`Message contains a virus: ${scan.results.viruses[0]}`), {responseCode: 554}));
  }

  if (scan.action === 'reject') {
    // A temporary error: the sender retries, and a wrong decision can be undone.
    return callback(Object.assign(new Error(`Message rejected as spam: ${scan.message}`), {responseCode: 421}));
  }

  // scan.isSpam: deliver to the Junk folder, or add scan's headers (spamHeaders) and forward.
  callback();
}

تقبل scanner.scan() تدفق SMTP مباشرة. إذا كانت نتائج mailauth متاحة لديك مسبقًا، فتخطَّ authentication ومرّر عنوان IP فقط.

الرد بـ 421 أو 451 يجعل الخادم المرسل يضع الرسالة في الطابور ويعيد المحاولة لاحقًا. يمكن أن تبدأ قواعد الرفض الجديدة برمز مؤقت ثم تنتقل إلى 550 بعد التحقق من نتائجها، دون فقدان أي بريد في الأثناء.

الترقية من الإصدار 5 أو 6#

الإصدار 7 إعادة كتابة كاملة. المُنشئ وscan() وحقول النتيجة التي تقرؤها شيفرة الإصدارين 5 و6 ما زالت تعمل؛ أما المصنِّف والنموذج وفحوص TensorFlow الاختيارية فقد تغيّرت.

ما بقي كما هو#

  • new SpamScanner(options) وawait scanner.scan(source).
  • تُرجع require('spamscanner') الصنف، وimport SpamScanner from 'spamscanner' تعمل.
  • result.isSpam، وresult.message، وresult.results.classification و.phishing و.executables و.arbitrary و.viruses و.macros و.idnHomographAttack.
  • يتحوّل كل عنصر في results.phishing و.executables و.arbitrary و.viruses إلى النوع نفسه من سلاسل الرسائل كما في السابق (String(item)، والقوالب النصية، وmessage.includes('adult-related content')). وهي الآن كائنات لها type وmessage وتفاصيل.
  • getTokensAndMailFromSource() وgetClassification() وgetTokens().
  • تُربط هذه الخيارات بأسمائها الجديدة: clamscan إلى clamav، وenableMacroDetection: false إلى macros: false، وenableArbitraryDetection: false إلى arbitrary: false، وenableAuthentication مع authOptions إلى authentication وsession، وenableReputation مع reputationOptions.apiUrl إلى reputation، وstrictIDNDetection إلى phishing.homograph.strictMode، وallowlist وdenylist. يُقبل logger وmemoize ويُتجاهلان.

ما تغيّر#

سابقًاالآن
كانت scan('path/to/file.eml') تقرأ الملفالسلسلة النصية نص رسالة. استخدم scanFile(path) أو مرّر Buffer
نموذج Bayes بسيط للكلمات (classifier.json)، لا يمكن تحميله الآنمصنِّف جديد وصيغة نموذج جديدة؛ أعد التدريب باستخدام spamscanner train (التدريب)
كانت فحوص المحتوى المسيء وNSFW تحمّل نماذج TensorFlow من الشبكة عند أول استخدامأحضر نموذجك: يأخذ toxicity: {model} وnsfw: {model} أي كائن له دالة classify()، مثل @tensorflow-models/toxicity وnsfwjs
كانت results.arbitrary تسرد كل نمط تطابقتسرد القواعد القوية بما يكفي لوسم البريد بأنه مزعج وحدها؛ كل القواعد موجودة في result.tests
إجابة بنعم أو لاresult.score وresult.action (accept أو tag أو reject) وresult.tests، ولكل منها نقاط وسبب
كان isSpam يُحدَّد بالمصنِّف أو بأي فحص منفردisSpam درجة 5 أو أكثر؛ ويمكن تغيير العتبات والنقاط
فحوص السمعة مقابل نقطة نهاية لدى Forward Emailخدمة سمعة عامة، معطّلة ما لم يُضبط reputation.apiUrl

الجديد#

  • نماذج لغوية للحالات المتقاربة، محلية أو مستضافة.
  • SPFSender Policy Framework: سجل DNS يسرد الخوادم المسموح لها بإرسال البريد باسم نطاق. وDKIM وDMARC وARC؛ وقوائم حظر DNS؛ ومحلِّلات Cloudflare الترشيحية.
  • فحوص المرفقات بحسب المحتوى: الملفات التنفيذية المتنكّرة، والأرشيفات، ووحدات الماكرو، وملفات PDF النشطة.
  • milter وHTTP API وخادم TCP وخادم spamd، وسطر أوامر.
  • التدريب، والتقييم، والتعلّم من التقارير، من سطر الأوامر أو من API.

عدّل هذه الصفحة على GitHub · Markdown ·