メール送信と本文定義の実装例
NaifyMail(ナイフィメール)とNaifyView(ナイフィビュー)を組み合わせてメールを送信する例を紹介します。ブートストラップでの送信手段(Transfer)の設定、テンプレートによる件名・宛先・本文の定義方法、Controllerからの送信、添付ファイルやメソッド指定の書き方を順に見ます。
このページでは追加する処理を紹介します。ファイル配置と公開入口、BaseController、NaifyViewの初期化とgetView()、フォームと入力検証の実装例と組み合わせて使えます。
1. メール接続設定とブートストラップ
メールの送信手段(SMTPやPHPのmail()など)と共通の差出人設定をconfig/mail.phpに用意し、SampleAppBootstrap.phpで読み込みます。libs/NaifyMailも配置しておきます。
// config/mail.php
use NaifyMail\Mail\Mailer;
use NaifyMail\NaifyMail;
use NaifyMail\Transfer\SmtpTransfer;
// 既定の文字コードと差出人を設定する(省略時は UTF-8)
Mailer::setDefaultEncoding(Mailer::ENCODING_UTF8);
Mailer::setDefaultFrom('no-reply@example.com', 'Naifyサポート');
// SMTPで送信する場合の設定
NaifyMail::setTransfer(
SmtpTransfer::create()
->server('smtp.example.com')
->port(587)
->tls()
->username('no-reply@example.com')
->password('secret-password')
);
環境に応じて、PHP標準のmail()関数や開発・テスト用のコールバックへ差し替えることもできます。
use NaifyMail\Mail\Message;
use NaifyMail\Transfer\CallbackTransfer;
use NaifyMail\Transfer\PhpSendMailTransfer;
// PHP標準の mail()(sendmail)を使う場合
NaifyMail::setTransfer(PhpSendMailTransfer::create());
// ローカル開発やテストで実際には送信せずログへ記録する場合
NaifyMail::setTransfer(
CallbackTransfer::create()->callback(static function (Message $msg): void {
error_log('Mail to: ' . $msg->buildEncodedToHeader() . ' / Subject: ' . $msg->getSubject());
})
);
SampleAppBootstrap.phpでは、Appを実行する前にNaifyMail::boot()とconfig/mail.phpを読み込みます。
// SampleAppBootstrap.php($app->send() より前)
use NaifyMail\NaifyMail;
require __DIR__ . '/libs/NaifyMail/NaifyMail.php';
NaifyMail::boot();
require $config->getConfigDir() . '/mail.php';
2. メール本文の定義の仕方(テンプレート方式)
NaifyMailでは、メールの件名・差出人・宛先・本文を1つのテンプレートファイルにまとめて定義できます。Message::setTemplate()に描画後の文字列を渡すと、<mail:*>タグが自動で解析されてメッセージに反映されます。
<!-- views/mail/signup-welcome.html -->
<mail:subject>【Naify】会員登録完了のお知らせ</mail:subject>
<mail:from name="Naify運営事務局">info@example.com</mail:from>
<mail:reply-to name="Naifyサポート窓口">support@example.com</mail:reply-to>
<mail:bcc>audit@example.com</mail:bcc>
<mail:body>
{{ input.name.escape() }} 様
いつもご利用いただきありがとうございます。
以下の内容で会員登録が完了いたしました。
・ログインID:{{ input.username.escape() }}
・メールアドレス:{{ input.email.escape() }}
<nf-if test="campaignCode">
・特典コード:{{ campaignCode.escape() }}
</nf-if>
今後ともよろしくお願いいたします。
--------------------------------------------------
Naify運営事務局
https://example.com/
</mail:body>
使えるメール定義タグ
| タグ | 説明と書き方 |
|---|---|
<mail:subject> | メールの件名を指定します。前後の空白や改行は自動で取り除かれます。 |
<mail:from> | 差出人を指定します。<mail:from name="表示名">info@example.com</mail:from>または<mail:from>表示名 <info@example.com></mail:from>の形式で書けます。 |
<mail:reply-to> | 返信先(Reply-To)を指定します。書き方は<mail:from>と同じです。 |
<mail:to> / <mail:cc> / <mail:bcc> | 宛先・CC・BCCを指定します。複数回書くと複数件追加されます。PHP側のaddTo()と併用することもできます。 |
<mail:body> | メールの本文を指定します。<mail:body>直後の改行と</mail:body>直前の改行は1つずつ自動で取り除かれるため、テンプレートを見やすく整形して書けます。 |
既定の
text/plainでは、テンプレート内でのようにエスケープされたHTMLエンティティ(&など)もsetTemplate()の取り込み時に元の文字へ戻されます。送信時には改行コードもRFC準拠のCRLFへ自動で揃えられます。
3. Controllerからテンプレートを描画して送信する
会員登録フォームのcommitAction()などで、NaifyViewでテンプレートを描画し、NaifyMail::createMessage()->setTemplate()に渡して送信します。
// SignupController::commitAction() 等での送信例
use NaifyMail\NaifyMail;
// 1. テンプレートへ変数を渡してメール文面を描画する
$mailText = $this->getView()
->assign('input', $input)
->assign('campaignCode', 'WELCOME2026')
->render('mail/signup-welcome.html');
// 2. 描画結果を setTemplate() に渡し、宛先をセットして送信する
$message = NaifyMail::createMessage()
->setTemplate($mailText)
->addTo($input['email'], $input['name'] . ' 様');
NaifyMail::send($message);
render('mail/signup-welcome.html'):画面表示と同じNaifyViewを使ってメール用テンプレートを文字列として描画します。setTemplate($mailText):描画された文字列から<mail:subject>や<mail:body>などを読み取り、Messageオブジェクトへセットします。addTo()とNaifyMail::send():テンプレート側で共通の件名・差出人・本文を定義し、PHP側では動的な宛先(addTo())だけを追加して送信できます。もちろんテンプレート内に<mail:to name=" 様"></mail:to>と書くこともできます。
4. メソッドでの直接組み立てと添付ファイル・HTMLメール
テンプレートを使わずにPHPのメソッドチェーンだけで件名や本文を組み立てたり、PDFなどの添付ファイルを追加したりすることもできます。
use NaifyMail\Mail\Mailer;
use NaifyMail\NaifyMail;
$message = NaifyMail::createMessage()
->setFrom('billing@example.com', '株式会社サンプル 経理部')
->setReplyTo('support@example.com', 'お問い合わせ窓口')
->setReturnPath('bounce@example.com')
->addTo('customer@example.com', '鈴木 一郎 様')
->addCc('sales@example.com')
->setSubject('ご請求書送付のご案内')
->setBody("鈴木 一郎 様\n\n今月分のご請求書を添付いたします。\nご確認ください。")
// ファイルパスを指定して添付する
->addAttachment('/path/to/invoice-202611.pdf', 'ご請求書_2026年11月.pdf', 'application/pdf')
// メモリ上の文字列データ(CSVなど)をそのまま添付する
->addAttachmentFromString($csvData, '明細.csv', 'text/csv');
// ISO-2022-JP(JIS)で送りたい場合は個別に指定可能
// $message->setEncoding(Mailer::ENCODING_JIS);
// HTMLメールとして送る場合は Content-Type を切り替える
// $message->setContentType('text/html');
NaifyMail::send($message);