Invio di email HTML con allegato tramite wp_mail()
Dovrebbe essere semplice, ma non riesco a capire come fare. Voglio inviare un'email formattata in HTML che ha anche un allegato. L'allegato viene inviato correttamente, ma il messaggio viene consegnato come testo semplice, così:
<p>Ciao!</p>
<p> </p>
<p>Un po' di testo.</p>
<p> </p>
<p>Cordiali saluti,</p>
<p>Team</p>
Se fosse un'email senza allegato, potrei forzare l'invio in html modificando l'header come descritto qui. Ma ora ho bisogno che il content type sia multipart/mixed (giusto?). Quindi la mia domanda è: come posso convincere wp_mail()
a inviare i miei messaggi come html e includere l'allegato?

Link di riferimento clicca qui.
Utilizzando il codice qui sotto puoi inviare la mail in formato HTML.
$to = 'sendto@example.com';
$subject = 'Oggetto della mail';
$body = 'Contenuto del corpo della mail';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );
// Per allegati
$attachments = array( WP_CONTENT_DIR . '/uploads/file_to_attach.zip' );
$headers = 'From: Il Mio Nome <myname@example.com>' . "\r\n";
wp_mail( 'test@example.org', 'oggetto', 'messaggio', $headers, $attachments );

Credo che la risposta nel tuo caso specifico non riguardi il bug menzionato nel thread linkato. Non è necessario impostare intestazioni personalizzate per ottenere ciò che dichiari di voler fare.
Invece, puoi semplicemente impostare il corpo alternativo come testo utilizzando $phpmailer->AltBody
. Questo imposta automaticamente il tipo di contenuto a multipart/alternative
(non multipart/mixed) e lasci che la classe phpmailer
si occupi del resto senza la necessità di impostare manualmente intestazioni personalizzate.
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);
Se aggiungi allegati, il tipo di contenuto complessivo diventerà automaticamente multipart/mixed
con multipart/alternative
all'interno che contiene le parti text/plain
e text/html
, seguite dagli allegati.
Puoi anche aggiungere allegati multipart/related
(inline) come immagini passandoli a wp_mail
tramite $attachements
(con il 5° parametro come 'inline') - oppure dichiarandoli direttamente all'interno del corpo HTML. Per quanto ne so, questi non saranno accessibili nella versione testuale.

come indicato nel link che hai pubblicato:
Il tipo di contenuto predefinito è 'text/plain' che non consente l'utilizzo di HTML. Tuttavia, puoi impostare il tipo di contenuto dell'email utilizzando il filtro 'wp_mail_content_type'.
Aggiungendo questo a functions.php, come indicato in wp_mail_content_type:
add_filter( 'wp_mail_content_type', 'set_content_type' );
function set_content_type( $content_type ) {
return 'text/html';
}
Dovrebbe risolvere il problema.
