drupal_mail()の使い方

簡単にまとめているものがあまり無かったので、どなたかのお役に立てるようにメモ。

公式のAPIドキュメントはこちら。
http://api.drupal.org/api/drupal/includes--mail.inc/function/drupal_mail/6

ただし、意味がわかりにくい。


まず留意することとして、単純に

drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE);

の中に、直接パラメターをつけて無理やり、

drupal_mail('user', 'key', 'someone@something.com', 'en', array(), 'me@something.com', TRUE);

のような呼び出し方をしてもダメだ、ということ。

そうではなく、hook_mail()を自分で作らないといけない。

Drupalでhookと聞くとウンザリするかもしれないが、それほど難しく考える必要な無い。まず、適当な自作モジュールを作る。ディレクトリと、.moduleファイル、.infoファイルがあればモジュールになる。

で、その.moduleファイルの中にこんな感じのXXX_mail()という関数を定義する。

$message['subject']の中にメールの件名が、$message['body']が本文になる。

function MODULE_NAME_mail( $key, &$message, $params ) {

    $data['user'] = $params['account'];
    $options['language'] = $message['language'];
    user_mail_tokens($variables, $data, $options);

    switch($key) {
      case 'gift-sent':
        $langcode = $message['language']->language;
        $message['subject'] = t('This is test');
        $message['body'] = t("This is test body");
        
        break;
    }
}

これで、drupal_mail()を呼ぶ準備ができる。
さて、実際の呼び出しは別のところ、メールを送りたい部分のコードに、まずは送るパラメターの配列を定義。空っぽだとエラーになるので、とくに必要なくても要素をひとつだけいれた連想配列を作っておく。

$params = array('dummy' => 'aaaaaa');
drupal_mail('MODULE_NAME', 'gift-sent', 'mailto@someone.com', language_default(), $params, variable_get('site_mail', null), true );

これでメールアドレスの間違いや、SMTPのサーバー側の設定に問題なければdrupal_mail()を使ってメールを送ることができる。
1番目の引数はhook_mailを定義した自作モジュール名。
2番目の引数の'gift-sent'が大切で、コード内の$keyとして処理される。switch文のところ要注意。
あとは上に書いたとおり、5番目の引数の$paramsが空だとエラーになる。commons.incとかlocale.incのあたりでillegal offset typeとかのエラーになる。

ちなみにメールの本文やらに変数を定義して、同じ文章を別々の人に使いまわすテンプレートにしたい場合は以下のようにする。

function MODULE_NAME_mail( $key, &$message, $params ) {
    $data['user'] = $params['account'];
    $options['language'] = $message['language'];
    user_mail_tokens($variables, $data, $options);

    switch($key) {
      case 'gift-sent':
        $langcode = $message['language']->language;
        $message['subject'] = t('This is test from !sender_firstname', $params);
        $message['body'] = t("Dear !firstname !lastname,\n\nYou received a gift coupon from your friend !sender_firstname !sender_lastname.", $params);
        
        break;
    }
}

違いは$message['subject']と$message['body']のt()に追加でもう1つパラメターを送る。ここでは$paramsがそれにあたるが、これには変数とその値の連想配列が入る。この方法での呼び出しは以下の通り。

$params = array(
  '!firstname' => 'Keiichi',
  '!lastname' => 'Maebara',
  '!sender_firstname' => 'Kuraudo',
  '!sender_lastname' => 'Oishi',
);
drupal_mail('MODULE_NAME', 'gift-sent', 'mailto@someone.com', language_default(), $params, variable_get('site_mail', null), true );

こうすると、

Dear !firstname !lastname,
You received a gift coupon from your friend !sender_firstname !sender_lastname.

が、

Dear Keiichi Maebara,

You received a gift coupon from your friend Kuraudo Oishi.

として送られる。メールの件名にも同じように使えるので、上の例だと、

This is test from Kuraudo

がメールの件名になる。

これでもうdrupal_mail()は怖くない!