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

laravel
swiftmailer

(Cosmin) #1

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.


(Victor) #2

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


(Cosmin) #3

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.


(Igor Mardari) #4

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="" />';

(Cosmin) #5

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


(Emanuel Gug) #6

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ă.


(Cosmin) #7

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"

(Emanuel Gug) #8

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