Jaké jsou možnosti vkládání obrázku do emailů již byly rozebrány v samostatném článku. Inline obrázky jsou jedny z nejstarších řešení, ale mají své výhody. Především pokud jsou to obrázky "na jedno použití", jako například QR platba.
V Laravelu se to dá jednoduše řešit pomocí embed funkce, která je ale dostupná jen v klasických emailech. V markdown emailech není totiž přístupná proměnná
$message. Důvod je ten, že markdown emaily generují také plain text verzi. Obě verze emailu jsou totiž generovány ještě před vytvořením instance SwiftMailu, který Laravel na pozadí používá. A právě tato instance bývá v proměnné $message.
Přidání přes callback withSwiftMessage
Nejjednodušší je si pomocí příkazu artisan make:mail vytvořit novou třídu pro email, na které lze registrovat callback withSwiftMessage a zde obrázek přidat.
$message = (new MyMail())->to($toAddress); $message->withSwiftMessage(function ($message)use($qrCode){ // QR kód je generován "on the fly", takže do konstruktoru // je vložen přímo binární obsah obrázku $image = new \Swift_Image($qrCode->toPngText(), "QR Platba.png", "image/png"); // Druhá možnost je vytvoření přes statickou metodu s cestou k obrázku $image = \Swift_Image::fromPath("path/to/image.png"); $image->setId("qrpayment@kutac.generated"); $message->embed($image); });
Třída Swift_Image ale generuje CID automaticky a náhodně, což samozřejmě nelze předem vložit do emailu. CID lze naštěstí nastavit, jen podle normy musí název být ve formátu emailové adresy. Proto jako parametr do metody setId je potřeba vložit pseudo-emailovou adresu. Stejná hodnota se poté vloží do HTML emailu následovně
<img src="cid:qrpayment@kutac.generated" alt="QR Platba">
A to je vše. Řešení je docela jednoduché, pro začátečníky ale může být problém neřešitelný. I mě zabralo přes hodinu na tuto možnost přijít. Řešení lze samozřejmě použít i v notifikacích v metodě toMail(), kde je následně proměnná $message z metody vrácena.
Máte zkušenosti s emaily v Laravelu, nebo jste našli jednodušší řešení? Podělte se v komentářích s ostatními čtenáři.
K tomuto článku již není možné přidávat další komentáře