[Drupal] メールを送信する


やりたいこと

記事タイプのノードが保存されたら管理者にメールを送る

やり方

/**
 * Implements hook_ENTITY_TYPE_presave().
 */
function my_module_node_presave(NodeInterface $node) {
  if ($node->bundle() === 'article') {
    $mail_manager = \Drupal::service('plugin.manager.mail');
    $result = $mail_manager->mail(
      'my_module', // このメールに対応するhook_mailを持つモジュールのマシン名.
      'my_module_node_save_mail', // メールを識別するためのキー.
      \Drupal::config('system.site')->get('mail'), // 送信先.
      \Drupal::config('system.site')->get('langcode'), // 言語コード.
      ['nid' => $node->id()] // メールの中で使用する変数等.
    );

    if (!$result) {
      // エラーのログ等.
    }
  }

}

/**
 * Implements hook_mail().
 */
function my_module_mail($key, &$message, $params) {
  if ($key === 'my_module_node_save_mail') {
    // $mail_manager->mail()の第5引数で指定した値を$paramから取得できる.
    $nid = $params['nid'];

    // 送信元、タイトル、本文などを定義する.
    $message = [
      'from' => \Drupal::config('system.site')->get('mail'), // 送信元.
      'title' => 'ノードが更新されました。', // タイトル.
      'body' => "NID{$nid}のノードが更新されました。", // 本文.
    ];
  }
}

必ずhook_mailを経由しないといけない & fromとtoの定義場所がバラバラなのがわかりづらい。Simple Mailというモジュールを使うと簡略化できるようです。

 simple_mail_send($from, $to, $subject, $body);