# Node.js 垃圾邮件过滤库

```sh
npm install spamscanner
```

```js
import SpamScanner from 'spamscanner';

const scanner = new SpamScanner();
const result = await scanner.scan(rawMessage);

if (result.isSpam) {
  console.log(result.score, result.tests.map(test => test.name));
}
```

`scan()` 接受 Buffer、字符串、Uint8Array 或可读流，因此来自 smtp-server 的 SMTP 流可以直接传入。CommonJS 可通过 `require('spamscanner')` 使用，并且已包含 TypeScript 类型。


## 配合 smtp-server

```js
import {SMTPServer} from 'smtp-server';
import SpamScanner from 'spamscanner';

const scanner = new SpamScanner({authentication: true});

const server = new SMTPServer({
  async onData(stream, session, callback) {
    const result = await scanner.scan(stream, {
      session: {
        remoteAddress: session.remoteAddress,
        helo: session.hostNameAppearsAs,
        envelope: session.envelope,
      },
    });

    if (result.action === 'reject') {
      return callback(Object.assign(new Error('Message rejected as spam'), {responseCode: 451}));
    }

    callback();
  },
});
```


## 结果包含什么

每个结果都有分数、动作（`accept`、`tag` 或 `reject`）以及触发的测试，每项测试都附有分值和原因。详细结果包括分类器的概率和最强的线索、每一项钓鱼和附件发现、身份验证结果以及语言。


## 让它学习

```js
await scanner.learn(rawMessage, 'spam');
scanner.saveModel('./model.json');

const trained = new SpamScanner({classifier: './model.json'});
```


## 更多

* 服务器也会导出：`MilterServer`、`createHttpServer`、`createSpamdServer`。
* 语言模型：`new SpamScanner({llm: {provider: 'ollama', model: 'qwen3.5:4b'}})`。
* 在 Node.js 18、20、22 和 24 上测试，测试覆盖率 100%。

[API 参考](https://spamscanner.net/zh/docs/api/)
