なんだかブログが日記じゃなくなっていく、小堤です。
さて、今回はアクションクラスに新搭載された「メーラー機能」についての説明です。
メーラー機能
アクション内でメール送信やメール受信を行うためのクラスインスタンス(プロパティ)の使い方について説明します。
メーラーオブジェクトへのアクセス
$this->U->mailer
mailerオブジェクト以下にメーラー機能のメソッドが実装されています。
メール送信
簡単なメール送信
TO、FROM、題名、内容のシンプルなメール送信の例を示します。
例:
$this->U->mailer->send(
‘to@xxxxxxxx.com’,
‘from@xxxxxxxxx.com’,
‘テスト題名,
‘本文だよー’ . PHP_EOL . ‘本文二行目だよー。’
);
本文は、PHP_EOLまたは、”\n”の改行で改行されます。
メール送信に失敗した場合、sendメソッドの戻り値がfalseを返します。
複数人にメールを送信する
TO、そしてCC、BCCに送信する方法と、それぞれに対して複数に対して送信する場合の例です。
例:
$this->U->mailer->send(
array(
‘TO1です <to1@xxxxxxxx.com>’,
‘TO2です <to2@xxxxxxxx.com>’
),
‘from@xxxxxxxx.com’,
‘テスト題名’,
‘本文だよー’ . PHP_EOL . ‘本文二行目だよー。’,
array(
‘cc’ => array(
‘CC1です。 <cc1@xxxxxxxx.com>’,
‘CC1です。 <cc2@xxxxxxxx.com>’
),
‘bcc’ => array(
‘BCC1 <bcc1@xxxxxxxx.com>’,
‘BCC2 <bcc2@xxxxxxxx.com>’
)
)
);
TOは、配列で指定することで複数人に送信できます。
また、「名前 <メールアドレス>」という形式で、日本語の名前にも対応したメール送信が可能です。
第五引数の配列で、キーにcc,bccを指定して、内要素に配列で送信先一覧を指定できます。
メールアドレスのみ、名前+メールアドレスの形式はTOと同様です。
テンプレートを利用してメール送信する
文面をテンプレートして保存しておき、Smartyタグを埋め込み、個別に送信した場合、下記のようにすることで実現できます。
例:
$this->U->mailer->send(
array(
‘TO1 <to1@xxxxxxxx.com>’
),
‘FROMさん <from@xxxxxxxx.com>’,
‘テスト題名!’,
XF_APPLICATION_PATH . ‘/_templates/testmail.tpl’,
array(
‘tpl’ => true,
‘data’ => array(
‘name’ => ‘テスト 太郎’
)
)
);
本文にテンプレートまでのパスを指定します。上記の例ではWRIRoot以下の_templates/testmail.tplを使用します。
第五引数に、tpl,dataキーを作成し、tplにはtrueを。dataには、キー+データ形式のアサインしたいデータを指定します。
上記の場合、{$name}とテンプレートに記述することで、「テスト 太郎」と埋め込まれ、メール本文として送信されます。
文字列をテンプレートとしてメール送信する
先の例では、テンプレートファイルがサーバー上にある前提でしたが、下記の例では、文字列変数をテンプレートして利用できます。
例:
$strBody = ‘こんばんは、{$name}さん。’;
$this->U->mailer->send(
array(
‘とぅ <to@xxxxxxxx.com>’
),
‘ふろむ <from@xxxxxxxx.com>’,
‘題名1’,
$strBody,
array(
‘tpl’ => true,
‘direct_tpl’ => true,
‘data’ => array(
‘name’ => ‘テスト 花子’
)
)
);
上記の例で送信した場合、「こんばんは、テスト 花子さん。」という文字列が本文として送信されます。
添付ファイル付きメール送信
添付ファイルをつけてメール送信を行う例です。
例:
$this->U->mailer->send(
‘とぅ <to@xxxxxxxx.com>’
‘ふろむ <from@xxxxxxxx.com>’,
‘添付メールテスト’,
‘本文だよー’ . PHP_EOL . ‘本文二行目だよー。’,
array(
‘file’ => array(
array(
‘name’ => ‘テスト.php’,
‘path’ => XF_APPLICATION_PATH . ‘/_templates/test1.txt’
),
array(
‘name’ => ‘テスト2.php’,
‘path’ => XF_APPLICATION_PATH . ‘/_templates/test2.txt’
)
)
)
);
第五引数にfileキーを作成して、その中に配列として添付するファイル情報を記載します。
一つづつのファイル情報は配列として定義し、nameキーの値は、実際にメールに添付されるファイルの名前です。
pathキーの値は、メーラー機能が実際に送信するサーバー側のパスを記載します。
nameキーの値に関しては、日本語ファイル名にも対応していますが、機種依存文字は利用できません。
メールボックスリスト取得
【実装中】
メール内容受信
【実装中】
xFrameworkPX CLIモードと併用して大量メール送信
サイトを構築している中で、会員などにメールを送信したい場合がありますが、この会員数が1万人や10万人など大量になった場合、個別に送信していては、ブラウザのリクエストがなかなか帰ってこずにタイムアウトしてしまうケースがあると思います。
そのような時は、xFrameworkPX CLIモードで動作させることで実現が可能です。
今回の例の前提は下記の通りです。
- WEB上からメール送信ユーザーを選択させ(管理者など)、その一覧をメール送信ログテーブル(データベース)に保存する。
- インサートしたID(プライマリーキー)を引数につけてCLI版のブートストラップを起動する。
- CLI版のアクション内で、データベースから送信ユーザー一覧を取得する。
- 1つずつ送信する。
- すべて送信し終わったら、ログテーブルの送信完了日時を更新する
こうすることで、タイムアウトになることなくWEBからの送信リクエストはすぐに完了し、別プロセスでメールを送信します。
CLI版のアクションもWRI版(WEB版)と変わらずSmartyなどテンプレートエンジンを利用できるので、ユーザー個別の埋め込み処理などがカンタンに行えます。
また、上記の仕様でなくても、最後に送信完了メールを管理者に送付したり、ともかく時間のかかる処理をCLI版で動作させ、ブートストラップをCRONで起動させるなどしてバッチ処理的なことを実現できます。
CLI版で動作させるアクションを記述する際には、ほぼWRI版で動作を確認してからアクションクラスをCLIRootに移動させて動作させるだけよいので、コンソール上で一つずつ動作を確認する手間が省けます。
【執筆中】