как отправить HTML письмо с вложенным изображением на PHP - PullRequest
5 голосов
/ 02 сентября 2011

У меня есть PHP-скрипт, который отправляет HTML-письмо с прикрепленным изображением.Это работает красиво, однако я не могу отобразить вложение в теге <img> в теле письма.Прикрепленный файл называется postcard.png, а исходное имя файла на сервере - 4e60348f83f2f.png.Я попытался указать URL-адрес изображения в виде различных вещей: cid:postcard.png, cid:4e60348f83f2f.png, postcard.png и 4e60348f83f2f.png.Ничего не работает

Я думаю, что ключевая часть, которую я делаю неправильно, здесь, потому что это делает его отдельным вложенным приложением вместо встроенного, которое я могу использовать:

Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename="$fname" // i.e.: "postcard.png"

Я пробовализменив его на использование CID, но я действительно не знаю, как это сделать, и это совсем не сработало:

Content-Transfer-Encoding: base64
Content-ID: <$fname> // i.e.: postcard.png

Вот полный код: (Он основан на этом коде из комментария на странице php mail().)

<?php
$to      = "recipient@email.com";
$email   = "sender@email.com";
$name    = "Namename";
$subject = "An inline image!"; 
$comment = "Llookout <b>Llary</b> it's <br> the <b>Ll</b>andllord!<br><img src='cid:postcard.png'><br><img src='cid:4e60348f83f2f.png'><img src='postcard.png'><br><img src='4e60348f83f2f.png'>";

$To          = strip_tags($to);
$TextMessage =strip_tags(nl2br($comment),"<br>");
$HTMLMessage =nl2br($comment);
$FromName    =strip_tags($name);
$FromEmail   =strip_tags($email);
$Subject     =strip_tags($subject);

$boundary1   =rand(0,9)."-"
    .rand(10000000000,9999999999)."-"
    .rand(10000000000,9999999999)."=:"
    .rand(10000,99999);
$boundary2   =rand(0,9)."-".rand(10000000000,9999999999)."-"
    .rand(10000000000,9999999999)."=:"
    .rand(10000,99999);

$filename1 = "4e60348f83f2f.png"; //name of file on server with script
$handle      =fopen($filename1, 'rb'); 
$f_contents  =fread($handle, filesize($filename1)); 
$attachment=chunk_split(base64_encode($f_contents));
fclose($handle); 

$ftype       ="image/png";
$fname       ="postcard.png"; //what the file will be named


$attachments='';
$Headers     =<<<AKAM
From: $FromName <$FromEmail>
Reply-To: $FromEmail
MIME-Version: 1.0
Content-Type: multipart/mixed;
    boundary="$boundary1"
AKAM;

$attachments.=<<<ATTA
--$boundary1
Content-Type: $ftype;
    name="$fname"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename="$fname"


$attachment

ATTA;


$Body        =<<<AKAM
This is a multi-part message in MIME format.

--$boundary1
Content-Type: multipart/alternative;
    boundary="$boundary2"

--$boundary2
Content-Type: text/plain;
    charset="windows-1256"
Content-Transfer-Encoding: quoted-printable

$TextMessage
--$boundary2
Content-Type: text/html;
    charset="windows-1256"
Content-Transfer-Encoding: quoted-printable

$HTMLMessage

--$boundary2--

$attachments
--$boundary1--
AKAM;

// Send email
$ok=mail($To, $Subject, $Body, $Headers);
echo $ok?"<h1> Mail sent!</h1>":"<h1> Mail not sent!</h1>";
?>

Ответы [ 2 ]

14 голосов
/ 22 сентября 2011

Я наконец нашел ответ, который оказался удивительно простым. Эта страница - это то, что помогло мне понять это, но я продемонстрирую части, которые мне нужны, чтобы сделать это ниже.

Во-первых, это создание строки границы, иизображение, правильно закодированное и разделенное на части:

// Create a boundary string.  It needs to be unique (not in the text) so ...
// We are going to use the sha1 algorithm to generate a 40 character string:
$sep = sha1(date('r', time()));

// Also now prepare our inline image - Also read, encode, split:
$inline = chunk_split(base64_encode(file_get_contents('figure.gif')));

В HTML-части электронного письма ссылка на изображение осуществляется следующим образом (с использованием строки границы):

<img src="cid:PHP-CID-{$sep}">

Затем вы создаетедругая часть электронного письма под HTML-частью для встроенного вложения, например:

--PHP-related-{$sep}
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-ID: <PHP-CID-{$sep}>
{$inline}

... и это все!Проще, чем реализовывать PHPmailer или любую другую библиотеку, если это все, что вы делаете.Без сомнения, для более сложной задачи вам понадобится одна из этих библиотек.

0 голосов
/ 03 сентября 2011

Я бы порекомендовал использовать PHPMailer, но так как вы говорите, что не хотите, я предлагаю это быстрое исправление.

Поместите абсолютный URL-адрес в тег img, если вы отправите сообщение электронной почты в формате HTML, оно будет работать.

<img src="http://example.com/image.jpg"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...