명령줄

Text
spamscanner <command> [options]
명령하는 일
scan [file|-]파일이나 표준 입력의 메시지를 검사합니다
filter -f <sender> -- <recipients...>Postfix 콘텐츠 필터: 표준 입력을 검사하고 헤더를 추가해 넘겨줍니다
milterPostfix와 Sendmail용 milter, 포트 7831
httpHTTP API, 포트 7832
server일반 TCP 서버, 포트 7830
spamdSpamAssassin 호환 spamd 서버, 포트 783
trainmbox 파일, Maildir, 폴더, 데이터 세트로 모델을 학습합니다
eval레이블이 붙은 메일로 모델 성능을 측정합니다
learn spam|ham [file|-] --model <file>모델에 메시지 하나를 학습시킵니다
llm-test샘플 메시지 세 개로 언어 모델 설정을 확인합니다
models권장 공개 모델 목록을 표시합니다
version, help

scan#

Shell
spamscanner scan message.eml
spamscanner scan - < message.eml
spamscanner scan message.eml --json
spamscanner scan message.eml --headers > tagged.eml
spamscanner scan message.eml --subject-tag "[SPAM]" > tagged.eml
옵션의미
--json전체 결과를 JSON으로 출력합니다
--headersX-Spam-* 헤더를 추가한 메시지를 출력합니다
--subject-tag <tag>스팸의 제목 앞에도 태그를 붙입니다
--verbose모든 테스트와 분류기의 가장 강한 단서를 표시합니다
--threshold <n>메일을 스팸으로 판정하는 점수(기본값 5)
--reject-threshold <n>메일을 거부하는 점수(기본값 15)
--model <file>번들 모델 대신 사용할 모델 파일
--no-classifier분류기를 사용하지 않습니다
--config <file>라이브러리 옵션을 담은 JSON 파일
--allow-language <codes>허용할 언어. 예: en,de,fr

종료 코드: 0은 ham받기를 원하는 메일: 스팸의 반대입니다., 1은 스팸, 2는 오류.

SMTP 세션#

옵션의미
--ip <address>메시지를 보낸 클라이언트의 IP 주소
--hostname <name>클라이언트의 검증된 역방향 DNS 이름
--helo <name>클라이언트가 HELO 또는 EHLO에서 밝힌 이름
--from <address>엔벌로프 발신자(MAIL FROM)
--to <address>엔벌로프 수신자. 여러 명이면 반복합니다

검사#

옵션의미
--authSPF, DKIM, DMARC, ARC를 검사합니다(--ip 필요)
--dnsbl <zone>IP 차단 목록. 예: zen.spamhaus.org. 반복 가능
--uribl <zone>링크용 도메인 차단 목록. 예: dbl.spamhaus.org. 반복 가능
--dns-server <ip>DNS 검사에 쓸 네임 서버. 반복 가능
--no-cloudflare링크를 Cloudflare의 필터링 리졸버에 조회하지 않습니다
--clamav [socket]기본 소켓 또는 지정한 소켓의 clamd로 첨부 파일을 검사합니다
--allowlist <value>이 IP 주소, 도메인 또는 주소를 항상 수락합니다. 반복 가능
--denylist <value>이 IP 주소, 도메인 또는 주소를 항상 거부합니다. 반복 가능

언어 모델#

옵션의미
--llm <provider>ollama, clef-flash, jev, openai, anthropic 등(목록)
--llm-model <name>모델. 예: qwen3.5:4b 또는 claude-haiku-4-5
--llm-method <method>decision(한 단계로 각 판정의 확률을 얻음. 지원되는 곳에서는 기본값) 또는 generate(방식)
--llm-account <id>clef와 clef-flash에 쓰는 Cloudflare 계정 ID
--llm-url <url>기본 URL. 예: http://10.0.0.5:11434
--llm-host, --llm-port, --llm-path, --llm-protocol제공자 URL의 일부만 변경합니다
--llm-api-key <key>API 키. 아래 환경 변수도 참고하십시오
--llm-auth <type>bearer, x-api-key, api-key, basic, header 또는 none
--llm-auth-header <name>--llm-auth header 사용 시 키를 담을 헤더
--llm-username, --llm-password--llm-auth basic용
--llm-header "Name: value"추가 요청 헤더. 반복 가능
--llm-mode <mode>auto(애매한 메시지만, 기본값) 또는 always
--llm-timeout <ms>기본값 30000
--llm-policy <text>모델에 줄 추가 규칙. 예: "당사는 청구서를 이메일로 보내지 않습니다"
--llm-redact, --no-llm-redact먼저 개인 데이터를 제거합니다. 원격 제공자에게는 기본으로 켜져 있습니다

filter#

Postfix 콘텐츠 필터입니다. 표준 입력에서 메시지를 읽고, X-Spam-* 헤더를 추가한 뒤, 같은 엔벌로프로 sendmail에 넘겨줍니다.

Shell
spamscanner filter -f "$sender" -- "$recipient"
옵션의미
--sendmail <path>기본값 /usr/sbin/sendmail
--subject-tag <tag>스팸의 제목 앞에 태그를 붙입니다
--reject거부 임계값에 이른 메일을 넘겨주지 않고 반송합니다
--discard거부 임계값에 이른 메일을 넘겨주지 않고 버립니다

