Comment envoyer un e-mail HTML

25

Je crée un module simple qui enverra des e-mails HTML aux utilisateurs pour des offres sur notre site Web.

J'ai beaucoup cherché, mais je ne trouve pas de solution appropriée pour Drupal. Maintenant, je peux envoyer des mails mais en texte brut.

Qu'est-ce qu'une procédure étape par étape pour envoyer des e-mails HTML dans Drupal 7?

function example_form_submit( $form,&$form_state) {
    $friend_email=$form_state['values']['friend_email'];
    $mailto =$friend_email;  //gift to a friend
    $mailfrom ='[email protected]';
    $subject = "another message for  HTML email from example.com";
    $body="<h2 style='font-size:28px;color:red;'>Hello EMAIL, i here i want to be <b>bolded</b></h2>";
    if (drupal_mail('example', 'send_gift', $mailto, language_default(),$params,$mailfrom,TRUE)) {
        drupal_set_message(t('Your gift was sent successfully!!!'));
    }
    else {
        drupal_set_message(t('<font color="red">Error occured while sending your mail!!!</font>'));
    }


/****hook_mail*/
function example_mail($key,&$message,$params) {
    $language = $message['language'];
    switch ($key) {
        case 'send_gift':
            $message['subject']=t($params['subject'], $var, $language->language);
            $message['body'][]=$params['body'];
            $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
        break;
    }
}
mrcniceguy
la source
Vous ne
passez

Réponses:

22

Comme Geoff l'a mentionné, une option serait d'utiliser le module Mime Mail, mais vous pouvez également activer votre module personnalisé pour envoyer des e-mails HTML avec du code supplémentaire. En bref, vous devez modifier la mail_systemvariable et écrire votre propre implémentation de MailSystemInterface. Un exemple de cela est le code suivant.

Dans 'mymodule.install':

function mymodule_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('mymodule' => 'MymoduleMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function mymodule_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['mymodule']);
  variable_set('mail_system', $mail_system);
}

À l'intérieur de 'mymodule.module':

class MymoduleMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

Vous devez remplacer les instances de mymodule par le nom de votre module, puis désactiver et réactiver votre module pour que la variable soit modifiée, après quoi les choses devraient fonctionner. Pour un exemple complet, vous pouvez consulter ma réponse ici . De plus, cette page sur drupal.org est d'où j'ai obtenu à l'origine toutes les informations.

Madis
la source
2
j'ai suivi vos instructions + l'exemple complet que vous avez donné maintenant tout fonctionne ... Merci beaucoup.
mrcniceguy
7

Le module Mime Mail est presque certainement ce que vous recherchez.

Il s'agit d'un module composant Mime Mail (pour une utilisation par d'autres modules).

  • Il permet aux utilisateurs de recevoir des e-mails HTML et peut être utilisé par d'autres modules. La fonctionnalité de messagerie accepte un corps de message HTML, le mime-endcode et l'envoie.
  • Si le HTML contient des graphiques intégrés, ces graphiques sont codés MIME et inclus en tant que pièce jointe de message.
  • Adopte le style de votre site en incluant automatiquement les fichiers de feuilles de style de votre thème dans un format de message HTML à thème
  • Si la préférence du destinataire est disponible et qu'il préfère le texte en clair, le code HTML sera converti en texte brut et envoyé tel quel. Sinon, l'e-mail sera envoyé en HTML thématique avec une alternative en texte brut.
  • Vous permet de thématiser les messages avec une clé de messagerie spécifique.
  • Convertit les styles CSS en attributs de style en ligne.
  • Fournit des actions système simples et des actions de règles pour envoyer des e-mails HTML avec des images et des pièces jointes intégrées.
geoff
la source
5
j'ai téléchargé le module mimemail + système de messagerie ... seriez-vous gentil de bien vouloir expliquer pour appeler la fonction mimemail à mon module comme le code ci-dessus.
mrcniceguy
3

Vous pouvez également consulter le module Swift Mailer. Il vous permet d'envoyer des e-mails HTML avec des pièces jointes en ligne et régulières (telles que des images ou des fichiers). En outre, il est également capable de générer automatiquement des versions en texte brut basées sur l'e-mail HTML.

Vous pouvez le consulter http://www.drupal.org/project/swiftmailer

Pour mémoire: je suis l'auteur et le mainteneur du module.

sbrattla
la source
2

Vous n'envoyez pas de code HTML approprié, vous incluez uniquement les balises H1 et B, vous devez probablement également inclure des balises HTML complètes à partir de
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

GoodSp33d
la source
thx pour votre commentaire, j'ai utilisé l'exemple de @Dooshta, a également ajouté le bon html comme u l'a suggéré .. tout fonctionne.
mrcniceguy
Je suis sûr qu'il n'y a aucun mal à utiliser un doctype et à valider pleinement le HTML, mais il n'est pas nécessaire d'envoyer un e-mail HTML via drupal. Je viens de supprimer la balise doctype & html et l'e-mail bien affiché dans Gmail et Outlook. Cependant , il est très important d'avoir le correctif de Dooshta en place: avant de mettre en œuvre ces modifications, je ne pouvais pas du tout générer de code HTML.
doub1ejack
2

Aucune des réponses ci-dessus n'a fonctionné pour moi, alors voici mon point de vue sur la question d'origine.

Tout d'abord, installez et activez le module Mime Mail . Vous pouvez lire le fichier README.txt pour des instructions complètes sur la façon de l'utiliser. Je vais vous donner la version courte.

Vous devez activer Mime Mail pour votre module. Vous pouvez le faire en utilisant hook_enableou hook_update_Nen example.install:

function example_enable() {
  mailsystem_set(array(
    'example_send_gift' => 'MimeMailSystem',
  ));
}

Lorsque vous allez sur, admin/config/system/mailsystemvous verrez qu'une nouvelle entrée a été ajoutée pour votre module:

Exemple de classe de module (clé send_gift)

MimeMailSystem

Maintenant, vous n'avez plus besoin de spécifier d'en- text/htmltête, Mime Mail s'en charge. Vous n'avez donc pas besoin de cela:

$message['headers']['Content-Type'] = ...

Si vous le souhaitez, vous pouvez ajouter $message['plaintext']à votre courrier une alternative non HTML, mais cela n'est pas obligatoire.

C'est ça!

Wim Mostrey
la source