Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHPmailer i przekazywanie wiadomości z wbudowanymi obrazkami
Forum PHP.pl > Forum > PHP
Derwu
Witam,

używam "PHP mailer'a" do tworzenia i wysyłania e-maili z witryny. Do każdego e-maila dodaje obrazki, które nie są dołączone jako załącznik tylko wbudowane w treść wiadomości (tzw. Embed Images).

Wiadomość dociera do odbiorcy, obrazki są widoczne, ale gdy chcę przekazać wiadomość dalej obrazki stają się niewidoczne.
Problem występuje na Thunderbirdzie, a na starym Outlook Express jest wszystko w porządku (innych nie testowałem). To nie jest jednak wina Thunderbirda, bo mam kilka wiadomości wygenerowanych z innych stron też ze wstawionymi obrazkami, które mogę przesyłać dalej za pomocą Thunderbirda i obrazki nie znikają. Jesto to więc kwestia wysłania wiadomości z poziomu PHP.

Proszę o jakieś rady/sugestie.
vokiel
No to pokaż jak dołączasz te obrazki
piotr94
no właśnie, pokaż jak dołączasz to obrazki
Derwu
Obrazki dołączam tak:
  1. $mail->AddEmbeddedImage("images/print/logo.png","logo.png");


A w mailu:
  1. <img id="logo" src="cid:logo.png" alt="Logo" />


Czy ktoś pomoże ?
piotr94
tak dry.gif
  1. <html>
  2. <head>
  3. <title>PHPMailer - SMTP basic test with authentication</title>
  4. </head>
  5. <body>
  6.  
  7. <?php
  8.  
  9. //error_reporting(E_ALL);
  10. //error_reporting(E_STRICT);
  11.  
  12. date_default_timezone_set('Europe/Warsaw');
  13.  
  14. require_once('../class.phpmailer.php');
  15. //require_once('classes/class.phpmailer.php');
  16. try{
  17. $mail = new PHPMailer(true);
  18. $mail->Mailer = 'smtp'; // telling the class to use SMTP
  19. $mail->SMTPAuth = true; // enable SMTP authentication
  20. $mail->Host = '*'; // sets the SMTP server
  21. $mail->Port = 25; // set the SMTP port
  22. $mail->Username = '*'; // SMTP account username
  23. $mail->Password = '*'; // SMTP account password
  24.  
  25. $mail->SetFrom('*', 'PR', false);
  26.  
  27. $mail->AddReplyTo('*', 'SENDER');
  28.  
  29. $mail->Subject = 'TEST';
  30.  
  31. // $mail->AddEmbeddedImage("images/print/logo.png","logo.png");
  32. $mail->AddEmbeddedImage("images/phpmailer.gif",1001,"phpmailer.gif",'base64','image/gif');
  33. //wyjaśniam poniżej zmiany
  34. $mail->AddAddress('*', 'RECIVER');
  35. $mail->MsgHTML("abcdef<br/><b>ghi</b><br /><img id=\"logo\" src=\"cid:1001\" alt=\"Logo\" />");
  36. $mail->Send();
  37. $error_mail=0;
  38. } catch (phpmailerException $e) {
  39. trigger_error($e->errorMessage(),E_USER_WARNING);
  40. $error_mail=1;
  41. //addinfo('Wystąpił błąd podczas wysyłania wiadomości e-mail.');
  42. } catch (Exception $e) {
  43. trigger_error($e->getMessage(),E_USER_WARNING);
  44. //addinfo('Wystąpił błąd podczas wysyłania wiadomości e-mail.');
  45. $error_mail=1;
  46. }
  47. if($error_mail){
  48. echo('ERR');
  49. }else{
  50. echo('OK');
  51. }
  52. ?>
  53.  
  54. </body>
  55. </html>

a więc tak:
1. jako CID zaleca się używać liczb, dlatego tak będzie po prostu pewniej, że nie będzie z tym problemów
2. żeby obrazek był poprawnie dołączony trzeba jeszcze go odpowiednio zakodować (base64) i podać jego typ (image/gif w moim przypadku)
i śmiga jak należy
Mam nadzieję, że pomogłem, sorry, że tak późno, ale nie miałem wcześniej czasu
Derwu
piotr94, dzięki! Pomogłeś mi w znalezieniu przyczyny.

Nie był tu problemem literowy CID (może zawierać litery, u mnie zmiana nazw obrazków byłaby problematyczna), a kodowanie "base64" włącza się domyślnie.

Problemem był "Content-Type". Domyślnie klasa PHPmailer, w funkcji AddEmbeddedImage ma typ "application/octet-stream". Na swoje potrzeby zmodyfikowałem jedną linię kodu z clasy PHPmailer z:
  1. public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {

na:
  1. public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'image/png') {


Obrazki załączam nadal w ten sam sposób:
  1. $mail->AddEmbeddedImage("images/print/logo.png","logo.png");

Oczywiście można ustawiać typ obrazka bezpośrednio podczas jego inkludowania, jednak ja na swoje potrzeby wyedytowałem klasę, aby zaoszczędzić na kodzie.

Teraz przekazywanie wiadomości z obrazkami działa. Jeszcze raz dzięki piotr94, naprowadziłeś mnie na źródło problemu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.