KamoCRM

Outbound mail stops looking like spam: a plain-text part, a real Message-ID, no unreachable Reply-To, no zero-font spacers

FixEmailService
Shipped
October 29, 2026 at 4:02 AM UTC
Author
Kamo
Commit
a1c6ce3

rspamd's scan of 76 recent kamouniverse.com messages, fixed where each is built: - MIME_HTML_ONLY (75/76): every body is now multipart/alternative with a text/plain version first, read off the HTML when the caller wrote none (PlainTextRenderer: blocks as lines, links as "text (url)", images and hidden text left out). Inline images keep the standard nesting: mixed > alternative > [text/plain, related > [html, images]], then attachments. SmtpOnlyProvider now builds its body through MimeMessageFactory too instead of sending HTML alone. DKIM-signed and verified on the new shape in DkimSignerTest. - MID_RHS_NOT_FQDN (59/76): MimeMessageFactory.compose mints the Message-ID at the From's domain whenever the caller gives none, instead of Jakarta Mail's **************** pod-hostname default. Covers every NoReply, campaign and transactional send. - Bogus Reply-To **************** EmailTemplateService pointed replies at the org's NoReply whenever it sent from the platform, whatever the org's domain row was. It now does so only for an ownership-verified domain under a real public suffix (RoutableDomain, Guava's Public Suffix List), and compose drops any Reply-To address on any path whose domain mail cannot reach. - ZERO_FONT / MANY_INVISIBLE_PARTS: the canonical templates' colour bands and gaps are `font-size:0` cells holding an  . Rewritten at send time to font-size:1px (only cells whose whole content is  ), so org copies already in the database are covered. The article-share preheader uses the standard hidden pattern (mso-hide:all instead of opacity:0). Also maps WELCOME_SET_PASSWORD to the ACCOUNTS NoReply subsystem (stale test).

All changes

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing