質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.93%

PEARのMali_Mimeクラスを使った箇所で、スクリプトがclass not foundエラーとなる

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,886

score 36

いつもお世話になっております。
PEARのライブラリを書いたスクリプトを作成しています。
Mail_Mimeを使った箇所で、Class not foundとなり、スクリプトがエラーで終了してしまいます。

本番環境でのみ上記現象が発生し、
なかなか原因がわからず困っている状態です...。

行った操作、確認済みの内容を以下に記載しますので、
どなたかヒント頂けないでしょうか?
よろしくお願いいたしますm(_ _ )m

 確認した内容

  • PEARライブラリは、composerを使ってインストールしている
  • PEARライブラリは、スクリプトの先頭でautoload.phpをrequireして一括読み込みしている。
  • 他のPEARライブラリの実行箇所は失敗しないので、requireに失敗しているということはなさそう。
  • スクリプトは、githubにリポジトリをあげている。ローカルと本番環境の両方で以下動作を行ったところ、本番環境のみMail_Mimeを使った箇所で、Class not foundとなる(ローカルだとエラーにならない)。
      * 任意のパスにcdして、スクリプトをgit cloneする
      * composer installでライブラリを一括ダウンロード(composer.lockファイルを使ってバージョン固定)
      * スクリプト実行

 phpのバージョン

ローカル:PHP 5.5.31 (cli) (built: Jan  8 2016 08:33:30)
本番環境:PHP 5.5.30 (cli) (built: Oct  1 2015 09:29:18) 

 composer.jsonファイルの中身

{
    "require-dev": {
        "pear/http_request2": "*",
        "pear/mail": "*",
        "pear/mail_mime": "*",
        "mustangostang/spyc": "*",
        "phpunit/phpunit": "*",
        "mockery/mockery": "*"
    }
}

 エラーが出ている箇所のソース

<?php

/**
 * メールでKPI情報を通知する
 */
class MailMessageNotifier implements MessageNotifier
{
    const DEFAULT_FROM_ADDRESS = "hogehoge@gmail.com";
    const DEFAULT_HEAD_CHARSET = "UTF-8";
    const DEFAULT_HTML_CHARSET = "UTF-8";

    protected $from;
    protected $bodyParam;

    /**
     * @param array|null $params
     * @return void
     */
    public function __construct($params = null){
        $this->from = isset($params['from']) ? $params['from']  : self::DEFAULT_FROM_ADDRESS;
        $this->bodyParam =
            isset($params['bodyParam']) ?
                $params['bodyParam'] :
                array("head_charset" => self::DEFAULT_HEAD_CHARSET ,"html_charset" => self::DEFAULT_HTML_CHARSET);
    }

    /**
     * @param array $destInfoArray
     * @param array $messageInfoArray
     * @return void
     */
    public function notifyMessage(array $destInfoArray,array $messageInfoArray){
        foreach($destInfoArray as $eachDestInfo){
            $this->sendMail(
                $eachDestInfo['address'],
                $messageInfoArray['subject'],
                $messageInfoArray['htmlMessage']);
        }
    }

    /**
     * @param string $to
     * @param string $subject
     * @param string $message
     */
    public function sendMail($to, $subject, $message){
        /**
         * 以下の箇所でMali_Mime使っているのですが、エラーになります。
         * ついでに、同じPEARのMailクラスはエラーにならないみたいです...。
         */
        //必要なオブジェクトの構築
        $mailObj = \Mail::factory("mail");
        $mimeObj = new \Mail_Mime(PHP_EOL);

        //メール本文の構築
        $mimeObj->setHtmlBody($message);
        $mailBody =  $mimeObj->get($this->bodyParam);

        //メールヘッダの構築(件名はphp.iniの設定に依存せず、必ずUTF-8でエンコーディングする)
        $defaultEncoding = mb_internal_encoding();
        mb_internal_encoding('UTF-8');
        $mailHeader = $mimeObj->headers(array(
            "To" => $to,
            "From" => $this->from,
            "Subject" => \mb_encode_mimeheader($subject)
        ));
        mb_internal_encoding($defaultEncoding);

        //メールの送信
        $mailObj->send($to,$mailHeader,$mailBody);
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

「Mail_mime」とすべきところが「Mail_Mime」になっているのが原因だと思います。
(centos上で確認済み)
開発環境ではファイル名の大文字小文字が区別されない状態になっているのではないでしょうか。
windowsユーザーなのでそのへんの詳しいところは分からないです、すみません。

$mimeObj = new \Mail_Mime(PHP_EOL); // before
$mimeObj = new \Mail_mime(PHP_EOL); // after

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/13 15:28

    nnssn様
    教えていただきありがとうございます。
    実際に試したところ、アドバイスいただいた通りの原因でした!

    「そもそもPHPがクラス名の大文字小文字を区別しない仕様だということを知らなかったり」、「ネット上で上がっているサンプルコードで、私のように"Mail_Mime"としているものがあがっていたり」と、自分では絶対に気がつけなかったと思います...。

    やはり、公式ドキュメントをきちんと読まなかったことが悪かったですね(笑)
    気をつけたいと思います。

    教えていただきありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る