SOCL.cz
blog nejen o Internetu

Validní DKIM podpis s PHP fcí mail()? Jde to!

publikováno 25. 7. 2022 v 18:01

Úplnou náhodou jsem zjistil, že asi všechny e-maily, které zasílám přes PHP funkci mail(), nemají platný/validní DKIM podpis. Přitom jsou ale e-maily podepsány, wtf?

Valid VS Invalid DKIM signature

V práci teď dělám nějaké skripty na migraci našeho poštovního serveru. Drtivá většina těchto malých skriptíků je napsaná v PHP, protože je to pro mne jazyk jednoduchý/intuitivní a než něco vymyslím v linuxovém BASHi, dávno to mám obvykle hotovo v PHP na pár řádků kódu a přes CLI to jede i v konzoli. Udělal jsem skript, který posílá vybraným uživatelům z databáze e-mail s nějakými těmi informacemi. Dal jsem si záležet a tělo e-mailu naformátoval v HTML, ať to nějak vypadá. Pak jsem nechal tento výtvor pokusně prohnat přes mail-tester.com, abych viděl, co by šlo zlepšit. Jaký byl můj šok, když jsem zjistil, že výsledné skóre je jen 3.3/10 - docela humus, co. Ale primárně mne do očí uhodilo to, že dle jejich Spamassassinu nemá e-mail platný DKIM podpis. Napřed jsem si myslel, že jsem prostě nezaslal ty důležité hlavičky (To, Date, From...), u kterých je vyžadováno, aby se už v čase nezměnily. Tak ne, ty tam byly přítomny. A i když jsem je pro jistotu ještě ručně vložil navíc, jenom se ve výsledku zdvojily. E-mail s nevalidním DKIM podpisem jsem prohnal lokální instancí Spamassassinu - při debugu mi tento sdělil, že mám špatně tělo e-mailu. :-/

Nebudu Vás napínat - když jsem na to nemohl přijít, co tím jako Spamassassin myslí, začal jsem vylučovací metodou. Subjekt zprávy jsem zjednodušil na 3 běžné ASCII znaky, stejně tak tělo zprávy. Spustil, podepsal, odeslal, zkontroloval a výsledek byl validní DKIM podpis. Nastavil jsem původní subjekt (obsahuje diakritiku, kódování je v UTF-8) a znovu spustil, podepsal, odeslal, zkontroloval a výsledek je opět validní DKIM podpis! Takže máme viníka - opravdu je to tělo e-mailu. Takže nějak musím ošetřit ten obrovský řetězec, který obsahuje plno textu a HTML formátování. Po chvilce hledání na netu, trošku toho bádání a pár pokusů a omylů jsem přišel na tohle řešení:

$hlavicka = 'MIME-Version: 1.0'."\r\n";
$hlavicka .= 'Content-Type: text/html; charset=utf-8'."\r\n";
$hlavicka .= 'Content-Transfer-Encoding: base64'."\r\n";
$hlavicka .= 'From: sender@example.com'."\r\n";
$hlavicka .= 'Reply-to: sender@example.com'."\r\n";
$predmet = 'ŠOK! Zahradní hadice za SUPER CENY!!!'; // to je vtip :-)
$telo = "...HTML...";
mail('recipient@example.com', '=?utf-8?B?'.base64_encode($predmet).'?=', chunk_split(base64_encode($telo)), $hlavicka, '-fsender@example.com');

Provedeno několik testů s různými instancemi Spamassassina a vždy jsem měl valid DKIM signature. ;-) Třeba se to někomu bude hodit, pokud zrovna zápasí s nevalidním DKIM podpisem při použití PHP fce mail()...

štítky: DKIM e-mail PHP spamassassin
2125x přečteno

Komentáře k článku (1)

26. 7. 2022 v 16:57 rozprašovací brána napsal(a)
díky za ŠOK a super článek, za odměnu posílám dar: Nadace Azim Premji poskytla dar ve výši 2 000 000,00 EUR. Váš e-mailový účet byl vybrán k přijetí peněžního daru ve výši 2 000 000,00 EUR od filantropa. Pokud se jedná o platný e-mailový účet, klikněte na Odpovědět a kontaktujte nás přímo, abychom vám poskytli vyčerpávající informace a mohli okamžitě podat stížnost prostřednictvím e-mailu.


Přidejte komentář
Vaše jméno/přezdívka: (max 40 znaků)

Web: (nepovinné, zadejte s http(s)://, max 100 znaků)

Opiště sekvenci znaků:

captcha!

Zde napište komentář: (max 512 znaků)

Copyright © 2015-2024 SOCL.cz, RSS 2.0 RSS kanál blogu
Všechna práva vyhrazena, nebo tak nějak.

WEDOS BANNER