テンプレートを使用してメールを送信する - Catalyst::View::Email::Template -
さて、上記の例ではメール本文に表示する値を、直接プログラムで指定していますが、フォーマットをちょっと変更する場合でも実装を修正しなければならないため、非常に面倒です。
このような場合には、Catalyst::View::Email::Templateを使用すると、テンプレートを使用してメール本文を作成できるようになります。
使用するテンプレートエンジンには自分の使い慣れたモジュールを使用できます。この例ではTemplate Toolkitを使用します。
Catalyst::View::Email::Template
このモジュールは、Catalyst::View::Emailに含まれているので、別途インストールする必要はありません。このモジュールについても、ジェネレータを使用してメール送信用のビューを作成します。
$ ./EmailSample/script/emailsample_create.pl view Email::Template Email::Template
▼
created "/home/test/EmailSample/script/../lib/EmailSample/View/Email" exists "/home/test/EmailSample/script/../t" created "/home/test/EmailSample/script/../lib/EmailSample/View/Email/Template.pm" created "/home/test/EmailSample/script/../t/view_Email-Template.t"
Catalyst::View::Email::Templateで指定可能なパラメータ
Catalyst::View::Email::Templateの設定値もアプリケーションクラスで登録してみましょう。送信部分などの設定はEmailビューと同じです。
__PACKAGE__->config(
name => 'EmailSample',
default_view => 'TT',
# Catalyst::View::Email::Templateの設定
'View::Email::Template' => {
# (1)メールテンプレートファイルのディレクトリパスprefix
template_prefix => 'email',
stash_key => 'email',
default => {
content_type => 'text/plain',
charset => 'utf-8',
# (2)メールテンプレートの処理に使用するビューモジュール
view => 'TT',
},
sender => {
mailer => 'Sendmail',
mailer_args => {
sendmail => '/usr/lib/sendmail',
},
},
},
);
先ほどの基本的な設定パラメータはCatalyst::View::Emailと同じですが、テンプレートに関するパラメータには次のようなものがあります。
(1)メールテンプレートファイルのディレクトリパスprefix
Webページなどの通常のテンプレートディレクトリと区別するために、通常のパス以下につけるprefixを指定します。例えば、テンプレートのパスが「~/EmailSample/root」であり、template_prefixの値がemailの場合、このビューモジュールでは、「~/EmailSample/root/email」以下のディレクトリを探しに行きます。
(2)メールテンプレートの処理に使用するビューモジュール
Catalyst::View::Email::Templateでは、テンプレートエンジンとして、Catalystのビューモジュールになっているものであれば、それらを使用できます。上記の例では、Template Toolkitを使用した、Catalyst::View::TTを利用するように設定されています。
メール送信アクション
テンプレートを使用したメール送信のコードを見てみましょう。
メール送信の実行は、先ほどと同様にPriavteアクションとして定義したemail2アクションを使用します。今回の例では、contactアクションでメール本文に差し込むためのタイトルと本文を指定してsend2アクションにPOSTで送信します。send2アクションでは、このemail2アクションを使用してメール送信を行います。
sub contact :Local {
my ( $self, $c ) = @_;
}
sub email2 :Private {
my ( $self, $c ) = @_;
$c->stash->{email} = {
to => 'test1@example.com',
from => 'test2@example.org',
subject => 'Contact from user',
# (1)テンプレートファイルの指定
template => 'send2.tt',
};
# (2)メールテンプレートに渡す値
$c->stash->{title} = $c->req->params->{title};
$c->stash->{contents} = $c->req->params->{contents};
# 送信実行
$c->forward($c->view('Email::Template'));
}
sub send2 :Local {
my ( $self, $c ) = @_;
# 送信実行
$c->forward('/email2');
# 送信エラー判定
if (scalar(@{$c->error})) {
$c->error(0);
$c->response->body('送信失敗');
} else {
$c->response->body('送信成功');
}
}
contactアクションでは、単に入力フォームを表示するだけなので、アクション側のロジックは記述していません。また、send2アクションについては先ほどとほぼ同じです。
ここではメール送信を行うemail2アクションについて見ていきます。メール送信に関する設定値などは、Catalyst::View::Emailと同じ値を使用しています。
(1)メールテンプレートファイルの指定
使用するメールテンプレートファイルを指定します。パラメータ名はtemplateになります。先ほどtemplate_prefixにemailを指定したので、このテンプレートファイルへのパスは、「~/EmailSample/root/email/send2.tt」になります。
(2)メールテンプレートに渡すパラメータを設定
これまで何度も出てきたCatalyst::View::TTと同じく、Stashに対してテンプレートで使用する値を登録します。この例では、contactアクションでPOSTした、titleとcontentsの値を設定しています。
メールテンプレートファイルでは変数を使用できますが、その変数を指定するために、Stashに登録しています。上記の例では、入力フォームから受け取った、subjectとcontentsの値を登録しています。
