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

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

ただいまの
回答率

90.35%

  • PHP

    21296questions

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

  • HTML

    9549questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • CSS

    6187questions

    CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

phpで添付ファイル付きのメールを送信できません

受付中

回答 2

投稿

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

KentaroOnoda

score 11

phpでホームページを作成しているのですが、その中の機能の一つとして、お問い合わせ画面から添付ファイル付きのメールを送信する機能を作成しています。メール送信の流れとしては、以下の通りとなります。
1.お問い合わせ画面(contact.php)で必要な項目を入力する。このときに必要であればファイルも添付する。
2.「内容を確認する」ボタンをクリックすると確認画面(contactsure.php)で入力内容を確認する。
*「内容を確認する」ボタンをクリックすると、「pagecheck.php」⇒「contactsure.php」の順で画面が遷移する
3.内容を確認して良ければ「送信する」ボタンをクリックして入力内容を送信する。
*「送信する」ボタンをクリックすると「mailsend.php」⇒「contact.php」の順で遷移する
4.送信に成功するとお問い合わせ画面に戻って「お問い合わせ内容を送信しました。」と表示される。
*送信に失敗した場合もお問い合わせ画面に戻って「お問い合わせ内容を送信できませんでした。」と表示される。

以下各画面のスクリーンショット及びコードになります。
(文字数制限があるため今回の質問とは関係ないと思われるところは一部削除しています。)

お問い合わせ画面の入力前・入力後(例)のスクリーンショット及びコードは以下の通りとなります。
↓入力前
イメージ説明
↓入力後(例)
イメージ説明

ファイル名:contact.php

<?php
    echo "<form action=/" . $projectName . "/php/pagecheck.php method=post name=hpb_plugin_form enctype = multipart/form-data>";

?>
  <h3>お問い合わせフォーム</h3>
  <p class="contactSentence">お問い合わせ内容を入力してください。</p>
  <p class="contactSentence">*は必須項目です。</p>

  <table>

  </table><br><br>

  <span>有価買取ご依頼のお客様は買取リストを添付してください。</span><br>

  <table>
      <tr>
          <th>買取リスト</th>
          <td><input type ="hidden" name = "MAX_FILE_SIZE" value = "102400">
             <input type = "file" width = "120" name = "sendfile" /></td>
      </tr>
  </table>



  <p class="contactButtons">
    <input type="submit" name="check" value="個人情報の取り扱いについて" class="imformationButton" />
      <input type="hidden" name="hpb_plugin_form_submit" value="true" />
      <input type="submit" name="submit" value="内容を確認する" id = "submit" class="makeContentButton" />
  </p>

</div></div>
      <!-- main end -->
    </div>
    <!-- content end --><!-- サイトバー -->


↓確認画面のスクリーンショット及びコードは以下の通りになります。
イメージ説明

ファイル名:pagecheck.php

<?php

if(isset($_POST['submit']) || isset($_POST['check'])){


    if(isset($_POST['check'])){

    }else{

        if($i > 0){

        }else{

            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") )){
                    //アップロードファイルの移動に成功した場合
                    $_SESSION['fname'] = $fname;
                    $_SESSION['target']= $target;
                    $_SESSION['filetype']= $filetype;

                }

            }//if

            //入力内容確認画面に遷移する
            $filePathName = "contactsure";

            $filepath = filePathReturn($filePathName,$projectName);

            header($filepath);
            exit;

        }//if

    }//if

}else{

}//if

ファイル名:contactsure.php

<?php
    echo "<form action=/" . $projectName . "/php/mailsend.php method=post>";


    $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($_SESSION['fname'])){

        //アップロードファイルの移動に成功した場合
        $arr1['添付ファイル'] = $_SESSION['fname'];
        $arr2['fname'] = $_SESSION['fname'];

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

    }//if

    echo "<table>";

    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

    echo "</table>";

?>
    <p class="contactButtons">
        <input name="back" type="submit" id="back" value="内容を訂正する" class="imformationButton" />
        <input name = "submit" type="submit" id = "submit" value="送信する" class="makeContentButton" />
    </p>
<?php echo "</form>";?>
</div></div>
      <!-- main end -->
    </div>  


ファイル名:mailsend.php

<?php
    if(isset($_POST['back'])){

    }elseif(isset($_POST['submit'])){

        //メールの本文を作成
        $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;


        $message = mb_convert_encoding($honbun, "JIS", "utf-8");


        //各項目をShift-JISに変換
        //件名
        $title = mb_encode_mimeheader(mb_convert_encoding("ライフワンへのお問い合わせ", "JIS", "utf-8"),"JIS");

        //送信先アドレス
        $to = mb_convert_encoding("kentaro-onoda@lifeone.or.jp",
                /*love@lifeone.or.jp,*/ "JIS", "utf-8");

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

            $filename = $_POST['fname'];
            $boundary = "_BOUNDARY_";
            $message1 = "\n" . "--" . $boundary . "\n";

            $message2= $message1 . "Content-Type: " . /**mime_content_type($filetype)**/ $filetype . "; name=\"" . $filename . "\n";
            $message3= $message2 . "Content-Disposition: attachment; filename=" . $filename . "\n";
            $message4= $message3 . "Content-Transfer-Encoding: base64\n";

            $message5= $message4 . "\n" . chunk_split(base64_encode(file_get_contents($filepath,FILE_USE_INCLUDE_PATH))). "\n";
            $message6= $message5 . "--" . $boundary . "--";

        }//if

        //内容
        $message = "--" . $boundary . "\n" . "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n" .mb_convert_encoding($honbun , "JIS" , "utf-8") . $message6;

        //送信元メールアドレス
        $from = "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\n" ."From: " . $mailaddress1;

        $xmail = "X-Mailer: PHP/". phpversion();

        $i = 0;

        if(mail($to, $title, $message, $from . "\r\n" . $xmail)){
            //メール送信が完了した場合
            $_SESSION['error' . $i] = "お問い合わせ内容を送信しました。";
            $_SESSION['mailsend'] = TRUE;

        }else{
            //メール送信ができなかった場合
            $_SESSION['error' . $i] = "お問い合わせ内容を送信できませんでした。";

        }//if

        $i++;
        $_SESSION['errorNum'] = $i;

    }//if


}//if
    //ファイルパスを取得
    $filePathName = "contact";
    $filepath = filePathReturn($filePathName,$projectName);

    header($filepath);
    exit;


