wordpress email base64 attachment

wordpress - Mostrar archivos adjuntos de imágenes en línea con wp_mail



email base64 (3)

Tengo un problema.

Me gustaría adjuntar una imagen a un correo electrónico y también mostrarla en línea, con algún otro contenido generado por php. El problema es que no tengo la menor idea de cómo usar en línea una matriz de archivos adjuntos utilizada por wp_mail para adjuntar.

Mi solución fue codificar las imágenes en base64 y ponerlas en línea el html así:

<img alt="The Alt" src="data:image/png;base64,*etc*etc*etc" />

Pero el problema es que Gmail / Outlook elimina los datos src de la imagen. Entonces aterriza como

<img alt="The Alt" />

¿Alguna pista sobre qué modificar (los encabezados para trabajar con base64) o cómo usar el archivo adjunto para incrustarlos en línea?

Gracias, Radu.


Si obtiene un error T_FUNCTION inesperado, se debe a la versión de PHP <5.3. En ese caso, crea una función para hacerlo de una manera más tradicional:

function attachInlineImage() { global $phpmailer; $file = ''/path/to/file.jpg''; //phpmailer will load this file $uid = ''my-cool-picture-uid''; //will map it to this UID $name = ''file.jpg''; //this will be the file name for the attachment if (is_file($file)) { $phpmailer->AddEmbeddedImage($file, $uid, $name); } } add_action(''phpmailer_init'',''attachInlineImage'');


wp_mail usa la clase PHPMailer . Esta clase tiene toda la funcionalidad necesaria para los archivos adjuntos en línea. Para cambiar el objeto phpmailer antes de que wp_mail () envíe el correo electrónico, puede usar el filtro phpmailer_init .

$body = '' Hello John, checkout my new cool picture. <img src="cid:my-cool-picture-uid" width="300" height="400"> Thanks, hope you like it ;)'';

Ese fue un ejemplo de cómo insertar la imagen en tu cuerpo de correo electrónico.

$file = ''/path/to/file.jpg''; //phpmailer will load this file $uid = ''my-cool-picture-uid''; //will map it to this UID $name = ''file.jpg''; //this will be the file name for the attachment global $phpmailer; add_action( ''phpmailer_init'', function(&$phpmailer)use($file,$uid,$name){ $phpmailer->SMTPKeepAlive = true; $phpmailer->AddEmbeddedImage($file, $uid, $name); }); //now just call wp_mail() wp_mail(''[email protected]'',''Hi John'',$body);

Eso es todo.


Necesitaba esto de una manera mejor porque estoy enviando varios correos en un solo paso y no todos los correos deben tener las mismas imágenes incrustadas. Así que estoy usando esta solución de Constantin pero con mis modificaciones :-)

wp_mail(''[email protected]'', ''First mail without attachments'', ''Test 1''); $phpmailerInitAction = function(&$phpmailer) { $phpmailer->AddEmbeddedImage(__DIR__ . ''/img/header.jpg'', ''header''); $phpmailer->AddEmbeddedImage(__DIR__ . ''/img/footer.png'', ''footer''); }; add_action(''phpmailer_init'', $phpmailerInitAction); wp_mail(''[email protected]'', ''Mail with embedded images'', ''Example <img src="cid:header" /><br /><img src="cid:footer" />'', [ ''Content-Type: text/html; charset=UTF-8'' ], [ __DIR__ . ''/files/terms.pdf'' ]); remove_action(''phpmailer_init'', $phpmailerInitAction); wp_mail(''[email protected]'', ''Second mail without attachments'', ''Test 2'');

El primer wp_mail tendrá archivos adjuntos. El segundo wp_mail contendrá imágenes incrustadas. El tercer wp_mail tendrá archivos adjuntos.

Está funcionando bien por ahora 😎