как отправить HTML-письмо с встроенным прикрепленным изображением с помощью PHP

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

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

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

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

 Content-Transfer-Encoding: base64 Content-ID: <$fname> // ie: 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>"; ?> 

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

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

 // 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 или любой другой библиотеки, если это все, что вы делаете. Без сомнения, для более сложной задачи вы захотите получить одну из этих библиотек.

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

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

 <img src="http://example.com/image.jpg"/>