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

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

ただいまの
回答率

90.53%

  • PHP

    20256questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • PEAR

    144questions

    PEAR (PHP Extension and Application Repository)はPHPで利用する事ができるライブラリです。

PEARで添付ファイルが送信できません。

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 570

KentaroOnoda

score 11

PHPのMail及びMimeパッケージを使って添付ファイル付きのメールを送信するプログラムを作成しています。現在メールを送信することはできるのですが、ファイルが添付されておらず、また本文中の改行コード(コード中の"\n")が文字化けしてしまい、送信したメールには改行が反映されていない状態です。ちなみに作成中のソースは以下の通りになります。

require_once("Mail.php");
        require_once("Mail/mime.php");


        $params = array(
                "host" => "ssl://smtp.lolipop.jp",
                "port" => 465,
                "auth" => true,
                "username" => "○○○○@△△△△.or.jp",
                "password" => "××××"
        );

        $mailObject = Mail::factory("smtp",$params);

        $recipients = "○○○○@△△△△.or.jp";

        //メールの本文を作成
        $honbunName = "氏名:" . $name . "\n";
        $honbunFurigana = "フリガナ:" . $furigana . "\n";
        $honbunCompany = "会社名:" . $company . "\n";
        $honbunZipcode = "郵便番号:〒". $zipcode1 . "-" . $zipcode2 . "\n";
        $honbunAddress = "住所:" . $prefecture . $cityName . $building . "\n";
        $honbunMailAddress = "メールアドレス:" . $mailaddress1 . "\n";
        $honbunPhoneNumber = "電話番号:" . $phoneNumber1 . "-" . $phoneNumber2 . "-" . $phoneNumber3 . "\n";
        $honbunContent = "問い合わせ内容:" . $content;

        $honbun = $honbunName . $honbunFurigana . $honbunCompany . $honbunZipcode . $honbunAddress . $honbunMailAddress. $honbunPhoneNumber .$honbunContent;

        $body = mb_convert_encoding($honbun, "ISO-2022-JP", "utf-8");

        $mimeObject = new Mail_Mime("¥n");
        $mimeObject -> setTxtBody($body);



        //mb_language("ja");

        //各項目をShift-JISに変換
        //件名
        $title = mb_encode_mimeheader(mb_convert_encoding("○○○○", "JIS", "utf-8"),"JIS");

        //送信先アドレス
        $to = mb_convert_encoding("○○○○@△△△△.or.jp", "JIS", "utf-8");

        if(isset($_POST['fname'])){
            //添付ファイルがある場合
            $filepath = $_POST['filepath'];
            $filetype = $_POST['filetype'];

            $mimeObject -> addAttachment($filepath, $filetype);

        }//if

        $bodyParam = array(
                "head_charset" => "ISO-2022-JP",
                "text_charset" => "ISO-2022-JP"
        );

        $body = $mimeObject -> get($bodyParam);


        $addHeaders = array(
                "To" => $to,
                "From" => $mailaddress1,
                "Subject" => $title
        );

        $headers = $mimeObject -> headers($addHeaders);

         $mailObject -> send($recipients, $headers, $body);


$filepath については「../フォルダ名/ファイル名」というように上記の処理を行うファイルからの相対パスで値を受け取る。

ちなみにアップロードしたファイル情報を受け取る部分は以下のように作成しました。

//連想配列に各要素を格納する
    //表示用
    $arr1 = array('お名前' => $name,'フリガナ' => $furigana,'会社名' => $company,'郵便番号' => $zipcode,'住所' => $address,
                'メールアドレス' => $mailaddress1,'電話番号' => $phoneNumber,'お問い合わせ内容' => nl2br($content));

    //データ処理用
    $arr2 = array('name' => $name,'furigana' => $furigana,'company' => $company,'zip1' => $zipcode1,'zip2' => $zipcode2,
            'prefecture' => $prefecture,'cityName' => $cityName,'building' => $building,
            'mailaddress1' => $mailaddress1,'mailaddress2' => $mailaddress2,'phoneNumber1' => $phoneNumber1,
            'phoneNumber2' => $phoneNumber2,'phoneNumber3' => $phoneNumber3,'content' => $content);

    if(isset($_FILES['sendfile']['name'])){
        //ファイルが添付されている場合
        $fname = $_FILES['sendfile']['name'];
        $temp = $_FILES['sendfile']['tmp_name'];
        $target = '../file/' . $fname;
        $filetype = $_FILES['sendfile']['type'];

        if(move_uploaded_file($temp, mb_convert_encoding($target, "SJIS", "AUTO") )){
            //アップロードファイルの移動に成功した場合
            $arr1['添付ファイル'] = $fname;
            $arr2['fname'] = $fname;

            //ファイルパスを設定
            echo "<input type = hidden name = filepath value = '" . $target . "' />";
            echo "<input type = hidden name = filetype value = '" . $filetype . "' />";
        }

    }//if

    foreach ($arr1 as $ky => $val){
        //入力内容を表示する
        echo "<tr><th>" . $ky . "</th><td>" . $val . "</td></tr>";

    }//for-each

    foreach ($arr2 as $ky => $val){
        //送信するデータをhiddenで表示する
        echo "<input type = hidden name = " . $ky . " value = '" . $val . "' />";

    }//for-each

