Generare de attachment-uri inline la trimiterea unui e-mail

Salutare,

Dezvolt o aplicatie Laravel care permite construirea unui e-mail si apoi trimiterea acestuia. In situatia in care clientul adauga imagini in template-ul mail-ului, doresc sa le transform in atasamente inline. Out of the box, Laravel permite folosirea $message->embed($pathToImage) in template-ul Blade, care functioneaza perfect, insa acest lucru nu ma ajuta deoarece nu folosesc template-ul Blade la trimitere, ci servesc direct continutul HTML ca string:

public function build()
{
    // [...]
    return $this->from($sender)
        ->subject($subject)
        ->html($content);
}

V-ati lovit de acest lucru pana acum? Vreo idee cum as putea solutiona problema?

Multumesc.

Compileaza templateul de e-mail cu blade către o variabilă și folosește acea variabilă drept conținutul mailului.

Nu pot face asta. Nu pot sa folosesc un template Blade decat la modul de placeholder pentru continutul HTML, de forma {!! $content !!}". Clientul face tot HTML-ul intr-un editor WYSIWYG.

Poti transforma imaginile in base64 encoding, si sa le inserezi inline, in felul urmator:

$path = 'myfolder/myimage.png';
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($imagePath);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);

$inlineAttachment = '<img src="'.$base64.'" alt="" />';

Aceasta metoda am folosit-o anterior, dar nu este pe placul clientului deoarece rezulta un HTML destul de mare.

Nu înțeleg cum poți dori imaginile inline dar apoi se plânge că e prea mare html-ul.

Păi ori una ori alta. Ori imagini inline ori embed-uite și hostate pe un server extern.

Altă posibilitate nu există.

Prin “inline” ma refer la “CID Embedding”, adica situatia in care in loc de sursa imaginii, in atributul “src” al tag-ului “img” scrii ceva de genul: “cid:479b26af0c790ab4b716c3873e4ba30f”, unde acel hash corespunde imaginii atasate e-mail-ului.

In sursa mail-ului o sa vezi ceva de genul:

--b1_007853d1434605b58257e6ff3688e44f
Content-Type: image/png; name="youtube.png"
Content-Transfer-Encoding: base64
Content-ID: <479b26af0c790ab4b716c3873e4ba30f>
Content-Disposition: inline; filename="youtube.png"

Da, sunt de acord dar tot embed-uite in corpul emailului sunt, și tot vor ocupa același spațiu practic.