Enviar email HTML con archivo adjunto usando wp_mail()

23 may 2016, 14:46:21
Vistas: 29.3K
Votos: 1

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>&nbsp;</p>
<p>Algún texto.</p>
<p>&nbsp;</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?

6
Comentarios

¿cuál es el resultado cuando configuras el tipo de contenido a text/html mediante el filtro proporcionado? https://developer.wordpress.org/reference/hooks/wp_mail_content_type/

majick majick
23 may 2016 15:41:39

Has encontrado una especie de error que aún no se ha solucionado oficialmente en el núcleo. Afortunadamente, hay un parche que puedes añadir y básicamente estás a punto de enfrentarte a un dolor de cabeza serio (huvudvärk), pero por suerte he disminuido el dolor para ti en mi explicación sobre cómo funcionan los mensajes multiparte con wp_mail() en mi pregunta: http://wordpress.stackexchange.com/questions/191923/sending-multipart-text-html-emails-via-wp-mail-will-likely-get-your-domain-b -- ¡Mucha suerte!

Christine Cooper Christine Cooper
23 may 2016 17:11:29

@majick : es un mensaje multiparte / mixto. No puede tener el tipo de contenido 'text/html'.

Maija Vilkina Maija Vilkina
23 may 2016 18:32:02

@ChristineCooper : sí, leí ese hilo, solo esperaba que hubiera una mejor manera de resolver esto ahora. Ugh. :( Creo que usaré texto plano para el contenido por ahora.

Maija Vilkina Maija Vilkina
23 may 2016 18:32:59

ese error no debería afectar tu capacidad para hacer lo que estás preguntando, mira la respuesta (y una agregada al otro hilo que identifica la causa).

majick majick
25 may 2016 10:22:49

Consulta este artículo https://www.phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress/

Mr.Happy Mr.Happy
4 oct 2020 15:40:47
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 3
1

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 );
23 may 2016 17:00:46
Comentarios

Si lees con atención, verás que esto no es una respuesta a mi pregunta.

Maija Vilkina Maija Vilkina
23 may 2016 18:30:05
0

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é.

24 may 2016 17:35:27
1

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.

23 may 2016 15:43:28
Comentarios

No es lo que estaba preguntando.

Maija Vilkina Maija Vilkina
23 may 2016 18:30:18