現在の状況としては添付なしの場合メール送信できますが、添付有りの場合以下の画面のように表示されメール送信できません。

イメージ説明
自分でデバックをしてみたところ、mailsend.phpのif(mail($to, $title, $message, $from . "\r\n" . $xmail))の部分で何らかの原因でFALSE になってしまうためだと分かりました。どなたか原因に心当たりがある方がいらっしゃいましたら、ご教示頂けると幸いです。よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2017/09/14 16:53

    サーバーのエラーログは確認しましたか?

    キャンセル

  • KentaroOnoda

    2017/09/14 17:19

    ご指摘ありがとうございました。ログは確認しましたが、特にエラー表示されていないです。

    キャンセル

  • t_obara

    2017/09/20 19:01

    一般的なメールクライアントが作成するメール内容と、提示されたコードが生成したメール内容を見比べてみて、何が違うのか、違う部分がどのコードに由来するのかをご確認いただくと、問題の原因が絞り込めるのではないでしょうか。

    キャンセル

  • KentaroOnoda

    2017/09/26 14:54

    ご指摘ありがとうございます。参考にしてみます。

    キャンセル

回答 2

0

$messageのダブルクォートが一部抜けてます。
下記のように、mailsend.phpにコードを追加してメールを送信する前にメールが送信されるときの内容を見てみます。

...
echo '<pre>';
echo $from ."\n";
echo $message ."\n";
echo '</pre>';
exit();

if (mail(...)) {
    ...
} else {
    ...
}

下記表示結果です。

Content-Type: text/plain; name="《添付ファイル名》の部分の末尾のダブルクォートが抜けてます。

いちおうダブルクォートなくても大丈夫な場合もありますが、ダメな場合もあるので、下記のContent-Disposition: attachment; filename=《添付ファイル名》の部分もダブルクォートでくくります。

それから、《メール本文》のContent-Transfer-Encoding: 7bitが抜けてます。

Content-Type: multipart/mixed; boundary="_BOUNDARY_"
From: 《メールアドレス》
--_BOUNDARY_
Content-Type: text/plain; charset="ISO-2022-JP"

《メール本文》

--_BOUNDARY_
Content-Type: text/plain; name="《添付ファイル名》
Content-Disposition: attachment; filename=《添付ファイル名》
Content-Transfer-Encoding: base64

《Base64エンコードした添付ファイルの内容》

--_BOUNDARY_--

mailsend.phpPHPのコードを下記のようにしてみてはいかがでしょうか。

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

    $filename = $_POST['fname'];
    $boundary = "_BOUNDARY_";
    $message1 = "\r\n" . "--" . $boundary . "\r\n";

    //↓修正
    $message2= $message1 . "Content-Type: " . /**mime_content_type($filetype)**/ $filetype . "; name=\"" . $filename . "\"\r\n";
    //↓修正
    $message3= $message2 . "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n";
    $message4= $message3 . "Content-Transfer-Encoding: base64\r\n";

    $message5= $message4 . "\r\n" . chunk_split(base64_encode(file_get_contents($filepath,FILE_USE_INCLUDE_PATH))). "\r\n";
    $message6= $message5 . "--" . $boundary . "--";
}//if

//↓修正
//内容
$message  = "--" . $boundary . "\r\n";
$message .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$message .= mb_convert_encoding($honbun , "JIS" , "utf-8");

//添付ファイルがある場合
if (isset($message6)) {
    $message .= $message6;
}

あと、気になったのですがメールの場合は改行コードは\nではなく\r\nです。PHPだとエラーにはならないハズですが、気持ち悪いので修正したほうがいいです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/15 12:20

    丁寧なご回答頂き誠にありがとうございます。ご指摘頂いた内容で早速試してみたのですが、やはりメールを送信する事はできませんでした。やはり他に原因があるのかもしれないですね・・・

    キャンセル

0

さすがにmail()の戻り値だけでは原因を特定できないので、すべてのエラーを表示するようにしてみてはどうでしょうか?
mailsend.phpの頭にerror_reportingを設定してみて下さい。

<?php
error_reporting(E_ALL);

またmail()の引数をすべてログに落とすかvar_dumpしてみましょう。
原因を特定できないときは、すべての変数やエラーメッセージを出力してみるといいですよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    21296questions

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

  • HTML

    9549questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • CSS

    6187questions

    CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。