##はじめに
CakePHPでメールを利用したパスワードリセット処理を実装したい。
ローカル環境でメールサーバーを立てるにはMailhogが便利だというので使ってみた。
##開発環境
- CakePHP 2.4
- PHP 5.6
- CentOS 6.9
- docker
##MailHogについて
MailHogとはSMTPサーバーの一つでテストメールに使用できます。
docker Hubでイメージが公開されていますので、導入が非常に簡単にできます。
##導入方法
###MailHogのコンテナを作る
以下を追記します。
mailhog:
image: mailhog/mailhog
ports:
- "8025:8025"
- "1025:1025"
この8025はMailHogのHTTPサーバーのデフォルトポート番号です。1025はSMTPサーバーのポート番号になります。
今回はメール送信をしたいので、SMTPサーバーのポート番号を追加しておく必要があります。
###Dockerを再起動する
docker-compose up
を実行。
docker ps -a
でMailHogのコンテナが新しく作成されているのが確認できると思います。
http://localhost:8025 にアクセス。
こんな感じでMailHogの画面が表示されると思います。
###CakePHP側での設定
app/Config/email.php.default
を app/Config/email.php
にリネーム。
public $smtp = array(
'transport' => 'Smtp',
'from' => array('from@localhost.com' => 'My Site'),
'host' => 'mailhog',
'port' => 1025,
'timeout' => 30,
'username' => 'user',
'password' => 'secret',
'client' => null,
'log' => true,
'charset' => 'utf-8',
'headerCharset' => 'utf-8',
);
こんな感じ。
hostにはMailHogのコンテナ名を入力。
portはMailHogのSMTPサーバーのポートは1025なのでそれを入力。
fromのメールアドレスはなんでもいいですが、形式が合っていないとエラーになります。
logをtrueにするとエラーログに内容が吐かれます。
###実際にメールを送ってみる
こんな感じでフォームにメールアドレスを入力すると、そのメールアドレスに送られてくるイメージで作成します。
App::uses('CakeEmail', 'Network/Email');
public function send_mail()
{
if(isset($this->request->data['Email']['address'])) {
$email = new CakeEmail('smtp'); // この引数はemail.phpの変数を入れます。今回はsmtpを使用します。
$email->to($this->request->data['Email']['address']) // フォームに入力したメールアドレス
->subject('title')
->send('mailbody');
}
}