Xpoint
   [напомнить пароль]

Отправка HTML-файла с картинками по почте

Метки: [без меток]
2007-07-23 12:24:55 [обр] Филипп Ткачев(20/112)[досье]
Проблема не нова и у профи может вызвать улыбку, но...
Нужно отправлять отчет в виде HTML с картинками внутри так, чтобы они отображались при просмотре в почтовых клиентах (Thunderbird, The Bat, Outlook, Outlook Express).
Попробовал несколько готовых классов на эту тему, но они только прикрепляют файлы к телу письма, а в клиенте картинки не показываются, хотя HTML отображается. Картинки доступны в виде вложений.
Как правильно сгенерировать тело письма так, чтобы картинки отображались?
Может надо изменять HTML код страницы?
Перерыл много статей в сети, но так и не нашел чего-то вразумительного. Если кто видел толковую статью на русском или перевод RFC, дайте ссылочку.
Маленькая просьба: PEAR классы не предлагать. Еще: PHP 4 ветки.
спустя 1 час 17 минут [обр] Давид Мзареулян(536/1003)[досье]
А Вы приведите минимальный код, который должен работать, но не работает как надо.
спустя 43 минуты [обр] Привидение+(611/795)[досье]

Может надо изменять HTML код страницы?
Разумеется.
Причем как именно изменять, можно посмотреть в любом письме, которое показывается, как надо.

а перевод RFC я видел когда-то. Попробуй поискать

спустя 43 минуты [обр] Валера(6/24)[досье]
Филипп Ткачев[досье], можете посмотреть phpmailer. Он умеет отправлять письма с вложениями, в том числе и с картинками. Там есть документация.
спустя 1 минуту [обр] Валера(6/24)[досье]
Филипп Ткачев[досье], еще можно сделать HTML c ссылками на картинки с внешнего сервера.
спустя 45 минут [обр] Дмитрий Попов(171/509)[досье]
Валера[досье]
Внимательно читайте вопросы, прежде чем отвечать, хорошо?
спустя 1 час 6 минут [обр] Филипп Ткачев(20/112)[досье]

Вот код, который я использовал.
Естественно, до него идет генерация страницы, включен буфер (ob_start):

function xmail( $from, $to, $subj, $text,$fname,$attache,$attachemime)
{
$un = strtoupper(uniqid(time()));
$head = "To: ".$to."\r\n";
$head .= "From: ".$from."\r\n";
$head .= "MIME-Version: 1.0\r\n";
$head .= "Content-Type: multipart/mixed;\r\n";
$head .= " boundary=\"".$un."\"\r\n\r\n";
$zag = "--".$un."\r\nContent-Type: text/html; charset=windows-1251\r\n";
$zag .= "Content-Transfer-Encoding: 8bit\r\n\r\n".$text."\r\n";
$zag .= "--".$un."\r\n";
$zag .= "Content-Type: ".$attachemime."; name=\"".basename($fname)."\"\r\n";
$zag .= "Content-transfer-encoding: base64\r\n";
$zag .= "Content-Disposition: attachment; filename=\"".basename($fname)."\"\r\n\r\n";
$zag .= chunk_split(base64_encode($attache))."\r\n\r\n";
$zag .= "--".$un."--\r\n\r\n";
return @mail("$to", "$subj", $zag, $head);
} 
//
$mail_html = ob_get_contents();//получение кода страницы
$mail_html = str_replace("src=\"tmp/", "src=\"",$mail_html ); 
//коррекция пути к картинке, может здесь собака зарыта?
//мне почему-то казалось, что здесь ссылка на имя вложения
$attachment=file_get_contents('tmp/graphic_yearly.png');
xmail("postmaster@zoonman.com","webmaster@zoonman.com","mailtest",$mail_html,'graphic_yearly.png',
$attachment,'image/png');

Штука эта работает, все приходит, картинка в аттаче.

спустя 8 минут [обр] Давид Мзареулян(536/1003)[досье]

Погодите, Вы же писали, что:

Попробовал несколько готовых классов на эту тему, но они только прикрепляют файлы к телу письма, а в клиенте картинки не показываются, хотя HTML отображается.

Я вот про это спрашивал. Если же хотите делать всё врукопашную, то Привидение[досье] совершенно прав — берите любое готовое письмо и делайте по аналогии.

