▼ CakePHPメールコンポーネントとして送信する
■概要
Qdmailは、バージョン0.7.6a(アルファ)から、CakePHPのコンポーネントとしても、動作するようになりました。CakePHPコンポーネントとしての動作のさせ方は、ver0,ver1共通です。
Semailよりも高機能になりました。
CakePHPのテンプレート、ビュー機能を利用することができます。
TEXTメールはもちろん、添付ファイル、HTMLメール、デコメもCakePHPから簡単に送信できます。
使い方:
CakePHPでの使い方
CakePHPでのSMTP送信
関連記事:
CakePHPコントローラーをメール受信をきっかけに起動する
さくらインターネットでリアルタイムメール処理
■特徴
- CakePHP1.1 , 1.2 の両方に対応
- 同じファイルで、通常の使い方もOK,CakePHPもOK(自動判別)
- CakePHPの強力なrender機能を使用可能
記事リスト
- 使い方 CakePHPでのメール送信 (2008-04-24)
- CakeでSMTP送信する (2008-05-01)
- TB-URL http://hal456.net/qdmail/022/tb/
# sandman 2008年06月26日(木) 午後6時58分
QdmailをCake1.2RC1で使用しています。
基本的には、とても満足していますが、cakeText()とcakeHtml()が下記のエラーが出て使用できません。
Notice (8): Undefined property: Controller [APP/controllers/components/qdmail.php, line 3073]
Notice (8): Undefined property: Controller [APP/controllers/components/qdmail.php, line 3079]
text()とhtml()を使ってれば良いので、問題は無いのですが、ご確認をお願いいたします。
# spok 2008年06月26日(木) 深夜2時00分
sandmanさん
ご面倒をおかけします。
こちらでは再現しませんので、下記の情報をお教え下さい。
■PHPのバージョン
■Qdmailバージョン
■OS & バージョン
■該当部分のソースコード(メールアドレスなどは差し支えないものに差し替えて下さい。)
ここからは現時点での想像ですが、上記のエラーがでるということは、CakePHP1.2RC1 → Qdmailコンポーネント へ Controllerインスタンスが、引き継がれていないということかと思います。
Qdmail側のfunction startup(&$controller)は、こちらのCakePHP1.2RC1環境で正しく動作しましたので、sandmanさんの環境で、Qdmail以前の部分で、正しくContollerインスタンスが生成されているか(cake1.2rc1のcake/dispatcher.phpの515行目付近$controller =& new $ctrlClass();が実行されているかどうか)、または、
var $components=array( "Qdmail" );
の宣言が正しくなされているかをご確認いただければ幸いです。
参考:http://hal456.net/qdmail/cakebase
ひょっとしたら、何らかの設定で、componentのstartupを実行しないようなかたちになっているのかもしれませんので、下記も試してみていただければ幸いです。
qdmailの function startup を検索し(3000行目付近)、そのfunction のreturn直前に
pr($this->Controller);
を入れてみて実行して、何か表示されるかどうか。
# sandman 2008年06月27日(金) 午後4時08分
spokさん
素早くて丁寧なお返事ありがとうございます。
下記のサーバでエラーが出ました。
■PHPのバージョン
サーバ1:4.4.7 & 5.2.4
サーバ2:4.3.9
■Qdmailバージョン
0.8.8a
■OS & バージョン
サーバ1:XAMPP 0.3 Apache/2.2.6
サーバ2:CentOS 4.5.2 Apache/2.0.52
■該当部分のソースコード
function testmail(){
$subject = "これはテストです";
$to = array('info@sandman.jp', 'Sandman');
$body = "テストの本文です。";
$this->_sendMail($subject, $to, $body);
}
function _sendMail($subject, $to, $body) {
$this->Qdmail->to($to[0], $to[1]);
$this->Qdmail->bcc('info@bbb.com');
$this->Qdmail->subject($subject);
$this->Qdmail->replyto('info@aaa.com');
$this->Qdmail->from('info@aaa.com', 'MyName');
$this->Qdmail -> cakeHtml($body);
$this->Qdmail->send();
}
■エラー内容
Notice (8): Undefined property: Controller [APP/controllers/components/qdmail.php, line 3073]
Notice (8): Undefined property: Controller [APP/controllers/components/qdmail.php, line 3079]
Fatal error: Cannot instantiate non-existent class: in /Applications/xampp/xamppfiles/htdocs/cake7125/nk/controllers/components/qdmail.php on line 3079
------------------------------
$componentsの宣言もしてありますし、cake/dispatcher.phpでコントローラーは生成されていました。
qdmail.php の function startupでもpr($this->Controller) のダンプは表示されます。
よろしくお願いいたします。
# spok 2008年06月27日(金) 午後5時46分
sandmanさん
お手数をおかけします。。。。
>pr($this->Controller) のダンプは表示されます。
であるのに、上記のUndefined propertyエラーがでるのが、う~ん、なぜなんでしょう。。。。
startupで存在した$this->Controllerが、同じインスタンス内のrenderメソッド内では、消えている、ということに。。。。。
$this->Qdmail->to($to[0], $to[1]);
の「直前」に
pr($this->Qdmail->Controller);
を挿入したら、エラーになりますでしょうか?
全く関係ないかも知れませんが
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=809&forum=8
によると
$uses = array();ではなく$uses = null;の時に“undefined property”エラーがでることがあるようですが、もし、$uses = nullとなっていたら、$uses = array();としてみてください。
(たぶん関係ないと思うけど)。
# 赤石 2008年06月27日(金) 午後7時27分
sandmanさん
spokは自分のブログに技術的記事を無断転載しまくるので気をつけて下さい
# sandman 2008年06月27日(金) 午後10時32分
spok さん
こんばんは。お世話になってます。
> $this->Qdmail->to($to[0], $to[1]);
> の「直前」に
> pr($this->Qdmail->Controller);
> を挿入したら、エラーになりますでしょうか?
やはり、エラーが表示されます。
こちらでも色々な箇所を検証しまくってみましたが、結局わかりませんでした。
が、RC2が出てたので、こちらに差し替えたら、さくっと動きました。
何だったんでしょうか…
長々とおつきあいいただき、ありがとうございました。
これから、ありがたく使わせて頂きます。
あと、リクエストですが、Return-Path とかも設定できると嬉しいです。
取り急ぎ、勝手につけちゃいましたが(もちろん、エラー解消後です)。
よろしくお願いいたします。
> 赤石さん
ご助言ありがとうございます。
とは言え、自分はそういうの全然気にしませんし興味もありませんので、別にいっかーとかそんな感じです。
# spok 2008年06月28日(土) 午後3時44分
sandmanさん
解決してよかったです。原因はわかりませんが。。。。
なお、Return-Path ですが、現在、$mail->addHeader()メソッドには、バグあり、うまく動作していません。
早いうちに対処しますので、今しばらくお待ち下さい。
# spok 2008年06月28日(土) 午後4時17分
$mail->addHeader()のバグを修正しました。0.8.9a以降へのアップグレードをお願いいたします。
# tommyt 2009年01月16日(金) 午後4時52分
とても簡単で助かっています。
cakePHP1.1で使いたいのですが、データベース連動が上手くできないので教えていただけないでしょうか。
Qdmail error: Tyr Varidate Error by regex preg_match('/[^@]+@[^@]+/') the address is -> line -> 3699
Qdmail error: Illegal Mail AddressSystemValidete Address Method line -> 2770
とでました。to($data)をto($to,$to_name)にすると送信できています。
pr($this->Qdmail->to)してみるとtoの配列に何も入っていないようです。
$dataはarray([0]=>array[モデル]=>array[id]=>1・・・となっており、findAll()ではデータ構造が違いそのままでは渡らないのでしょうか。
よろしくお願いします。
# spok 2009年01月16日(金) 深夜1時23分
Toヘッダの指定方法は以下のとおりです。
http://hal456.net/qdmail/oopbase
# tommyt 2009年01月19日(月) 午後4時19分
すぐの対応ありがとうございます。
データ構造が違うということだと解釈し、findAll()のあと、モデル名のない配列に直し$this->Qdmail->to($data);
で宛先も%name%も連動できました。
ソースを呼んでもまだ良く分からない初心者なので、質問の仕方も良く分からず、ご迷惑だったかもしれませんが、おかげで必要なものができそうです。
ありがとうございました。
# coco 2009年02月18日(水) 午後4時41分
CakePHP 1.2.1.8004 Stableで使っています。
$this->Qdmail->errorDisplay(false);
$this->Qdmail->lineFeed('\n');
が機能しないのですが(設定が反映されない?)、対処法はありますでしょうか?
(現在はソースを直接いじっています)。
よろしくお願いします。
# t-sato 2009年03月03日(火) 午後0時56分
私もcakeText()を使用した際、同じ内容のエラーが発生しました。
Notice (8): Undefined property: Controller [APP/controllers/components/qdmail.php, line 3815]
Notice (8): Undefined property: Controller [APP/controllers/components/qdmail.php, line 3821]
cake version : cake_1.2.1.8004
qdmail version : 1.2.6b
php version : 4.4.9
apache version : 1.3.41(Unix)
OS version : CentOS5
ただ、私の場合、app_controller.phpで使用していました。
そのせいで発生したのかわかりませんが、
pr($this->Controller) は空でした。
(3752行目に$this->Controller =& $controllerと代入してますが、そもそもQdmailComponentには、var $Controllerって定義されてないから?と思いましたが、違いました。)
ダンプしたり、デバッグした結果、どうもstartup()が呼ばれていないようです。
ので、startup()をinitialize()に置換した結果、正常動作致しました。
以上、一応ご報告でした。
# アルガー 2010年12月06日(月) 午後1時02分
Undefined property: Controllerとなる件、startup()が
XxxControllerから自作のComponentを呼び出して、そこから、QdmailComponentを呼び出すときは、QdmailComponentのstartupメソッドは呼ばれないので、そこで設定される$this->Controllerも空になりますね。
Component AからComponent Bを呼び出す際はComponent Bのinitializeメソッドは自動的に呼ばれますが、startupメソッドは自動的に呼ばれないようです。
http://book.cakephp.org/ja/view/996/Creating-Components
> サブコンポーネントの initialize だけが、自動的に呼び出されます。
自作のComponentの中で、自分でcontrollerを渡したらいけました。
自作Component
function startup(&$controller) {
$this->controller = $controller;
$this->Qdmail->startup($this->controller);
}
# iizuka 2012年01月13日(金) 午後5時00分
お世話になります。飯塚と申します。QDmail出た時から使わせていただいています。CakePHPのコンポーネントとして利用したところ、
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261900 bytes) in /var/www/cakephp-204/mobiltest/Controller/Component/qdmail.php on line 3334
のエラーになりました。おそらくCakePHPのバージョンが2.04のためうまく動かなかったのかと思います。PHPのバージョンはPHP Version 5.3.3です。
以上、報告します。
# jetbee 2012年02月07日(火) 午後5時42分
同じく cakephp 2系の2.0.5で Allowed memory size エラーになりました。
ちょっと見てみたのですが、原因はわからなかったです。