ファイルが添付されない原因につきましては自分でデバックしたところ、$mimeObject -> addAttachment($filepath, $filetype);のところで「PEAR_Error:File not found」とエラー表示がされました。
エラー内容

原因に何か心当たりがございましたら、ご教示・ご指摘の程よろしくお願いします。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • KentaroOnoda

    2017/03/15 19:40

    値の例としては「../file/○○○.pdf」です。

    キャンセル

  • Kosuke_Shibuya

    2017/03/15 19:40

    https://teratail.com/questions/68299 この質問の関連ですか?

    キャンセル

  • KentaroOnoda

    2017/09/08 09:51

    ご返答が遅くなってしまいすみません。はい、そうです。

    キャンセル

回答 2

0

この質問の関連であると仮定して回答します。
https://teratail.com/questions/68299

アップロードしてファイルは、$_POST では受け取れません。

$_FILES['sendfile']; で受け取ってください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/16 09:24

    ご回答頂きありがとうございます。
    https://teratail.com/questions/68299 
    上の質問とはやりたい事は同じですが、やり方が違いますので関係ないと考えてください。

    私が質問したいのはコード文中のaddAttachment($filepath, $filetype)の部分で「PEAR_Error:File not found」となる理由です。分かりにくい質問ですみません。もし原因に心当たりがあればご指摘頂けると幸いです。よろしくお願いします。

    キャンセル

  • 2017/03/16 09:28

    var_dump( $filepath );

    $filepath = $_POST['filepath'];
    の舌に記述して正しい値が入っているかどうかを確認してください。

    キャンセル

  • 2017/03/16 20:29

    確認したところ正しい値が入っていました。

    キャンセル

  • 2017/03/16 21:48

    $fname; に入っているのは、ファイルが存在していない、アップロード時のがいる名でしょう。ファイルが存在しているのは $temp です

    キャンセル

0

まず既に Kosuke_Shibuya さんも書かれていますが、アップロードされたファイルは $_POST ではなく、$_FILES で受け取らねばなりません。
その上で、$_FILES は、次のような構造を持っていて、直接ファイルを示していません。

  $_FILES = array(
    '{アップロード時のname属性の値}' = array (
      'name' => '{本来のファイル名}',
      'tmp_name' => '{テンポラリ領域に格納されているファイルのファイル名}', //※ファイル名競合を避けてユニーク名に変更されています
      'size' => {ファイルサイズ},
      'type' => '{ブラウザから渡されたファイルの MIME-TYPE}',
      'error' => {アップロードに関するエラーコード}
    ),
  );


なので直接 $_FILES[{id}][name] を見ても、その時点では実態はそこにありません(そもそもパスがなく、単なるファイル名です)。
move_uploaded_file ( $_FILES[{id}]['tmp_name'], '{ファイル配置場所}/' . $_FILES[{id}]['name'] ) を使って、適当な場所(たいていは /tmp/ 以下の書き込み可能なディレクトリの下)にファイルを再配置してから使います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/16 20:30

    ご回答頂きありがとうございます。質問内容が説明不足で申し訳ないのですが、アップロードしたファイルを$_FILESで受け取る部分は別で作成しています。こちらの質問をご覧頂けると幸いです。⇒https://teratail.com/questions/68299

    キャンセル

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

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

関連した質問

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

  • PHP

    20256questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • PEAR

    144questions

    PEAR (PHP Extension and Application Repository)はPHPで利用する事ができるライブラリです。