All notable changes to mailvalidator are documented in this file.
Format follows Keep a Changelog. Version numbers follow Semantic Versioning.
checks/smtp/_pqc: new_check_pqc_certificatecheck — detects whether the mail server certificate uses a post-quantum signature algorithm (ML-DSA, SLH-DSA, FN-DSA) by parsing thesignatureAlgorithmOID against NIST FIPS 204/205 and provisional IETF/OQS OIDs. Classical certs (RSA/ECDSA) yieldINFO— no grade penalty since PQC certs are not yet widely issued by public CAs. OID table (_PQC_SIG_OIDS) exported for tests and external consumers.checks/smtp/_tls_probe: TLS 1.3 key-exchange group detection via pyOpenSSL (SSL_get0_group_name). A dedicated STARTTLS probe usingOpenSSL.SSL.Connectionruns as a fallback when the stdlibsslmodule does not expose the group (current Python/OpenSSL builds).pyopenssl>=24.3added as a runtime dependency.
0.1.8 — 2026-05-15
mailvalidator/constants.py— new module exposingSMTP_DEFAULT_PORT,DNS_TIMEOUT,SMTP_TIMEOUT, andHTTP_TIMEOUTconstants, consistent with the platform-wideconstants.pyconvention.pytest-mock>=3.12added to dev extras.
models:FullReportdeprecated alias removed; useMailReportdirectly.assessor:assess()parameters after the first positional are now keyword-only (enforced by*,); logger moved below all imports to fix E402 linting errors.cli:checkcommand gains a--timeout / -Toption (default5.0 s); exit code1is now raised when the calculated grade is D or F.reporter: console renamed to private_consolewith a public alias;Consolecreated withhighlight=False; allprint_*functions accept*, console: Console | None = None;save_report()always writes from_console.print_verdictsignature changed from(actions, grade)to(report, *, console=None)— verdict actions and grade are now extracted internally, consistent with all other platform modules.verdict:VerdictSeveritygainsLOW(1 pt penalty) andINFO(0 pt penalty) members, aligning the enum withheadersvalidator.
0.1.7 — 2026-05-15
__init__: addedNullHandleron the"mailvalidator"logger so library users do not see spurious "No handler found" warnings (consistent with all other platform modules).- CLI: internal variable
as_jsonrenamed tojson_outputacross all sub-commands, aligning with the platform-wide naming convention.
0.1.6 — 2026-04-30
- PQC Key Exchange check — the TLS section now reports post-quantum
cryptography readiness for each SMTP server. Uses the vendored
quantumvalidatormodule (same pattern aschainvalidator) to probe whether a PQC hybrid key exchange group (e.g. X25519MLKEM768) was negotiated. Result status:GOOD(PQC-ready),WARNING(classical key exchange only), orINFO(probe unavailable — requires OpenSSL ≥ 3.0). Appears as a MEDIUM verdict action when the server is not PQC-ready. quantumvalidatorvendored dependency — added as a git submodule undervendor/quantumvalidator(CNSA 2.0, BSI TR-02102-2 standards).
0.1.5 — 2026-04-29
- SMTP port fallback — when port 25 is refused, times out, or drops the connection after the TCP handshake (banner-read timeout), the tool now automatically retries on port 587 (RFC 6409 Mail Submission) and then port 465 (RFC 8314 Implicit-TLS SMTP) before reporting failure.
- New
SMTP Port Fallback(INFO) check result records which fallback port was actually used, visible in both the terminal report and--jsonoutput.
smtplib.SMTPServerDisconnectedexceptions (e.g. "Connection unexpectedly closed: timed out") now correctly trigger the port fallback instead of failing immediately without retrying.
check_smtpdocstring updated to document the automatic port-retry behaviour.SMTP ConnectCRITICAL entry indocs/SECURITY_VERDICT.mdupdated to describe the three-port probe sequence; newSMTP Port FallbackINFO entry added.README.mdSMTP check section updated to describe the port fallback.
TestConnectOrFallback— 8 new unit tests covering all fallback branches: primary success, fallback to 587, fallback to 465, all-ports-fail, non-refusalOSError(no retry),TimeoutError,SMTPServerDisconnected, and empty-fallback-tuple guard.
0.1.4 — 2026-04-08
--jsonflag on all CLI sub-commands (check,smtp,spf,dmarc,dkim,bimi,tlsrpt,mta-sts,blacklist,dnssec) — prints the full result as machine-readable JSON to stdout.
- Verdict panel no longer emits cipher-suite or cipher-order action items for deprecated TLS versions (TLS 1.0/1.1); those issues are already covered by the TLS-version action.
- Repository moved to the NC3-TestingPlatform GitHub organisation; all internal URLs updated.
vendor/chainvalidatordeclared as a local path dependency inpyproject.toml.
0.1.3 — 2026-03-30
docs/SECURITY_VERDICT.md— CISO-facing reference explaining the penalty-point grading model and the rationale for each check's severity.
- Terminal reporter: check tables wrapped in Rich panels with
ROUNDEDstyle; inner SMTP section panels usebright_white/whitecolour scheme for readability. - Security Verdict panel aligned with headersvalidator style (consistent cross-tool look).
0.1.0 — 2026-03-13
- Initial release of mailvalidator.
- Checks: MX records, SPF, DMARC, DKIM base node, BIMI, TLSRPT, MTA-STS, SMTP diagnostics (Protocol, TLS, Certificate, DNS sections), 104 DNSBL blacklist zones, DNSSEC chain-of-trust.
- Deep TLS inspection: TLS 1.0–1.3 version probing, 34 cipher suites graded per NCSC-NL guidelines, cipher order enforcement, ECDHE/DHE/RSA key exchange, CRIME compression, RFC 5746 renegotiation.
- DNS checks per MX server: reverse PTR, CAA, DANE/TLSA.
- CLI entry points:
mailvalidator check,mailvalidator smtp,mailvalidator spf,mailvalidator dmarc,mailvalidator dkim,mailvalidator bimi,mailvalidator tlsrpt,mailvalidator mta-sts,mailvalidator blacklist,mailvalidator dnssec. --outputflag for.txt/.svg/.htmlreport export.- 685 unit tests, 100% coverage.