尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Privacy-first email phishing analyzer SaaS
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Free, open-source phishing analysis for .eml files. Drop in a suspicious email and get a
verdict with the reasons behind it: SPF/DKIM/DMARC/ARC results, relay path, lookalike
domains, link and attachment checks, and content heuristics.
Every report includes an Investigation, the write-up a SOC analyst would produce: is it
phishing, is the sender spoofed (and why a matching Return-Path proves nothing), who really
sent it and from where, what it wants the recipient to do, why your defenses let it through,
role-labelled indicators, ATT&CK techniques, a response checklist, and ready-to-run Microsoft
Defender/Sentinel hunting and Purview purge queries. See docs/INVESTIGATION.md.
npx mxlens message.eml.MIT licensed.
Requires Node.js 20.9 or later.
git clone https://github.com/akmalmuhammed/mxlens.git
cd mxlens
npm ci
npm run build
npm start
Open http://localhost:3000/analyze and drop an .eml file (or try
public/samples/demo-phishing.eml).
For development: npm run dev.
npx mxlens suspicious.eml # readable report
npx mxlens --investigate suspicious.eml > case.md # full analyst write-up (Markdown)
npx mxlens --json reported-folder/ # JSON for every .eml in a folder
npx mxlens --fail-on malicious - < message.eml # exit code 2 if malicious
The CLI runs the same engine as the web app, entirely offline. See cli/README.md.
docker compose up -d --build
This serves MXLens on 127.0.0.1:3000. Put it behind your usual reverse proxy (with TLS) to
share it with a team.
Or run the published image:
docker run -d -p 127.0.0.1:3000:3000 ghcr.io/akmalmuhammed/mxlens:latest
None is required. All settings are optional environment variables; see
.env.example.
| Variable | Default | Effect |
|---|---|---|
MXLENS_ENRICHMENT | false | Enables server-side lookups of indicators extracted from emails. |
VIRUSTOTAL_API_KEY | VirusTotal reputation for IPs, domains and hashes. | |
ABUSEIPDB_API_KEY | AbuseIPDB reputation for IPs. | |
ABUSECH_API_KEY | MalwareBazaar and ThreatFox lookups. | |
GOOGLE_SAFE_BROWSING_KEY | Safe Browsing lookups for domains. | |
IPINFO_TOKEN | Higher rate limits for IP geolocation. |
| Enrichment off (default) | Enrichment on | |
|---|---|---|
| Email content, body, attachments | Stays in the browser | Stays in the browser |
| Public IPs, domains, attachment hashes | Stay in the browser | Sent by the server to the services above |
| Private IPs and internal hostnames | Stay in the browser | Filtered out, never sent |
The analyzer page states which mode the server is in. Enrichment endpoints are rate limited per client IP.
.eml ─► postal-mime (MIME parsing) ─► HeaderParser (auth results, hops, artifacts)
│
▼
AnalysisEngine
├─ HeaderScorer ├─ AttachmentScorer
├─ BodyScorer ├─ ImpersonationScorer / HomographDetector
├─ CrossContextScorer├─ DetectionPipeline (rules)
└─ Trust + Confidence ─► verdict with findings
The engine lives in src/lib/email and runs unchanged in the browser and in
Node.
npm run dev # local dev server
npm run test:run # unit tests
npm run typecheck # TypeScript
npm run lint # ESLint
npm run build:cli # bundle the CLI to cli/dist/mxlens.mjs
import { analyzeEmail } from "@/lib/email/analyze";
const result = await analyzeEmail(rawEml, { body: true, attachments: true });
result.verdict; // "clean" | "suspicious" | "malicious" | "unknown"
result.findings; // [{ reason, severity, impact, ... }]
MXLens is a triage aid, not an email security gateway. Verdicts are heuristic: expect some false positives and misses, and verify before acting. Reports with a sanitized sample are welcome.