спустя 19 минут [обр] Валера(6/24)[досье]
Дмитрий Попов[досье], ладно, то что картинки должны быть не во вложениях, а в самом HTML это я сразу не увидел, но второй ответ вполне по теме.
спустя 1 час 4 минуты [обр] Привидение+(611/795)[досье]
Я, кстати, не видел "готовых классов" которые умеют отправлять хтмл с картинками.
спустя 3 часа 20 минут [обр] Василий Свиридов(53/175)[досье]
Привидение[досье]PHPMailer умеет, там есть ф-ция AddEmbeddedImage, которая генерит URL для аттачмента, типа cid:<attachment_id>
спустя 1 час 42 минуты [обр] Давид Мзареулян(536/1003)[досье]

Более того, на их сайте есть подробный туториал по этому поводу: http://phpmailer.sourceforge.net/tutorial.html#4

Потому мне и интересно, что конкретно делал автор с «готовыми классами», что у него ничего не работало.

спустя 2 часа 12 минут [обр] Алексей В. Иванов(509/2861)[досье]
Pear::Mail_MIME тоже умеет вкладывать картинки.
спустя 6 часов [обр] Филипп Ткачев(20/112)[досье]
Привидение[досье], спасибо, я последовал вашему совету. Все оказалось достаточно просто. Нужно указывать размещение вставленного объекта как inline и указывать для него Content-ID.
А в HTML-коде корректировать пути с указанием в src идентификатора вложения cid (Content-ID).
Код приведу чуть по-позже.
спустя 17 минут [обр] Филипп Ткачев(20/112)[досье]
Код как и обещал:
function multipart_mail($from, $to, $subject, $text, $attachment_files, $cc=NULL)
{
   $headers ="From: $from\r\n";
   $headers.="To: $to\r\n";
   if (!is_null($cc))
   {
      $headers.="Cc: $cc\r\n";
   }
   $headers.="Subject: $subject\r\n";
   $headers.="Date: ".date("r")."\r\n";
   $headers.="X-Mailer: zm php script\r\n";
   $headers.="MIME-Version: 1.0\r\n";
   $headers.="Content-Type: multipart/alternative;\r\n";
   $baseboundary="------------".strtoupper(md5(uniqid(rand(), true)));
   $headers.="  boundary=\"$baseboundary\"\r\n";
   $headers.="This is a multi-part message in MIME format.\r\n";
   $message="--$baseboundary\r\n";
   $message.="Content-Type: text/plain;\r\n";
   $message.="Content-Transfer-Encoding: 7bit\r\n\r\n";
   $message.="Its simple text. Switch to HTML view!\r\n\r\n";
   $message.="--$baseboundary\r\n";

   $newboundary="------------".strtoupper(md5(uniqid(rand(), true)));

   $message.="Content-Type: multipart/related;\r\n";
   $message.="  boundary=\"$newboundary\"\r\n\r\n\r\n";
   $message.="--$newboundary\r\n";
   $message.="Content-Type: text/html; charset=windows-1251\r\n";
   $message.="Content-Transfer-Encoding: 7bit\r\n\r\n";
   $message.=($text)."\r\n\r\n";

   if (is_array($attachment_files))
   {
      foreach($attachment_files as $filename)
      {
         $mime_type='image/png';
         //$mime_type=mime_content_type($filename);
         $file_content = file_get_contents($filename,true);
         $filename=basename($filename);
         $message.="--$newboundary\r\n";
         $message.="Content-Type: $mime_type;\r\n";
         $message.=" name=\"$filename\"\r\n";
         $message.="Content-Transfer-Encoding: base64\r\n";
         $message.="Content-ID: <$filename>\r\n";
         $message.="Content-Disposition: inline;\r\n";
         $message.=" filename=\"$filename\"\r\n\r\n";
         $message.=chunk_split(base64_encode($file_content));
      }
   }
   
   $message.="--$newboundary--\r\n\r\n";
   $message.="--$baseboundary--\r\n";
   mail($to, $subject, $message , $headers);
}
$mail_html = ob_get_contents();
$mail_html = str_replace("src=\"tmp/", "src=\"cid:",$mail_html ); 

$a=array('tmp/graphic_yearly.png',
'tmp/graphic_world.png');

multipart_mail("postmaster@zoonman.com","webmaster@zoonman.com","Statistics",$mail_html,
$a,'info@artpix.ru');
Powered by POEM™ Engine Copyright © 2002-2005