Autor Zpráva
tpmar
Profil
Ahoj,

používám k posílání emailů knihovnu PHPMailer a narazil jsem na menší problém.

Email zasílám jako HTML kód a při vložení obrázku ve formátu base64 se odešle a korektně ukáže v emailu pouze obrázek s menšími rozměry (133x24 px - cca 1000 znaků v kódování base64). Jenže když se snažím odeslat větší obrázek (1368x754 px - cca 350 000 znaků v base64) tak se mi v emailu ukáže pouze HTML kód (tzn. <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA8Q1JFQVRPUjogZ2QtanBlZyB2MS4...) a obrázek nikde.

Chtěl bych se tedy zeptat. Dá se to nějak ošetřit, aby to ukazovalo i obrázky s většími rozměry?

Pokud ne, existuje nějaký limit velikosti obrázku, který se dá zaslat v této formě (base64)? (Nerad bych to ukládal na server, protože předpokládám, že se bude zasílat mnoho emailů s obrázky)

Děkuji za jakoukoliv radu
Davex
Profil
tpmar:
V HTML je tuším omezení na 1024 znaků v hodnotě atributu a lze to tedy považovat za bezpečné maximum, které by mělo fungovat víceméně všude. K delším hodnotám se různé prohlížeče mohou chovat různě. Proč nepoužiješ standardní embedování obrázků, které ti PHPMailer sestaví z HTML samo?
tpmar
Profil
Davex:
Zapomněl jsem zmínit, že obrázky přidávám metodou AddStringEmbeddedImage().

Přikládám i svůj kód:
$mail = new PHPMailer(true);

try {
    $mail->setFrom('xxx@domena.cz', 'xxx');
    foreach ($recipients as $name => $email) {
      $mail->addBCC($email, $name);
    }

    $mail->CharSet = 'UTF-8';
    $mail->isHTML(true);
    $mail->WordWrap = 50;

    preg_match_all('/img.*?>/', $values['content'], $matches);

    $id = 0;
    foreach ($matches[0] as $src) {
        $imgdata = explode(',',$src);
        $mime = explode(';', $imgdata[0]);
        $imgtype = explode(':', $mime[0]);

        $mail->AddStringEmbeddedImage(base64_decode($imgdata[1]), 'image'.$id, 'img_'.$id, $mime[1], $imgtype[1] );
        $values['content'] = str_replace($src, 'img alt="test" src="cid:image'.$id.'" style="border: none; />"', $values['content']);
        $id++;
    }

    $mail->Subject = $values['subject'];
    $mail->Body    = $values['content'];
    $mail->Send();

    $success = array(
        "info" => "Úspěch!",
        "description" => "Newsletter byl úspěšně odeslán"
    );
}
catch (phpmailerException $e) {
    $errors  = array(
        "info" => "Neúspěch!",
        "description" => $e->errorMessage()
    );
} catch (Exception $e) {
    $errors  = array(
        "info" => "Neúspěch!",
        "description" => $e->getMessage()
    );
}

Email se píše přes Summernote editor a proto musím přes preg_match_all projít všechny výskyty obrázků v těle emailu a následně je ošetřit.

Když tedy bude mít ten obrázek ve formátu base64 víc jak 1024 znaků tak to neprojde? :/
M02
Profil *
Obrázky s inline daty v mailech nepoužívej vůbec – jakkoliv velké. Nebudou fungovat v některých mailových klientech. Použij klasický multipart-related formát, kdy jsou obrázky přílohami a HTML part na ně jen odkazuje.
Davex
Profil
tpmar:
Děláš to zbytečně složitě. Stačí připravit HTML kód e-mailu, který se bude relativně odkazovat na soubory s obrázky a PHPMailer sestaví e-mail i s vložením obrázků sám. V examples je na to kompletní kód na pár řádků.
tpmar
Profil
Mě se jedná právěže o to, že bych je nechtěl ukládat na server.

Rozumím, že by to šlo i touto cestou. Ale to bych musel každý vložený obrázek uložit a já předpokládám, že těchto emailů nebude málo. Což mi časem zahltí server.

Jen jsem se chtěl poradit, jestli se to nedá udělat tím mým způsobem :)
Keeehi
Profil
tpmar:
Ale to bych musel každý vložený obrázek uložit a já předpokládám, že těchto emailů nebude málo. Což mi časem zahltí server.
Po odeslání mailu je můžeš zase smazat ;)
Davex
Profil
tpmar:
Jen jsem se chtěl poradit, jestli se to nedá udělat tím mým způsobem :)
Tak to zkus udělat podle toho příkladu a obrázky neukládej do souborů. Je vidět, že jsi to ani nezkoušel.
tpmar
Profil
Keeehi:
Aha, díky za informaci.

Davex:
Rozdíl mezi tím příkladem a tím, co mám sepsané já je pouze v tom, že tam má metodu msgHTML a addAttachment. To první tam víceméně mám akorát napsané trochu jinak a k tomu druhému potřebuju relativní adresu na obrázek a tu nemám bez toho aniž bych ho uložil.
Editor mi už dává obrázky ve formátu base64, takže mi nezbývá nic jiného, než ho uložit a předat mu tu relativní adresu.
Davex
Profil
tpmar:
Pochopitelně použij metodu msgHTML. Metoda addAttachment vkládá obrázek jako samostatnou přílohu bez vazby na obrázek vložený v HTML. Je to jen příklad, který demonstruje použití třídy, takže je potřeba vybrat si jen to užitečné.

Editor mi už dává obrázky ve formátu base64, takže mi nezbývá nic jiného, než ho uložit a předat mu tu relativní adresu.
Obrázky není nutné ukládat. Pokud ovšem nepoužíváš nějakou prehistorickou verzi PHPMaileru.
tpmar
Profil
Davex:
Pokud ovšem nepoužíváš nějakou prehistorickou verzi PHPMaileru.
Používám nejnovější verzi PHPMaileru, v tom by neměl být problém.

Ale i v případě, kdy jsem použil metodu msgHTML tak se nic nezměnilo. Když pošlu obrázek s většími rozměry (1368x754px), celý email se rozbije a zobrazí se jako HTML kód. S menšími obrázky to funguje bez problému.
Davex
Profil
tpmar:
S velkými obrázky to běžně funguje, takže chyba by mohla být ve zpracovávaném HTML kódu nebo ještě někde jinde.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: