ようこそゲストさん

Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

使い方 CakePHPでのメール送信

QdmailはCakePHPのコンポーネントとしても動作します(バージョン0.7.6.a以降)。
自分自身でCakePHP内から呼ばれているのか、通常のPHPアプリケーションから呼ばれているのか判別しますので、ユーザーはファイルを使い分けたりする必要はありません。
2008-10-01追記
下記、サイトにてスマートなCakePHPでのQdmailの使い方を紹介していただいております。ぜひご参照下さい。
cakePHP メール送信はもうこれでいいでしょ -LoveIT - 安江ブログ

使い方(初期設定)

通常のCakePHPコンポーネントと同じです。
次のディレクトリに qdmail.php ファイルをコピーしてください。
app/controllers/components/
使用したいコントローラーで、以下のプロパティの宣言を行ってください。
var $components=array( "Qdmail" );

具体的なメール送信の方法

コントローラーのアクションで、次のように記述します。
$this->Qdmail->to( 'address@example.com' , '日本語名' );
$this->Qdmail->subject('Qdmail on CakePHP メールのテスト');
$this->Qdmail->from('from@example.com' , '配信元日本語名' );
$this->Qdmail -> text( '本文をここにかきます' );
$this->Qdmail -> send();
宛先などの指定は、Qdmail通常の使い方と同じです。
通常の使い方で例として挙げている「$mail->」を「$this->Qdmail」と置き換えて読んでくだ
さい。
CakePHPをお使いの方であれば、easyよりも、通常のオブジェクト指向型でパラメータを指定したほうがやりやすいと思います。

CakePHPのビューを使用する方法

CakePHP用に、2つの特別なメソッドを用意しました。
$this->Qdmail -> cakeText( '本文(テキスト)' );
or
$this->Qdmail -> cakeHtml( '本文(HTML)' );
見て直感的におわかりのように、通常のテキストの場合は、cakeText,HTMLメールの場合は、cakeHtmlメソッドを使います。

ビューの指定の方法

textもhtmlも同じ書式なので、textをもとに説明します。
$this->Qdmail -> cakeText( '本文' ,'エレメント名','レイアウト名');
フルスペック
cakeText( $content , $template  , $layout  , $org_charset , $target_charset, $enc , $wordwrap_length )

第1引数から、本文、テンプレート名、レイアウト名、テンプレートの文字コード(省略可、またはnull),送信時の文字コード(省略可、またはnull)、本文のエンコード形式(7bit,base64等)、ワードラップの文字数(マルチバイト換算)

※エレメント名とレイアウト名は省略可能です。その場合は「default」を指定したことになります。

上記のように書くと次のような感じになります。
'本文'エレメントの中で、
$content変数として使用可能
エレメントからの出力レイアウトの中で、
$content_for_layout変数として使用可能
cakeview.jpg

エレメントとレイアウトのディレクトリ

エレメントの既定のディレクトリ
app/views/elements/email/text/
app/views/elements/email/html/
レイアウトの既定のディレクトリ
app/views/layouts/email/text/
app/views/layouts/email/html/

# spok 2009年01月29日(木) 午前7時37分

CakePHPはShellの場合、コンポーネントを使えないと認識しております。
他のコンポーネントは使えますか?
参考:http://d.cialla.net/diki.cgi/develop/php/cakephp/shell/qdmail

# にょろ 2009年01月29日(木) 午前10時54分

申し訳ありません、すばやい御返答ありがとうございました。
えぇぇぇ゛~~(゜-゜)
そ・・・そうだったのですか・・・(´Д⊂
他のコンポーネントは使っていないので・・・・。
参考HPをみて格闘してみます!
ありがとうございました

# coco 2009年02月15日(日) 深夜2時54分

CakePHPのコンポーネントとして利用させてもらっています。

HTMLメールを試してみようと思い、
$this->Qdmail->html('<html><body><a href="http://www.yahoo.co.jp/">test</a></body></html>');
としてsendしてみたのですが、
メールソフトで開くと、HTMLとして動作してくれません。

何か間違っているのでしょうか?

メールソフトはMozilla Thunderbirdです。
よろしくお願いします。

# tomotomo 2009年08月03日(月) 午前9時42分

大変便利で重宝しています。ありがとうございます。

一点、気になったことがあったのでコメントさせていただきます。
$this->Qdmail->to('宛先1');
$this->Qdmail->cakeText('本文');
$this->Qdmail->send();
とした後、別の宛先へHTMLメールを送信しようと試みました。
$this->Qdmail->to('宛先2');
$this->Qdmail->cakeHtml('HTML本文');
$this->Qdmail->send();

しかし、宛先2に届いたメールを確認すると、テキストメールが届いておりました。
cakeHtmlメソッドを実行する前に、
$this->Qdmail->content['TEXT'] = "";
として、強引にテキストを空っぽにしたらHTMLメールで届きました。

恐らく私の使い方は大いに間違っていると思いますが、何らかの対処法があるのでしょうか。

# junsei 2009年08月07日(金) 午前11時41分

Coolなライブラリありがとうございます!
CakePHPのコンポーネントとして使わせて頂いてます。

cakeText(cakeHtml)メソッドの第一引数ですが、配列に対応すればより便利かと。。

3824行目付近:
if( is_array( $content ) ){
$content = $view->renderElement( $this->view_dir . DS . $type . DS . $this->template , $content, true );
}else{
$content = $view->renderElement( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );
}

# アルガー 2010年12月06日(月) 午後1時14分

cakeTextでViewを指定する際、renderElementメソッドがないといわれますが、
CakePHP1.3からrenderElement→elementになったので、変更して動かしていますので、こちらにご連絡しておきますね。

# coban 2011年01月31日(月) 深夜0時44分

> tomotomoさん

僕も同じ現象です。
$this->Qdmail->content['TEXT'] = "";
にすればHTMLが送信されるというところまで。

もし解決方法をご存知でしたら、お知らせください。
宜しくお願いします。

# sai 2012年04月20日(金) 午後3時19分

コンポーネントとして活用させていただいております。

cakephpにてqdmailをコンポーネントとして使用しているのですが、下記の $this->Qdmail->to($datas["Profile"]["mail"]);のように、データベースからメールアドレスを取得して送ろうとすると送れません。

$this->Qdmail->to('sample@sample.com')のようにするとちゃんと送れます。

データベースから取得したメールアドレスでの送り方をぜひ教えていただけたらと思います。
よろしくお願い致します。

function receiving($id = null) {
$this->Profile->id = $id;
$datas = $this->Profile->findById($id);

$this->Qdmail->smtp(true);
$this->Qdmail->smtpServer($this->mail_param);
$this->Qdmail->to($datas["Profile"]["mail"]);
$this->Qdmail->subject($subject);
$this->Qdmail->from('sample@sample.com' , 'サンプル' );
$this->Qdmail ->text($content);
$this->Qdmail -> send();


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/023/tb/

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と同じMITライセンスです。かなり自由に使えると思います。
詳しくはダウンロードページをご覧下さい。

記事リスト

# 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 エラーになりました。
ちょっと見てみたのですが、原因はわからなかったです。


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/022/tb/