web-dev-qa-db-fra.com

drupal_mail () supprime toutes les balises html des e-mails

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.

7
alechko

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.

10
AjitS

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';
3
Ankita

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.

2
arpitr

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:

  1. créer une classe de système de messagerie personnalisée qui implémente MailSystemInterface qui a une méthode de formatage qui ne convertit pas le code HTML en texte brut
  2. Incluez cette nouvelle classe dans votre fichier modules.info
  3. Dites à Drupal que vous souhaitez utiliser votre classe de système de messagerie personnalisée

    variable_set('mail_system', array('default-system' => 'ExampleMailSystem'));

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

https://www.drupal.org/docs/7/converting-drupal-6-modules-to-drupal-7/creating-html-formatted-emails-in-drupal-7#comment-11792179

0
aczietlow