web-dev-qa-db-fra.com

Envoi d'e-mails HTML avec pièce jointe avec wp_mail ()

Celui-ci devrait être facile, mais je ne peux pas le comprendre. Je souhaite envoyer un courrier électronique au format HTML, mais comportant également une pièce jointe. La pièce jointe est correctement envoyée, mais le message est remis en texte clair, comme ceci:

<p>Hello!</p>
<p>&nbsp;</p>
<p>Some text.</p>
<p>&nbsp;</p>
<p>Best wishes,</p>
<p>Team</p>

S'il s'agissait d'un courrier électronique sans pièce jointe, je le forcerais à envoyer du HTML en modifiant l'en-tête comme décrit ici . Mais maintenant, j'ai besoin que le type de contenu soit composé de plusieurs parties/mixtes (non?). Ma question est donc la suivante: comment convaincre wp_mail() d’envoyer mes messages au format HTML et d’inclure la pièce jointe?

1
Maija Vilkina

Lien de référence cliquez ici .

En utilisant le code ci-dessous, vous pouvez envoyer le courrier au format html.

$to = '[email protected]';
$subject = 'The subject';
$body = 'The email body content';
$headers = array('Content-Type: text/html; charset=UTF-8');

wp_mail( $to, $subject, $body, $headers );

// For attachment 

$attachments = array( WP_CONTENT_DIR . '/uploads/file_to_attach.Zip' );
$headers = 'From: My Name <[email protected]>' . "\r\n";

wp_mail( '[email protected]', 'subject', 'message', $headers, $attachments );
2
Naveen

Je crois que la réponse dans votre cas particulier ne concerne pas le bogue mentionné dans le fil de discussion lié. Il n'est pas nécessaire de définir en-têtes personnalisés pour réaliser ce que vous déclarez vouloir faire.

Au lieu de cela, vous définissez simplement le corps alternatif en tant que texte en utilisant $phpmailer->AltBody. Cela définit automatiquement le type de contenu multipart/alternative (non multipart/mixed) et vous permettez à la classe phpmailer de s'occuper du reste sans de devoir définir manuellement les en-têtes personnalisés.

add_action('phpmailer_init','wp_mail_set_text_body');
function wp_mail_set_text_body($phpmailer) {
     $phpmailer->AltBody = strip_tags($phpmailer->Body);
}

$to = '[email protected]';
$headers = array();
$attachments = array(dirname(__FILE__).'/test.txt');
wp_mail($to,$subject,$message,$headers,$attachments);

Si vous ajoutez des pièces jointes, le type de contenu global devient automatiquement multipart/mixed avec multipart/alternative à l'intérieur de ce wchi contenant les parties text/plain et text/html, suivies des pièces jointes.

Vous pouvez également ajouter des pièces jointes multipart/related (en ligne), telles que des images, en les transmettant à wp_mail via $attachements (avec le cinquième paramètre comme "inline") - ou même en les déclarant dans le corps HTML lui-même. Celles-ci ne seront pas accessibles à la version texte pour autant que je sache.

1
majick

comme indiqué dans le lien que vous avez posté :

Le type de contenu par défaut est ‘text/plain’, ce qui ne permet pas l’utilisation de HTML. Toutefois, vous pouvez définir le type de contenu de l’e-mail en utilisant le filtre "wp_mail_content_type".

Ajouter ceci à functions.php, comme indiqué dans wp_mail_content_type :

add_filter( 'wp_mail_content_type', 'set_content_type' );
function set_content_type( $content_type ) {
    return 'text/html';
}

Devrait faire l'affaire.

0
flero