Inline obrázky v markdown emailech v Laravelu

Pavel PHP

Vkládání inline obrázků pomocí content-ID do emailu v Laravelu je jednoduché, pokud se nejedná o markdown emaily. Tam je to trochu komplikovanější, přesto ne nemožné.

Inline obrázky v markdown emailech v Laravelu

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.

Přidat komentář

Právě odpovídáte na existující komentář. Zrušit

Komentáře

Novinky z blogu

Vlastní eventy v Javascriptu

Eventy jsou s Javascriptem spjaty už od jeho počátků. Přesto, že jich v základu obsahuje nepřeberné množství, je někdy užitečné vytvořit si eventy vlastní. V tomto článku se...

Další články