cómo enviar un correo electrónico HTML con una imagen adjunta en línea con PHP

Tengo un script PHP que envía un correo electrónico HTML con una imagen adjunta. Funciona a la perfección, sin embargo, no puedo hacer que el archivo adjunto se muestre en una etiqueta en el cuerpo del correo electrónico. El archivo adjunto se llama https://stackoverflow.com/questions/7288614/how-to-send-an-html-email-with-an-inline-attached-image-with-php/4e60348f83f2f.png y el nombre de archivo original en el servidor es https://stackoverflow.com/questions/7288614/how-to-send-an-html-email-with-an-inline-attached-image-with-php/4e60348f83f2f.png . He intentado darle a la imagen URL varias cosas: https://stackoverflow.com/questions/7288614/how-to-send-an-html-email-with-an-inline-attached-image-with-php/cid:postcard.png , https://stackoverflow.com/questions/7288614/how-to-send-an-html-email-with-an-inline-attached-image-with-php/cid:4e60348f83f2f.png , https://stackoverflow.com/questions/7288614/how-to-send-an-html-email-with-an-inline-attached-image-with-php/4e60348f83f2f.png y https://stackoverflow.com/questions/7288614/how-to-send-an-html-email-with-an-inline-attached-image-with-php/4e60348f83f2f.png . Nada funciona.

Creo que la parte clave que estoy haciendo mal está aquí, porque esto lo convierte en un archivo adjunto separado en lugar de un archivo adjunto en línea que puedo usar:

 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="$fname" // ie: "http://img.rephp.com/php/postcard.png" 

Intenté cambiarlo para usar un CID pero realmente no sé cómo hacerlo, y esto no funcionó en absoluto:

 Content-Transfer-Encoding: base64 Content-ID:  // ie: https://stackoverflow.com/questions/7288614/how-to-send-an-html-email-with-an-inline-attached-image-with-php/postcard.png 

Aquí está el código completo: (Está basado en este código de un comentario en la página de php mail() ).

 <?php $to = "recipient@email.com"; $email = "sender@email.com"; $name = "Namename"; $subject = "An inline image!"; $comment = "Llookout Llary it's 
the Llandllord!


"; $To = strip_tags($to); $TextMessage =strip_tags(nl2br($comment),"
"); $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 = "http://img.rephp.com/php/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 ="http://img.rephp.com/php/postcard.png"; //what the file will be named $attachments=''; $Headers =<<<AKAM From: $FromName 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?"

Mail sent!

":"

Mail not sent!

"; ?>

Finalmente encontré la respuesta, que resulta notablemente simple. Esta página es lo que me ayudó a resolverlo, pero voy a demostrar las partes que necesitaba para hacerlo a continuación.

En primer lugar, está la creación de la cadena de límites, y la imagen, codificada y fragmentada correctamente:

 // 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'))); 

En la parte HTML del correo electrónico, la imagen se referencia de esta manera (utilizando la cadena de límite):

  

Luego, crea otra parte del correo electrónico debajo de la parte HTML para el archivo adjunto en línea, como este:

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

…¡y eso es eso! Es más fácil que implementar PHPmailer o cualquiera de las otras bibliotecas, si esto es todo lo que estás haciendo. Sin duda para tareas más complicadas, querrás obtener una de esas bibliotecas.

Recomendaría usar PHPMailer pero como dice que no quiere, le sugiero esta solución rápida.

Coloque la URL absoluta dentro de una etiqueta img, si envía un correo electrónico HTML, funcionará.