Ainsi, comme l'explique le titre, lors de l'envoi d'un e-mail HTML avec drupal_mail (), l'e-mail est livré sans balises HTML.
$module = 'module';
$key = 'contact_message';
$language = language_default();
$params = array();
$email = '[email protected]';
$from = variable_get('site_mail', '[email protected]');
$send = TRUE;
$message = drupal_mail($module, $key, $email, $language, $params, $from, $send);
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8';
$message['subject'] = 'Test';
$message['body'] = array();
$message['body'][] = '<a href="#">Testing anchor in mail</a>';
$system = drupal_mail_system($module, $key);
$message = $system->format($message);
$message['result'] = $system->mail($message);
Et lorsque vous recevez l'e-mail et que vous affichez la source:
Message-Id: <[email protected]>
X-Authentication-Warning: testserver : www-data set sender to [email protected] using -f
To: [email protected]
Subject: Test
X-PHP-Originating-Script: 1000:system.mail.inc
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8Bit
X-Mailer: Drupal
Sender: [email protected]
From: [email protected]
Testing anchor in mail [1]
[1] #
Vous pouvez donc voir que toutes les balises HTML ont été supprimées. Et peu importe les balises HTML que je mets dans le corps.
Je pensais que cela pourrait être lié à Text Fomats, mais j'ai des filtres actifs "HTML filtré" et "HTML complet" avec toutes les autorisations.
Ce qui m'a dérouté, ce sont les factures Ubercart. Au début, ils ont été envoyés avec HTML, puis à un moment donné, cela s'est arrêté. Ils ont reçu du texte brut. Après avoir creusé un peu la réponse @develkar, je l'ai trouvé dans l'une des mises à jour d'ubercart:
/**
* Installs HTML Mail System for Ubercart.
*/
function uc_store_update_7004() {
// Set mail handler for all Ubercart modules
variable_set('mail_system',
array_merge(
variable_get('mail_system', array('default-system' => 'DefaultMailSystem')),
array(
'uc_cart' => 'UbercartMailSystem',
'uc_order' => 'UbercartMailSystem',
'uc_file' => 'UbercartMailSystem',
'uc_roles' => 'UbercartMailSystem',
'uc_stock' => 'UbercartMailSystem',
'uc_store' => 'UbercartMailSystem',
)
)
);
}
Je suppose qu'à un moment donné, l'un des modules installés (je soupçonne le module SMTP) a outrepassé cette variable, et c'est pourquoi les e-mails provenaient de texte brut. Après avoir exécuté à nouveau cette mise à jour manuellement, les factures Ubercat sont à nouveau HTML.
Pour le reste des e-mails, je vais devoir installer certains modules comme suggéré dans d'autres réponses.
Merci.
drupal_mail () , envoie par défaut un mail en texte brut.
Si vous imprimez le tableau $message['headers']
, Vous obtiendrez quelque chose comme:
array(
'MIME-Version' => '1.0',
'Content-Type' => 'text/plain; charset=UTF-8; format=flowed; delsp=yes',
'Content-Transfer-Encoding' => '8Bit',
'X-Mailer' => 'Drupal',
);
Comme vous pouvez le voir, le Content-Type
Dans l'en-tête du courrier est text/plain; charset=UTF-8; format=flowed; delsp=yes
. Vous pouvez essayer en modifiant cet en-tête dans hook_mail_alter () , vous pouvez utiliser l'un des modules qui vous permet d'envoyer le courrier au format HTML, comme HTML Mail , ou - Mime Mail .
Modifier:
Suite aux commentaires de @Ayesh et @alechko et après avoir examiné les API, j'ai découvert que les en-têtes ne sont pas la seule raison pour envoyer le courrier en texte brut. Parce que drupal_mail()
fait un appel interne à drupal_mail_system () , qui retourne un objet qui implémente l'interface MailSystemInterface . La méthode format()
implémentée par drupal_mail_system()
est responsable de la suppression du code HTML des e-mails. Ainsi, même si les en-têtes du courrier indiquent que les formats sont HTML, les courriers ne seront envoyés qu'en texte brut. Donc, je suppose que l'on ne pouvait pas envoyer de courrier HTML en utilisant drupal_mail()
. Vous devriez chercher une autre alternative (module) mentionnée ci-dessus.
Dans hook_mail également, vous pouvez définir les en-têtes comme texte/html, puis vous recevrez le courrier au format html, comme par exemple:
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
Essayez avec le module HTML Mail installé et configuré.
Vous permet de thème vos messages de la même manière que vous le thème du reste de votre site Web.
Peu importe ce que l'en-tête Content-Type est, le système de messagerie par défaut de Drupal convertit le HTML en texte brut. Voir DefaultMailSystem :: format () dans mail.inc
<?php
public function format(array $message) {
// Join the body array into one string.
$message['body'] = implode("\n\n", $message['body']);
// Convert any HTML to plain-text.
$message['body'] = drupal_html_to_text($message['body']);
// Wrap the mail body for sending.
$message['body'] = drupal_wrap_mail($message['body']);
return $message;
}
Pour envoyer allow html dans le corps du message, vous devrez:
Dites à Drupal que vous souhaitez utiliser votre classe de système de messagerie personnalisée
variable_set('mail_system', array('default-system' => 'ExampleMailSystem'));
Définissez l'en-tête Content-Type de "text/plain" sur "html/plain"
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
Cette documentation sur d.o. fait un bon travail de description de la solution et de donner un exemple.