2013/12/06

CakePHPでのメール配信

CakePHPにはメール配信を簡単に行うためのEmailComponentが存在しますが、2.0系からは新しくCakeEmailクラスが追加され、より細かい調整ができるようになったとの事なので、CakeEmailを使っていくほうがいいようです。今回はこれを使ってちゃっちゃとメール配信の機能を付けてみたいと思います。



EmailComponentの後釜

色々調べていると、EmailComponentを使う解説とCakeEmailを使う解説があるみたいですが、CookBookには

This class replaces the EmailComponent and gives more flexibility in sending emails. For example, you can create your own transports to send email instead of using the provided SMTP and Mail transports.

とあります。最初のThis classというのはCakeEmailのことです。さらっと訳すと、CakeEmailはEmailComponentを置き換えて、より柔軟性のあるメール配信機能を与えてくれるクラス、とのことです。


とりあえず動かしてみる

ただ使うだけなら非常に簡単で、CakeEmailをnewして宛先や送信元、タイトル、本文、送信するメールサーバーの情報などをセットすれば後は送信するだけです。
// ファイルの始めに記述する
App::uses('CakeEmail', 'Network/Email');

// ここからはメール配信したいところに記述する
$Email = new CakeEmail();
$Email->from(array('sender`example.com'=> 'sender'));
$Email->to('receive@example.com');
$Email->subject('title');
$Email->send('message');

これで送信が完了します。
しかしこの場合は、localhostに適切なMTAがインストールされていて送信できる状態になっている場合です。

PHPでは珍しく、メソッドチェーンが使えるようです。
上のコードをメソッドチェーンを使うように書き換えると、以下のようになります。
$Email = new CakeEmail();
$Email->from(array('sender@example.com'=> 'sender'))
    ->to('receive@example.com')
    ->subject('title')
    ->send('message');

//一行で書くと
$Email->from(array('sender@example.com'=> 'sender'))->to('receive@example.com')->subject('title')->send('message');

cookbookには
all of the setter methods return the instance of class.
となっており、セッターメソッドだけがチェーンできるようです。しかし、実際のところ、CakeEmailのメソッドはほとんどがセッターメソッドなのであまり気にしなくてもいいと思いますが、不安な場合は軽くソースを覗いて、return $this;になっているかを見れば分かります。


もう少し本格的に使ってみる

CakeEmailは別のサーバーのMTAやGmailのようなサービスを使うという事も簡単にできるのも魅力的です。cookbookにはGmailを使ってメール送信する場合の例が載っています。
自前のサーバーで送信する場合もホスト名、ポート番号、ログインするユーザー名、パスワード、送信方法を追加で設定するだけでだいたいのサーバーから送信することができます。GmailのようなTLSを使った送信や587番ポートを使った送信なども問題なしです。
$Email = new CakeEmail();
$Email->from(array('sender@example.com'=> 'sender'))
    ->to('receive@example.com')
    ->subject('title')
    ->host('mail.example.com')
    ->port(587)
    ->username('sender@example.com')
    ->password('password')
    ->transport('Smtp')
    ->send('message');


設定を外出ししてみる

セッターメソッドに乗せて設定する項目は、設定ファイルに外出しするとスッキリしますね。
CakePHPでももちろん、mail用のコンフィグファイルが準備されていて、DB接続用のapp/Config/database.phpと同じディレクトリにemail.php.defaultというファイルを利用します。
利用する前に、ファイルをemail.phpにリネームしておきます。

リネームしたemail.phpを覗いてみると、EmailConfigというまんまなクラスが存在します。
設定は用途によって複数セットできるようになっています。
デフォルトでは、$default、$smtp、$fastの3つが容易されています。
自分の設定を追記する場合は、パブリックな配列を$defaultなどの後ろに追加して、連想配列で設定を書きます。
$fastという設定は、設定できる項目が網羅されているので、これを叩き台にして、必要な部分を書き換えていくといいです。


レイアウトとビューを利用してみる

CakePHPでは、メールにもレイアウトとビューの概念がそのまま使えます。
View/Layoutsを覗いてみると、ずばりEmailsというディレクトリが存在します。
さらにその中を見てみると、htmlとtextという2つのディレクトリがあります。
これはHTMLメールとプレーンテキストメールに対応するレイアウトファイルを設置するディレクトリです。

次に、View/Emailsというビューファイルを設置するディレクトリを見てみると、そこにもhtmlとtextのディレクトリがあります。
こちらも同じくHTMLメールとプレーンテキストメールに対応します。
htmlディレクトリの中にあるdefault.ctpを開くと、最低限HTMLの体裁が書かれたファイルがあります。
これにとりあえずテキストデータを流し込むと、改行ごとに区切ってpタグでそれぞれ囲ってくれます。
これだけで単なるプレーンテキストのメールと大差ないですが、一応HTMLの形をしたメールが配信できます。


色々設定してみる

設定項目は他にもたくさんありますが、別のメールサーバー経由でメール配信することもできますし、ファイル添付することもできます。
ファイル添付するのも非常に簡単で、添付するファイルを用意したら、以下のように設定するだけです。
$Email = new CakeEmail();
// なんやかんや
$Email->attachments('/path/to/file');

これだけでファイル添付できます。また、attachmentsは名前から分かるとおり、複数のファイルを添付することもできます。
$Email = new CakeEmail();
// なんやかんや
$Email->attachments(array('/path/to/file1', '/path/to/file2'));

ファイル名を送信先ごとに変えたいとか、どうしても恥ずかしい名前を付けたファイルを送らないといけない場合には、添付ファイルに別名を付けて送ることもできます。
$Email = new CakeEmail();
// なんやかんや
$Email->attachments(array('hoge'=> '/path/to/embarrassingName'));
// もちろんArrayで複数設定できる
$Email->attachments(array('hoge'=> '/path/to/embarrassingName1', 'fuga'=> '/path/to/embarrassingName2'));

上記の場合は、添付したファイル名は「hoge」、「fuga」になります。


で、フレームワーク的な問題としては、添付ファイルをどこに置くのが一番適切なのかという事ですが、私が確認したところ決まりはないようです。
かと言って、フレームワーク外に置くのは困ったことになりかねないですし、Webroot/imgディレクトリに置くのもちと違う気もします。
無難にVendorディレクトリにimgとか作って配置するのがよろしいかと思いますが、皆様どうでしょう?


CakeEmailクラスの使い勝手はいいと思いますが、ソースコードを読んでいるとCakePHP本体とは少し書き方の趣が違う印象を受けます。おそらくCakeEmail自体が2.0系で導入された新しいコードだからだと思います。自分の書いたコードでも、年代順に見てみると、流行り廃りが垣間見えて面白く、恥ずかしくてムズムズします。:-P

日本語メール独特のエンコード(SHIFT-JISやISO-2022-JPなど)もあらかじめセットされている辺りでも分かるように、日本語環境でも扱いやすいように作られているようなので、積極的に使いたいですね。

参考:
CakeEmail — CakePHP Cookbook v2.x documentation

see also:
[PHP]今更のCakePHPまとめ
CakePHPをガリガリ書くためのEclipse設定
CakePHPの細かいTIPS Twitter Bootstrapとの絡みとか
CakePHPのflash Messageをいじる
CakePHPでもテスト ~手を抜くためにする遠回り~


0 件のコメント:

コメントを投稿