Autor | Zpráva | ||
---|---|---|---|
tpmar Profil |
#1 · Zasláno: 18. 3. 2017, 12:34:47
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 |
#2 · Zasláno: 18. 3. 2017, 17:28:41
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 |
#3 · Zasláno: 18. 3. 2017, 20:19:14
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 * |
#4 · Zasláno: 18. 3. 2017, 20:55:59
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 |
#5 · Zasláno: 18. 3. 2017, 21:06:55
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 |
#6 · Zasláno: 18. 3. 2017, 21:31:33
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 |
#7 · Zasláno: 18. 3. 2017, 22:26:03
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 |
#8 · Zasláno: 19. 3. 2017, 11:55:43
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 |
#9 · Zasláno: 19. 3. 2017, 15:21:50
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 |
#10 · Zasláno: 20. 3. 2017, 23:07:37
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 |
#11 · Zasláno: 21. 3. 2017, 14:44:42
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 |
#12 · Zasláno: 23. 3. 2017, 19:43:43
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. |
||
tpmar Profil |
#13 · Zasláno: 24. 3. 2017, 17:07:36
Davex:
Problém jsem už vyřešil přes dočasné ukládání obrázků do složky na serveru. Sice nastal zase problém s obrázky s větší velikostí (cca 5MB) ale to už si ošetřím, protože nevidím důvod, aby někdo používal tak velké obrázky pro tento účel. |
||
Časová prodleva: 4 roky
|
0