Bug fixes
- An SMTP TLS (RFC 8460) failure report whose
failure-detailsentry sends an empty string for an optional field — e.g."sending-mta-ip": ""and"receiving-ip": "", which real reporters send for results likests-policy-fetch-error— no longer crashes the PostgreSQL save._parse_smtp_tls_failure_details()copied every optional field verbatim whenever the JSON key was present, so an empty string reached the PostgreSQLsending_mta_ip/receiving_ipINETcolumns and failed withinvalid input syntax for type inet: "", discarding the whole report. The same blank values would also have crashed the Elasticsearch and OpenSearch saves: those outputs'sending_mta_ip/receiving_ipfields are IP-typed (Ip()inelastic.py/opensearch.py), andDocument.save()'s validation pass rejects an empty string for anIp()field with a bareValueError—'' does not appear to be an IPv4 or IPv6 address— raised before any network call, so the whole report was lost rather than indexed with an empty IP. ANoneor blank/whitespace-only value for any optional failure-detail field (sending-mta-ip,receiving-ip,receiving-mx-hostname,receiving-mx-helo, the additional-information URI,failure-reason-code) is now treated as absent, so it is stored asNULLrather than''. (Closes #915) - The RFC 8460 §4.4
additional-informationfailure-details key is now read. The JSON Report Schema names the keyadditional-information(its value is described by the placeholderadditional-info-uri), but the parser only read the non-RFC keyadditional-info-uri, so a conformant reporter's URI was silently dropped — including in the RFC's own worked example,samples/smtp_tls/rfc8460.json. The non-RFCadditional-info-urikey is still read as a fallback for backward compatibility, and is used when the RFC key is absent or blank.