Cakephpで日本語メール送信(パスワード再発行)

初心者がCakephpをやる件で、ユーザーのパスワード再発行機能を作成しました。
参考・・・というかコピペさせて頂いたのはこちら。
「パスワードを忘れた方は」を実装したい(CakePHP修行 #22) | IDEA*IDEA
ただ、メール送信はmb_send_mail関数ではなく、Cakephpのコンポーネントとして外部ライブラリのQdmail(日本語メール送信)、Qdsmtp(外部SMTPサーバでメール送信)を利用しました。
参考:cakePHP メール送信はもうこれでいいでしょ – LoveIT – 安江ブログ
(このメールデータを生成する方法がうまくいかなかったので少し改変)
これで日本語環境もばっちり。なおかつメールのテンプレートとして、Cakephpのレイアウト、エレメントを利用できます。
以下手順とソースコード。


1.QdmailQdsmtpをダウンロードして/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すげー。

コメント

  1. masa2 より:

    ソースの最初の方の
    //Qdmail、Qdmailコンポーネントを追加
    var $components = array(‘Cookie’, ‘Qdmail’, ‘Qdmail’);
    は間違いで、正しくは
    //Qdsmtp、Qdmailコンポーネントを追加
    var $components = array(‘Cookie’, ‘Qdsmtp’, ‘Qdmail’);
    ですよね。
    ブログの記事を参考にさせて頂き、CakePHPでさくらインターネットで
    無事日本語メールが送信できる様になりました。ありがとうございました。

  2. umakoya より:

    すみません、ご指摘の通りです。
    コピペミスのようでしたので修正しました。
    こんな記事でも参考にして頂けまして幸いです。

タイトルとURLをコピーしました