Invio di email HTML con allegato tramite wp_mail()

23 mag 2016, 14:46:21
Visualizzazioni: 29.3K
Voti: 1

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>&nbsp;</p>
<p>Un po' di testo.</p>
<p>&nbsp;</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?

6
Commenti

qual è il risultato quando imposti il content type su text/html tramite il filtro fornito? https://developer.wordpress.org/reference/hooks/wp_mail_content_type/

majick majick
23 mag 2016 15:41:39

Ti sei imbattuto in una specie di bug che deve ancora essere risolto ufficialmente nel core. Per fortuna c'è una patch che puoi aggiungere e fondamentalmente stai per entrare in un serio mal di testa (huvudvärk) ma per fortuna ho ridotto il dolore per te nella mia spiegazione su come funzionano i messaggi multipart con wp_mail() nella mia domanda: http://wordpress.stackexchange.com/questions/191923/sending-multipart-text-html-emails-via-wp-mail-will-likely-get-your-domain-b -- Buona fortuna!

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

@majick : è un messaggio multipart/mixed. Non può avere il content type 'text/html'.

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

@ChristineCooper : sì, ho letto quella discussione, speravo solo che ci fosse un modo migliore per risolvere questa cosa ormai. Uffa. :( Penso che per ora userò il testo semplice per il contenuto.

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

quel bug non dovrebbe impedirti di fare quello che stai chiedendo però, vedi la risposta (e una aggiunta all'altra discussione che identifica la causa.)

majick majick
25 mag 2016 10:22:49

Consulta questo articolo https://www.phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress/

Mr.Happy Mr.Happy
4 ott 2020 15:40:47
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 3
1

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

Se leggi attentamente, vedrai che questa non è una risposta alla mia domanda.

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

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.

24 mag 2016 17:35:27
1

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.

23 mag 2016 15:43:28
Commenti

Non era quello che chiedevo.

Maija Vilkina Maija Vilkina
23 mag 2016 18:30:18