初心者がCakephpをやる件で、ユーザーのパスワード再発行機能を作成しました。
参考・・・というかコピペさせて頂いたのはこちら。
「パスワードを忘れた方は」を実装したい(CakePHP修行 #22) | IDEA*IDEA
ただ、メール送信はmb_send_mail関数ではなく、Cakephpのコンポーネントとして外部ライブラリのQdmail(日本語メール送信)、Qdsmtp(外部SMTPサーバでメール送信)を利用しました。
参考:cakePHP メール送信はもうこれでいいでしょ – LoveIT – 安江ブログ
(このメールデータを生成する方法がうまくいかなかったので少し改変)
これで日本語環境もばっちり。なおかつメールのテンプレートとして、Cakephpのレイアウト、エレメントを利用できます。
以下手順とソースコード。
1.Qdmail、Qdsmtpをダウンロードして/app/controllers/components/に保存。そして有益なプログラムを公開する作者様に感謝する。
2.UsersControllerにresetpwd()を追加。
pageTitle = 'パスワード再発行';
if (!empty($this->data)) {
//入力されたメールの存在を確認
$someone = $this->User->findBymail ($this->data['User']['mail']);
if ($someone) {
//パスワード生成
$new_pwd = $this->_generatePwd ();
$this->User->id = $someone['User']['id'];
//パスワードをAuthComponentで暗号化して保存
$this->User->save (array('password' => $this->Auth->password($new_pwd)));
//メール送信
mb_language('ja');
$this->Qdmail->smtp(true);
$mail_from="admin@example.com";
$mail_to="$someone['User']['mail'];
$param = array(
'host' => 'localhost',
'port' => 25,
'from' => $mail_from,
'protocol' => 'SMTP'
);
$this->Qdmail->smtpServer($param);
$this->Qdmail->to($mail_to);
$this->Qdmail->subject('パスワードを再発行しました。');
$this->Qdmail->from($mail_from);
$content = $new_pwd;
//$this->Qdmail -> cakeText( '本文' ,'エレメント名','レイアウト名');
$this->Qdmail->cakeText($content, 'resetpwd', 'resetpwd');
$this->Qdmail->send();
$this->Session->setFlash ('パスワードを再発行しました。');
$this->redirect ('/users/login/');
} else {
$this->Session->setFlash ('メールアドレスを入力してください。');
}
}
}
//ideaxideaさんのソースまま。functionに_を付加して内部処理のみにした。
function _generatePwd() {
$len = 8;
srand((double) microtime() * 1000000);
$seed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
$pass = "";
while ($len--) {
$pos = rand(0, 61);
$pass .= $seed[$pos];
}
return $pass;
}
3.viewを作成(/app/views/users/resetpwd.ctp)
4.メールのテンプレートとしてレイアウトとエレメントを準備。デフォルトをコピーしてカスタマイズする。
レイアウト
/cake/libs/view/layouts/email/text/default.ctpをコピーして、
/app/views/layouts/email/text/resetpwd.ctpに保存
エレメント
/cake/libs/view/elements/email/text/default.ctpをコピーして、
/app/views/elements/email/text/resetpwd.ctpに保存
5.テストしておしまい。
Qdsmtpの使用は任意ですが、開発環境がWindowsで本番がLinuxなどの場合、外部SMTPサーバを設定しておけばその辺を気にせずに開発を進められます。
こんな自分では考えられないような複雑な処理でも、ソースコードのコピペとComponentの活用で何とかなった。
Cakephpすげー。
コメント
ソースの最初の方の
//Qdmail、Qdmailコンポーネントを追加
var $components = array(‘Cookie’, ‘Qdmail’, ‘Qdmail’);
は間違いで、正しくは
//Qdsmtp、Qdmailコンポーネントを追加
var $components = array(‘Cookie’, ‘Qdsmtp’, ‘Qdmail’);
ですよね。
ブログの記事を参考にさせて頂き、CakePHPでさくらインターネットで
無事日本語メールが送信できる様になりました。ありがとうございました。
すみません、ご指摘の通りです。
コピペミスのようでしたので修正しました。
こんな記事でも参考にして頂けまして幸いです。