{"_id":"@bobfromarcher/mailward","name":"@bobfromarcher/mailward","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@bobfromarcher/mailward","publishConfig":{"access":"public"},"version":"1.0.0","description":"Audit a domain's email authentication and deliverability: MX, SPF (with recursive lookup counting), DKIM, DMARC, MTA-STS and BIMI, scored with concrete fixes. Zero dependencies.","bin":{"mailward":"bin/mailward.js"},"main":"bin/mailward.js","scripts":{"test":"node test/test.js","start":"node bin/mailward.js"},"keywords":["email","deliverability","spf","dkim","dmarc","dns","mx","mta-sts","bimi","authentication","security","audit","cli","zero-dependency","devtools"],"author":{"name":"bobfromarcher"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/bobfromarcher/mailward.git"},"bugs":{"url":"https://github.com/bobfromarcher/mailward/issues"},"homepage":"https://github.com/bobfromarcher/mailward#readme","engines":{"node":">=16"},"gitHead":"114806263e2a5fc525cee7865e364e64430b947a","_id":"@bobfromarcher/mailward@1.0.0","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-AnPlcPwDiEmLaIyHrBrYjQNC3pGS2drMUbBuYCJTFCtdV0RjhIv23pw8OXfzfvXdlGuxptwxcaESqgcicRYABg==","shasum":"e937b79ea348f4bfa65cd10ec49e910f75967ba3","tarball":"https://registry.npmjs.org/@bobfromarcher/mailward/-/mailward-1.0.0.tgz","fileCount":4,"unpackedSize":16885,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE1tVRwwPDmKXQhgwTBMXx1pCpiFwZfDbDfFszNCkaEQAiBqH+Qb9GuF9u93B7hlHvwnZDP/7eZ0mO7RILPZefKCYQ=="}]},"_npmUser":{"name":"bobfromarcher","email":"chrisbellth@gmail.com"},"directories":{},"maintainers":[{"name":"bobfromarcher","email":"chrisbellth@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mailward_1.0.0_1781950817662_0.1053087339931762"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-20T10:20:17.521Z","1.0.0":"2026-06-20T10:20:17.801Z","modified":"2026-06-20T10:20:17.985Z"},"maintainers":[{"name":"bobfromarcher","email":"chrisbellth@gmail.com"}],"description":"Audit a domain's email authentication and deliverability: MX, SPF (with recursive lookup counting), DKIM, DMARC, MTA-STS and BIMI, scored with concrete fixes. Zero dependencies.","homepage":"https://github.com/bobfromarcher/mailward#readme","keywords":["email","deliverability","spf","dkim","dmarc","dns","mx","mta-sts","bimi","authentication","security","audit","cli","zero-dependency","devtools"],"repository":{"type":"git","url":"git+https://github.com/bobfromarcher/mailward.git"},"author":{"name":"bobfromarcher"},"bugs":{"url":"https://github.com/bobfromarcher/mailward/issues"},"license":"MIT","readme":"# mailward\n\n[![npm](https://img.shields.io/npm/v/@bobfromarcher/mailward?color=cb3837&logo=npm)](https://www.npmjs.com/package/@bobfromarcher/mailward)\n[![CI](https://github.com/bobfromarcher/mailward/actions/workflows/ci.yml/badge.svg)](https://github.com/bobfromarcher/mailward/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/@bobfromarcher/mailward?color=blue)](LICENSE)\n[![zero deps](https://img.shields.io/badge/dependencies-0-success)](package.json)\n\nAudits a domain's email authentication and deliverability. It queries live DNS and checks MX, SPF, DKIM, DMARC, MTA-STS and BIMI, then scores the domain from 0 to 100 with a letter grade and a list of concrete fixes. No dependencies, no AI. Because it reads real DNS records, the result is the same every time you run it.\n\nThis is the kind of check every business should run on its sending domains. Bad SPF or a `p=none` DMARC policy is why legitimate mail lands in spam and why spoofing succeeds.\n\n<p align=\"center\"><img src=\"demo.svg\" alt=\"mailward auditing a domain\" width=\"560\"></p>\n\n## Install\n\n```bash\nnpm install -g @bobfromarcher/mailward\n# or once:\nnpx @bobfromarcher/mailward example.com\n```\n\n## Usage\n\n```bash\nmailward <domain> [options]\n```\n\n| Option | Description |\n| --- | --- |\n| `--selector <name>` | Extra DKIM selector to probe (repeatable) |\n| `--timeout <ms>` | DNS query timeout (default 5000) |\n| `--json` | Output JSON |\n| `--quiet`, `-q` | No output, exit code only |\n| `-h, --help` | Show help |\n| `-v, --version` | Show version |\n\nThe exit code is 0 for grade A or B and 1 for C or worse, so you can gate a deploy or a monitoring job on it.\n\n## What it checks\n\n- **MX**: the domain can receive mail.\n- **SPF**: a single valid `v=spf1` record, the `all` qualifier (`-all` is strict, `+all` is dangerous), and the recursive DNS lookup count. More than 10 lookups is a PermError that silently breaks SPF, and mailward follows `include` and `redirect` to count them properly.\n- **DKIM**: probes common selectors (Google, Microsoft 365, Mailchimp, Zoho and more). Add your own with `--selector`.\n- **DMARC**: presence, policy strength (`none`, `quarantine`, `reject`), and whether aggregate reporting is set up.\n- **MTA-STS** and **BIMI**: reported as bonuses.\n\n## As a library\n\n```js\nconst { audit } = require('@bobfromarcher/mailward');\n\nconst report = await audit('example.com');\nconsole.log(report.grade, report.score);\nfor (const check of report.checks) {\n  if (check.status !== 'pass') console.log(check.title, check.fix);\n}\n```\n\n`audit(domain, opts)` accepts an injected `resolver` (with `txt` and `mx` methods), which makes it easy to test without touching the network.\n\n## Examples\n\n```bash\nmailward stripe.com\nmailward example.com --selector mycustom\nmailward example.com --json | jq '.grade'\n```\n\n## Notes\n\nmailward reports on DNS-level authentication. It does not send mail or check the reputation of a specific sending IP, which depends on your traffic. Pair it with your provider's reports and with DMARC aggregate data for a full picture.\n\n## Development\n\n```bash\ngit clone https://github.com/bobfromarcher/mailward\ncd mailward\nnode test/test.js\n```\n\nCI runs the suite on Node 18, 20 and 22 across Linux, macOS and Windows.\n\n## License\n\nMIT, bobfromarcher.\n","readmeFilename":"README.md","_rev":"1-7fe4a89fa23b3cb495bcdf0d1eb5bb7a"}