Le 02 mai 2022

L'envoi d'e-mails avec Drupal recquiert deux étape.

  • La première consiste à définir un modèle pour l'e-mail dans notre module. Pour être plus précis, il s'agit pas un modèle au sens traditionnel du terme, mais plutôt d'un "wrapper de données procédurales". Ce "wrapper" est désigné comme la clé ou l'ID du message et il est défini à l'intérieur d'un "hook - hook_mail()" de votre module.
  • La deuxième étape consiste à utiliser le gestionnaire de messagerie de Drupal pour envoyer l'e-mail en utilisant l'un des modèles définis et en spécifiant le module qui le définit. Le MailManager est un gestionnaire de plugins qui est également responsable de envoyer les e-mails à l'aide d'un système de messagerie (plugin). Le système de messagerie par défaut est PhpMail, qui utilise la fonction native mail() de PHP pour envoyer des e-mails.

Si nous voulions créer notre propre système de messagerie, cela signifierait créer un nouveau plugin. 
Chaque plugin de messagerie doit implémenter MailInterface, qui expose deux méthodes : format() et mail().

  • Le premier s'occupe de la préparation initiale du contenu du mail (concaténation des messages, etc.),
  • le dernier finalise l'envoi.

Exemple de hook_mail  dans le fichier mymodule.module :

/**
 * Implements hook_mail().
 */
function mymodule_mail($key, &$message, $params) {
  switch ($key) {
    case 'new_user':
      $message['from'] = \Drupal::config('system.site')->get('mail');
      $message['subject'] = $params['subject'];
      $message['body'][] = $params['message'];
      $message['options'] = [];
      if (isset($params['options']) && !empty($params['options'])) {
        foreach ($params['options'] as $key => $value) {
          $message['options'][$key] = $value;
        }
      }
      break;
  }
}

 

Exemple d'utilisation du gestionnaire de messagerie par défaut :

Ce code peut, par exemple, se placer dans un fichier d'une classe qui étend  ControllerBase (dans le cas d'un contrôleur) ou une classe qui étend Formbase (dans le cas d'un formulaire)

      $sitename = \Drupal::config('system.site')->get('name');
      $langcode = \Drupal::config('system.site')->get('langcode');
      $module = 'coosubscribe';
      $key = 'new_user';
      $to = "y.douenel@coopernet.fr";
      $reply = NULL;
      $send = TRUE;
      $host = \Drupal::request()->getHost();

      $params['subject'] = t("Inscription du nouvel utilisateur n° " . $user->id());
      $params['options']['username'] = $user->id();
      $params['options']['title'] = t("Création de l' utilisateur n° " . $user->id());
      $params['message'] = t("Modifier l'utilisateur :  " . $host . "/user/" . $user->id() . "/edit", ['@sitename' => $sitename]);

      $mailManager = \Drupal::service('plugin.manager.mail');
      $mailManager->mail($module, $key, $to, $langcode, $params, $reply, $send);