PHP Прикрепление изображения к электронному письму

Есть ли способ прикрепить изображение к сообщению электронной почты в формате html, созданному в PHP?

Нам нужно убедиться, что корпоративный логотип присутствует в электронных письмах, отправляемых клиентам, которые могут не иметь доступа к Интернету во время чтения своей электронной почты (они, очевидно, будут иметь его для загрузки файлов).


person Omar Kooheji    schedule 11.02.2009    source источник


Ответы (6)


Попробуйте пакет PEAR Mail_Mime, который может встроить изображения для вас.

Вам нужно использовать addHTMLImage() и передайте идентификатор контента (cid), который представляет собой уникальную строку текста, которую вы также будете использовать в атрибуте src вашего img в качестве URL-адреса cid:. Например:

include('Mail.php');
include "Mail/mime.php";


$crlf = "\r\n";
$hdrs = array( 
        'From' => '[email protected]', 
        'Subject' => 'Mail_mime test message' 
        ); 

$mime = new Mail_mime($crlf); 

//attach our image with a unique content id
$cid="mycidstring";
$mime->addHTMLImage("/path/to/myimage.gif", "image/gif", "", true, $cid);

//now we can use the content id in our message
$html = '<html><body><img src="cid:'.$cid.'"></body></html>';
$text = 'Plain text version of email';

$mime->setTXTBody($text);
$mime->setHTMLBody($html); 

$body = $mime->get();
$hdrs = $mime->headers($hdrs);

$mail =& Mail::factory('mail');
$mail->send('[email protected]', $hdrs, $body);
person Paul Dixon    schedule 11.02.2009
comment
Блин, ты был на 20 секунд быстрее ;-) - person Joonas Pulakka; 11.02.2009
comment
Я получаю двойную ошибку Notice: Undefined property: Mail_mime::$_html_images in .... Это строка, в которой вы объявляете переменную $cid. Он отправляет электронное письмо, но не отображает изображение. Сможете ли вы обновить свой ответ? - person Logan Wayne; 30.03.2016
comment
Этому ответу 7 лет! Если вы посмотрите на исходный код Mail_Mime, вы увидите, что $_html_images участник, к которому я обращаюсь, переименован $html_images и защищен github.com/pear/Mail_Mime/blob/1.10.0/Mail/mime.php#L111 Нетрудно получить новый класс из Mail_mime и добавьте метод, чтобы дать вам это значение cid. - person Paul Dixon; 30.03.2016
comment
Пытался отредактировать этот ответ, но он был отклонен... Модуль Mail_Mime позволяет указать идентификатор содержимого с помощью addHTMLImage()[1]. Поэтому вместо того, чтобы выуживать его, просто выполните: $mime->addHTMLImage(/path/to/myimage.gif, image/gif, , true, mycidstring); $html = '‹html›‹body›‹img src=cid:mycidstring›‹/body›‹/html›'; [1]pear.php.net/manual/en /package.mail.mail-mime.addhtmlimage.php - person Matt; 17.01.2017
comment
Я не отклонил его :( Редактировать мне понравилось, поэтому я изменил ответ. Большое спасибо. - person Paul Dixon; 17.01.2017

Вероятно, проще всего использовать какую-нибудь библиотеку, которая может работать с вложениями электронной почты. Например, Mail_Mime от PEAR.

person Joonas Pulakka    schedule 11.02.2009

Пакет PEAR Mail_Mime — это то, что вам нужно.

После того, как вы настроили свое сообщение, добавить вложение так же просто, как:

$mime = new Mail_mime("\n");

$mime->setTXTBody($msg_text);
$mime->setHTMLbody($msg_html);

// Add gif as attachment to mail
$mime->addAttachment("/path/to/image/smile.gif", "image/gif");

$body = $mime->get();
$headers = $mime->headers($headers);
$mail->send("[email protected]", $headers, $body);

Если вы хотите, чтобы ваш логотип отображался в определенном месте сообщения электронной почты, а не только как вложение, вы можете сделать следующее:

// In your message html:
<img src='logo.gif' alt='Our logo' />

// PHP:
$mime->addHTMLImage('/path/to/image/logo.gif');

Этот подход может иметь неоднозначные результаты в зависимости от почтового клиента вашего пользователя, поэтому перед отправкой попробуйте протестировать формат на фиктивных учетных записях gmail, yahoo и hotmail.

person ConroyP    schedule 11.02.2009

Вы создаете свой собственный или используете готовый класс? Я сам рекомендую PHP Mailer[0], а среди прочих есть PEAR::Mail_Mime[1], которые Google будет рад помочь вам найти. Я использую PHP Mailer для отправки сообщений со встроенными изображениями[2] в течение многих лет без сучка и задоринки, хотя имейте в виду, что каждое изображение значительно увеличивает пропускную способность электронной почты, поэтому, как правило, его не следует использовать для каких-либо массовых сообщений. И, чтобы повторить Билла, do также используйте текстовую альтернативу.

[0] http://phpmailer.sourceforge.net/

[1] http://pear.php.net/manual/en/package.mail.mail-mime.php

[2] http://phpmailer.sourceforge.net/docs/PHPMailer/PHPMailer.html#AddEmbeddedImage

взято с http://lists.evolt.org/archive/Week-of-Mon-20060612/183029.html

person Natrium    schedule 11.02.2009

Здесь более чем достаточно ответов, которые должны помочь решить вашу конкретную проблему, но я просто подумал, что, возможно, стоит указать, что у вас вполне может быть более крупная проблема, о которой вы не подумали.

В частности, написание электронных писем для отправки через PHP наполнено потенциальными ошибками и должно выполняться только в том случае, если у вас есть действительно хорошее представление о том, что может пойти не так.

Если вы планируете довольно интенсивно рассылать электронные письма, я настоятельно рекомендую делать это либо с помощью специального почтового маркетингового клиента, либо с помощью одного из множества API почтового маркетинга, которые будут отправлять его вам. (mailchimp, по-видимому, приличный).

person Steerpike    schedule 11.02.2009

Попробуйте swiftmailer, вот хороший пример использования встроенного изображения http://swiftmailer.org/wikidocs/v3/embedding_images?s[]=embed

person vaske    schedule 03.05.2010