CakePHP から PEAR::Mail を使ってメールを送信できせん。

CakePHP を使わない場合は、PEAR::Mail が送信できます。

Google で CakePHP, PEAR をキーワード検索して、
CakePHP で PEAR を使用する独特の方法があることは存じております。

ただし、通常どおりPEARをインストールすると、
いつもどおり、CakePHP から PEAR が使えるという記述をみました。

http://book.cakephp.org/view/538/Loading-Vendor-Files
>> まあ、普通にPEARをインストールしてしまえば、今まで通り使えるのですが、


実際に Mail/mimeDecode.php を使って、
問題なく受信したメールの解析ができております。


********
*コード*
********

$mime = new Mail_mime();
// ↓をコメントアウトして、画像を添付しないと何故か送信できる。
$mime->addHTMLImage("gifanimation.gif", "image/gif");
...
$mail_param['port']= "25";
$mail_param['host']= "localhost";
// mail, sendmail も試しました。
$mail = Mail::factory("smtp", $mail_param);

$ret = $mail->send("xmailreceiver@xmailserver.test", $header, $body);


なぜ、CakePHPからだと、"通常通りインストールした"PEAR::Mailでメールを何故送信できないのか、
その原因もしくは対策を教えていただけないでしょうか。

以上よろしくおねがいいたします。

回答の条件
  • 1人1回まで
  • 登録:2009/02/08 23:09:16
  • 終了:2009/02/10 23:38:40

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752009/02/10 18:29:32

ポイント100pt

お言葉に甘えて回答に書かせてもらいます。

提示して頂いているコードでも、hostは指定しているので、大丈夫だとは思うのですが、まずは、var_dumpの結果の比較かなと思います。

CakePHPで書かれたほかの部分が悪さをしているとか、特定の環境に依存する問題とか、現象を細かく見ていかないと原因はちょっと分からないですね。


CakePHPは非常に使いやすいフレームワークだと思うのですが、慣れないと難しい部分もあるのかも知れません。

ただ、利用される方もどんどん増えてきていると思いますし、その発展に少しでも貢献できればなと思っています。

僕で分かる範囲で、問題の解決を手助けでき、少しでもCakePHPを利用してくれる開発者さんが増えるといいなぁと思っています。

id:shotaroh5663

今日、明日と、大学に行ける見通しなくなってしまったので、

また後日、調査にあたることにしました。

var_dumpで比較してみても、原因究明が厳しそうなら、

Emailメールコンポーネントを使って送信させようと考えております。

CakePHPのような優れたソフトウェアが、

どのように支えられているのかも勉強させていただけたかと思います。

ご回答、ありがとうございました。

2009/02/10 23:38:16
  • id:tdoi
    vendorの機能は、強引な言い方をすると、requireをサポートする仕組みなので、vendorの機能を使わずとも、適切にinclude_pathを設定して、PEARのPHPファイルを読み込むことはできます。


    原因の特定のためには、「メールを送信できせん」の部分をもう少し詳しく説明してもらえますか?

    この辺りが分からないので、大雑把な一般的な話ですが、


    ・requireなどの読込が失敗しているのであれば、include_pathがおかしくなっていると思います。

    ・SMTPレベルで送信が失敗しているのであれば、SMTP関連の設定が変更になっている可能性があるかと思います。
  • id:shotaroh5663
    shotaroh5663 2009/02/09 03:49:31
    > vendorの機能は、強引な言い方をすると、requireをサポートする仕組みなので、
    > vendorの機能を使わずとも、適切にinclude_pathを設定して、
    > PEARのPHPファイルを読み込むことはできます。
    コメントありがとうございます。
    勉強になりました。


    > requireなどの読込が失敗しているのであれば、include_pathがおかしくなっていると思います。
    require は、エラーなどは特に出力しておりません。


    > SMTPレベルで送信が失敗しているのであれば、
    > SMTP関連の設定が変更になっている可能性があるかと思います。
    $mail = Mail::factory("smtp", $mail_param);
    までは問題なく動作してくれるのですが、

    メールを送信する
    $ret = $mail->send("xmailreceiver@xmailserver.test", $header, $body);
    のところまでくると、エラーも出力せずに止まってしまいます。
    SMTP の設定ということでしょうか。
  • id:tdoi
    自分の手元の環境で、CakePHPのController内で以下のコードでメール送信を確認しました。

    ファイルの先頭で、
    require_once("Mail.php");
    require_once("Mail/mime.php");

    その上で、action内で
    $header['From'] = "from@example.com";
    $header['To'] = "to@example.com";
    $header['Subject'] = "subject";
    $html_param['head_charset'] = "ISO-2022-JP";
    $html_param['html_encoding'] = "ISO-2022-JP";
    $html_param['html_charset'] = "UTF-8";
    $html = <<<HTML
    メール本文
    HTML;
    $mime = new Mail_mime();
    $mime->addHTMLImage("<path to image>", "image/jpeg");
    $mime->setHTMLBody($html);
    $body = $mime->get($html_param);
    $header = $mime->headers($header);
    $mail = Mail::factory("smtp", array('host' => '<smtp server>'));
    $ret = $mail->send("to@example.com", $header, $body);

    という感じです。


    $ret = $mail->send("xmailreceiver@xmailserver.test", $header, $body);

    この箇所で想定されるとすると、SMTPの設定が一番最初に来ます。
    手元の環境ではlocalhostにSMTPを立てていないので、上記サンプルのMail::factoryの第2引数でSMTPサーバを指定しないとlocalhostの25番ポートにアクセスし、タイムアウトするまで待機するという状態になりました。

    このケースであるとすれば、動く状態(CakePHP未使用の状態)で、print_r ($mail)などと設定をダンプして、動かない状態(CakePHP使用時)も同様に、pr($mail)とでもしてダンプさせ、設定を比較してみては如何でしょうか?


    もう1つのケースとしては、依存関係が解消できていないのかなという気もします。
    例えばですが、PEARのパッケージ間にある依存関係を無視して、Mail/mime.phpのみをコピーしてあったりすると、このようなことになるかもしれないです。
    その場合は、どこかにエラーが表示されそうな気がしますが。


    このどちらでもないとすると、メールサーバのログなんかみてみないとという感じかもしれません。


    何かの参考になれば。
  • id:shotaroh5663
    shotaroh5663 2009/02/10 00:11:49
    わざわざ丁寧にご回答いただき、ありがとうございます。

    > 例えばですが、PEARのパッケージ間にある依存関係を無視して、
    > Mail/mime.phpのみをコピーしてあったりすると、このようなことになるかもしれないです。

    これは問題ないはずです。
    両方ともrequireしていたのを記憶しております。

    明日に、
    $mail = Mail::factory("smtp", array('host' => '<smtp server>'));
    を var_dump で出力させて確認しようと思います。

    いろいろと面倒を見ていただき、ありがとうございます。
    ポイントを受け取っていただけないでしょうか。
    コメントではなく、適当に回答していただけると助かります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません