Enviar email HTML con archivo adjunto usando wp_mail()
Esto debería ser fácil, pero no logro resolverlo. Quiero enviar un correo electrónico con formato HTML, pero que también tenga un archivo adjunto. El archivo adjunto se está enviando correctamente, pero el mensaje se entrega como texto plano, así:
<p>¡Hola!</p>
<p> </p>
<p>Algún texto.</p>
<p> </p>
<p>Saludos cordiales,</p>
<p>Equipo</p>
Si fuera un correo sin archivo adjunto, lo forzaría a enviar HTML cambiando el encabezado como se describe aquí. Pero ahora necesito que el tipo de contenido sea multipart/mixed (¿correcto?). Entonces mi pregunta es: ¿cómo convenzo a wp_mail()
para que envíe mis mensajes como HTML e incluya el archivo adjunto?

Enlace de referencia haz clic aquí.
Utilizando el siguiente código puedes enviar el correo en formato HTML.
$to = 'sendto@example.com';
$subject = 'El asunto';
$body = 'El contenido del cuerpo del correo';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );
// Para adjuntos
$attachments = array( WP_CONTENT_DIR . '/uploads/archivo_adjunto.zip' );
$headers = 'From: Mi Nombre <minombre@example.com>' . "\r\n";
wp_mail( 'test@example.org', 'asunto', 'mensaje', $headers, $attachments );

Creo que la respuesta en tu caso particular no implica el error mencionado en el hilo enlazado. No es necesario configurar encabezados personalizados para lograr lo que indicas que quieres hacer.
En su lugar, simplemente establece el cuerpo alternativo como texto usando $phpmailer->AltBody
. Esto automáticamente establece el tipo de contenido a multipart/alternative
(no multipart/mixed) y permites que la clase phpmailer
se encargue del resto sin necesidad de configurar encabezados personalizados manualmente.
add_action('phpmailer_init','wp_mail_set_text_body');
function wp_mail_set_text_body($phpmailer) {
$phpmailer->AltBody = strip_tags($phpmailer->Body);
}
$to = 'me@example.com';
$headers = array();
$attachments = array(dirname(__FILE__).'/test.txt');
wp_mail($to,$subject,$message,$headers,$attachments);
Si agregas archivos adjuntos, el tipo de contenido general automáticamente se convertirá en multipart/mixed
con multipart/alternative
dentro de este, que contiene las partes text/plain
y text/html
, seguidas por los archivos adjuntos.
También puedes agregar archivos adjuntos multipart/related
(incrustados) como imágenes pasándolos a wp_mail
mediante $attachments
(con el quinto parámetro como 'inline') - o incluso declarándolos dentro del cuerpo HTML mismo. Estos no serán accesibles para la versión de texto hasta donde yo sé.

como se menciona en el enlace que publicaste:
El tipo de contenido predeterminado es 'text/plain' que no permite usar HTML. Sin embargo, puedes establecer el tipo de contenido del correo electrónico utilizando el filtro 'wp_mail_content_type'.
Añadiendo esto al functions.php, como se indica en wp_mail_content_type:
add_filter( 'wp_mail_content_type', 'set_content_type' );
function set_content_type( $content_type ) {
return 'text/html';
}
Debería funcionar.
