Commit graph

65 commits

Author SHA1 Message Date
ff013fe694 refactor: handle DNS whitelists
Introduce a single DNSListChecker struct with flags to avoid code
duplication with already existing RBL checker.
2026-03-07 16:18:12 +07:00
28424729a5 rbl: support informational-only RBL entries
Add DefaultInformationalRBLs (UCEPROTECT L2/L3) and track listings
separately via RelevantListedCount so these broader lists are displayed
but excluded from the deliverability score calculation.
2026-03-07 14:24:35 +07:00
3cc39c9c54 rbl: add more RBL providers
Add 8 new RBL providers (SpamRats, PSBL, DroneBL, Mailspike, RBL-DNS
and NSZones).
2026-03-07 14:23:51 +07:00
4245f93ce4 Add MIME-Version recommended header check
Validate MIME-Version header value equals "1.0" and subtract 5 points
from the score if the header is present but invalid. Absence is not
penalized.
2026-03-07 12:14:53 +07:00
9679b381c7 fix: mark Message-ID as invalid when multiple headers are present
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-07 12:05:38 +07:00
e811d02b3b Add rspamd as a second spam filter alongside SpamAssassin
Some checks are pending
continuous-integration/drone/push Build is running
Closes: #36
2026-02-23 04:01:10 +07:00
8fda7746a1 Add one-click unsubscribe detection and warning
All checks were successful
continuous-integration/drone/push Build is passing
Detect the List-Unsubscribe-Post: List-Unsubscribe=One-Click header
(RFC 8058) and expose it as the 'one-click' unsubscribe method in the
content analysis. When unsubscribe methods are present but one-click is
absent, the summary card now shows a warning nudging senders to adopt it.
2026-02-23 00:15:17 +07:00
96e83ff70d Add multilingual unsubscribe keywords for link detection
The list comes from github.com/knadh/listmonk i18n strings

Bug: https://github.com/happyDomain/happydeliver/issues/8
2026-02-23 00:15:17 +07:00
6b983f0506 Use List-Unsubscribe header URLs for unsubscribe link detection
Bug: https://github.com/happyDomain/happydeliver/issues/8
2026-02-23 00:15:17 +07:00
c50e18a347 Use modern Go slices.Contains and switch instead of if/else if 2026-02-23 00:15:17 +07:00
d81ff1731c Fix tests 2025-11-17 10:31:04 +07:00
eef6480e75 Refactor DNS resolution: create an interface to have multiple implementations 2025-11-17 10:15:55 +07:00
e05c6d0bc2 Fix calculateTextPlainConsistency algorithm 2025-11-14 12:55:16 +00:00
2172603ad5 content: Add spaces behind each node to reduce gap with plain text
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-11-07 15:14:15 +07:00
deb9fd4f51 Handle RFC6652
All checks were successful
continuous-integration/drone/push Build is passing
Closes: https://framagit.org/happyDomain/happydeliver/-/issues/1
2025-11-07 14:09:05 +07:00
5b179e7b93 Domain alignment checks for DKIM 2025-11-03 14:58:48 +07:00
465da6d16a Don't look at original DKIM keys headers 2025-11-03 14:58:23 +07:00
1c4eb0653e Don't alert on missing -all on included SPF records
All checks were successful
continuous-integration/drone/push Build is passing
2025-11-01 17:57:57 +07:00
bc6a6397ad New route to check blacklist only 2025-10-31 11:15:15 +07:00
718b624fb8 Add domain only tests 2025-10-31 11:15:15 +07:00
90dda126ad Don't consider mailto as suspiscious, search domain alignment 2025-10-30 14:10:42 +07:00
20fe4e5b97 Improve SPF record validation and include error message
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-30 10:34:24 +07:00
f0dbc29da4 Handle multiple dkim authentication-results 2025-10-30 10:03:46 +07:00
8769514f1c Don't deduce point on weak SPF all qualifier, when DMARC is configured
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-28 11:42:23 +07:00
871f4e62f6 Fix content scoring error
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-27 17:56:06 +07:00
86ec7a6100 By default, only check the first IP against RBL, not all chain 2025-10-27 17:56:06 +07:00
932bc981b5 Filter Authentication-Results to keep only local ones 2025-10-25 03:36:34 +07:00
52f43c6bc5 Add x-align-form authentication test 2025-10-25 03:31:29 +07:00
3ea958b2fd Split dns.go in one file per check 2025-10-25 03:31:29 +07:00
a700db0873 Split authentication.go in one file per check 2025-10-25 03:31:29 +07:00
115da72874 Handle x-google-dkim authentication result 2025-10-25 03:31:29 +07:00
255027d00b Start bad spam score to B 2025-10-25 03:31:29 +07:00
9970e957d5 Handle SPF redirect 2025-10-25 03:31:29 +07:00
8fe8581b78 Handle declined auth result 2025-10-25 03:31:29 +07:00
aa35ab223d Align no DMARC authentication with on DMARC DNS record: grade C 2025-10-25 03:31:29 +07:00
29cb2cf1f9 Headers value for Date and email related are now parsed 2025-10-25 03:31:29 +07:00
7ed347c86e Improve test display in some circonstancies 2025-10-25 03:31:29 +07:00
4bbba66a81 Handle local postfix delivery 2025-10-25 03:31:29 +07:00
c1063cb4aa Add iprev check 2025-10-25 03:31:29 +07:00
3d03bfc4fa Handle relaxed domain match 2025-10-25 03:31:29 +07:00
84a504d668 Add reverse lookup and forward confirmation 2025-10-25 03:31:29 +07:00
7bc7e7b7a2 Reuse domain extractes from headers 2025-10-25 03:28:44 +07:00
326abc0744 Detect SPF all mechanism 2025-10-25 03:28:44 +07:00
e5c678174c Comprehensive DMARC record checks 2025-10-25 03:28:44 +07:00
5d335c6a6c Add email-path checks 2025-10-25 03:28:44 +07:00
8ca4bed875 SPF check return-path 2025-10-24 09:56:35 +07:00
f6a1ea73a2 Check SPF include 2025-10-24 09:56:35 +07:00
a64b866cfa Add grades 2025-10-24 09:56:35 +07:00
33d394a27b Improve content analyzing and reporting 2025-10-23 18:09:23 +07:00
41013d8af2 Improve headers reporting 2025-10-23 18:09:23 +07:00