종료 코드는 Postfix가 읽는 sendmail의 규칙을 따릅니다. 0은 전달(또는 폐기), 64는 수신자 미지정, 69는 스팸으로 거부(Postfix가 반송), 75는 모든 종류의 실패로, 이 경우 Postfix가 메시지를 보관하고 나중에 다시 시도합니다.

milter, http, server, spamd#

Shell
spamscanner milter --port 7831 --reject --subject-tag "[SPAM]"
spamscanner http --port 7832 --token "$SPAMSCANNER_TOKEN"
spamscanner server --port 7830
spamscanner spamd --port 783

포트 783은 SpamAssassin 클라이언트가 기본으로 쓰는 포트입니다. 1024 미만 포트에는 root 권한이나 CAP_NET_BIND_SERVICE 기능이 필요합니다. --port 7833처럼 다른 포트를 사용하고 클라이언트에 알려 주십시오.

옵션의미
--port <n>TCP 포트
--host <ip>수신할 주소(기본값 127.0.0.1)
--socket <path>대신 Unix 소켓에서 수신합니다
--rejectmilter: 거부 임계값에 이른 메일을 거부합니다
--reject-code <n>milter: 451(나중에 다시 시도, 기본값) 또는 550
--quarantinemilter: 스팸을 메일 서버의 격리 영역에 보류합니다
--name <hostname>milter: Authentication-Results에 쓸 이 서버의 이름
--token <secret>HTTP: Authorization: Bearer <secret>을 요구합니다. /learn에 필요
--allow-tellspamd: 학습용 TELL 요청(spamc -L spam)을 받습니다
--out <file>HTTP와 spamd: 학습한 내용을 이 모델 파일에 저장합니다
--subject-tag <tag>milter와 spamd: 스팸의 제목 앞에 태그를 붙입니다
--verbosemilter: 모든 검사를 기록합니다. TCP 서버: 텍스트 한 줄로 응답합니다

위의 검사 옵션은 서버에도 적용됩니다. milter, HTTP API, TCP 서버, spamd.

train, eval, learn#

Shell
spamscanner train --spam ~/Mail/Junk --ham ~/Mail/Archive --out my-model.json
spamscanner eval --model my-model.json --spam test/spam.mbox --ham test/ham.mbox
spamscanner learn spam message.eml --model my-model.json
옵션의미
--spam <path>스팸: mbox 파일, Maildir 또는 .eml 파일이 든 폴더. 반복 가능
--ham <path>ham: 위와 같음. 반복 가능
--dataset <file>텍스트 열과 레이블 열이 있는 CSV 또는 JSON Lines 파일. 반복 가능
--text-column <name>, --label-column <name>자동으로 감지되지 않을 때 지정할 열 이름
--out <file>모델을 기록할 위치(기본값 spamscanner-model.json)
--merge빈 모델 대신 번들 모델(또는 --model)에서 시작합니다

learn은 모델 파일을 그 자리에서 갱신하며, 처음에는 번들 모델로 파일을 만듭니다. 학습

llm-test와 models#

Shell
spamscanner models
spamscanner llm-test --llm ollama --llm-model qwen3.5:4b

llm-test는 평범한 메시지 하나와 영어·이탈리아어 사기 메시지 두 개를 모델에 보내 판정, 각각에 걸린 시간, 사용한 방식, 하드웨어를 출력하고, 세 판정이 모두 맞을 때만 0으로 종료합니다.

설정 파일#

--config file.json(또는 SPAMSCANNER_CONFIG 환경 변수)은 라이브러리 옵션을 불러옵니다. 명령줄 옵션이 파일보다 우선합니다.

JSON
{
  "threshold": 6,
  "authentication": true,
  "dnsbl": {"ip": ["zen.spamhaus.org"], "domain": ["dbl.spamhaus.org"]},
  "dns": {"servers": ["127.0.0.1"]},
  "clamav": {"socket": "/var/run/clamav/clamd.ctl"},
  "llm": {"provider": "ollama", "model": "qwen3.5:4b"},
  "scores": {"deceptiveLink": 4, "FROM_NAME_BRAND": 3}
}

환경 변수#

변수의미
SPAMSCANNER_CONFIG설정 파일
SPAMSCANNER_MODEL번들 모델 대신 사용할 모델 파일
SPAMSCANNER_TOKENHTTP API용 토큰
SPAMSCANNER_LLM_API_KEY모든 언어 모델 제공자에 쓰는 API 키
CLOUDFLARE_API_TOKEN과 CLOUDFLARE_ACCOUNT_ID, TYPESAFE_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY, OPENROUTER_API_KEY, DEEPSEEK_API_KEY, XAI_API_KEY, TOGETHER_API_KEY, FIREWORKS_API_KEY, CEREBRAS_API_KEY, HF_TOKEN, AZURE_OPENAI_API_KEY각 제공자의 자체 키
NODE_DEBUG=spamscanner*디버그 로그

GitHub에서 이 페이지 편집 · Markdown ·