¿Incrustar imágenes para usar en mensajes de correo electrónico usando PHP?

Sé cómo insertar una imagen en un correo electrónico como un archivo adjunto, pero eso no es realmente lo que quiero hacer. Lo que quiero hacer es insertar una imagen en el mensaje y usar eso dentro del cuerpo del mensaje de correo electrónico. ¿Es posible hacer esto o posiblemente hacer referencia a un archivo adjunto de alguna manera para ser utilizado en el mensaje?

¿Debería siquiera preocuparme por esto? ¿Es más beneficioso simplemente cargarlos a través de un enlace a la imagen en mi red? Estaba pensando que esto me quitaría algo de carga de mi servidor, por lo que no tenía que descargarse directamente de mi sitio en cada mensaje de correo electrónico que se abriera, reduciendo así un poco el ancho de banda.

Nota: No estoy buscando marcos de correo electrónico o bibliotecas, etc., solo por una manera simple de lograr esta tarea.

La gente sonará para decirte que uses SwiftMailer o alguna otra biblioteca. Pero no es tan difícil. Es realmente quisquilloso, pero no es difícil. A continuación hay una función que uso. Lo he anonimizado un poco, y con suerte no rompí nada. En el mensaje html (que obtengo de otra función), enlace a su imagen adjunta de esta manera:

$output .= '

graph

';

Donde $linkID es el mismo valor utilizado en la función a continuación.

 public function sendEmail($emailAddress) { $random_hash = md5(date('r', time())); $htmlString = $this->getHTML($random_hash); $message = "--mixed-$random_hash\n"; $message .= 'Content-Type: multipart/alternative; boundary="alt-' . $random_hash . '"' . "\n\n"; $message .= 'MIME-Version: 1.0' . "\n"; $message .= '--alt-' . $random_hash . "\n"; $message .= 'Content-Type: text/plain; charset="iso-8859-1"' . "\n"; $message .= 'Content-Transfer-Encoding: 7bit' . "\n\n"; // text message $message .= strip_tags($htmlString) . "\n\n"; $message .= '--alt-' . $random_hash . "\n"; $message .= 'Content-Type: text/html; charset="iso-8859-1"' . "\n"; // $message .= 'MIME-Version: 1.0' . "\n"; $message .= 'Content-Transfer-Encoding: 7bit' . "\n\n"; // html message $message .= $htmlString . "\n\n"; $message .= '--alt-' . $random_hash . '--' . "\n"; // graph image if($this->selectedGraph != 0) { $graphString = $this->getGraph(); $graphString = chunk_split(base64_encode($graphString)); $linkID = 'graph-' . $random_hash . '-image'; $message .= '--mixed-' . $random_hash . "\n"; $message .= 'MIME-Version: 1.0' . "\n"; $message .= 'Content-Transfer-Encoding: base64' . "\n"; $message .= 'Content-ID: ' . $linkID . "\n"; $message .= 'Content-Type: image/gif; name="graph.gif"' . "\n"; $message .= 'Content-Disposition: attachment' . "\n\n"; $message .= $graphString; $message .= '--mixed-' . $random_hash . '--' . "\n"; } else { $message .= '--mixed-' . $random_hash . '--' . "\n"; } $headers = 'From: ' . $this->from. "\r\nReply-To: " . $this->replyto; $headers .= "\r\nContent-Type: multipart/related; boundary=\"mixed-" . $random_hash . "\"\r\nMIME-Version: 1.0"; $flags = '-f ' . BOUNCED_EMAIL_ADDRESS; return mail($emailAddress, $this->subject, $message, $headers, $flags); } 

Si otra cosa vale la pena hacer es otra pregunta. Si adjuntas la imagen, estás usando ancho de banda para enviar el mensaje. ¿Tal vez sea mejor para ti usar el ancho de banda de una sola vez en lugar de dispersarlo? Tal vez no.

No usé imágenes adjuntas hasta que tuve que enviar una imagen diferente a cada destinatario. No iba a almacenar y gestionar todas esas imágenes en nuestro servidor (y tratar de asignarles un nombre único).

 Content-Type: multipart/related; type="text/html"; boundary="Boundary1" --Boundary1 Content-Type: multipart/alternative; boundary="Boundary2" --Boundary2 Content-Type: text/html; charset = "utf-8" Content-Transfer-Encoding: 8bit  --Boundary2-- --Boundary1 Content-Type: image/jpeg; name="somefilename.jpg" Content-Transfer-Encoding: base64 Content-ID:  Content-Disposition: inline; filename="somefilename.jpg" //binary data --Boundary1-- 

Boundary, charset, Content-Transfer-Encoding, por supuesto, todo elegible. El paquete PHPMailer puede hacer esto automáticamente para usted: http://www.ustrem.org/es/article-send-mail-using-phpmailer-en/

Vea también incluir imágenes en: http://mailformat.dan.info/body/html.html


Creo que la única forma de hacerlo es hacer referencia a una imagen por URL como esta:

 This is a description