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

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

ただいまの
回答率

89.64%

php 添付ファイルだけが送信されてこない

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 955

tomo39-.

score 17

こんにちは。
ウェブサイトを運営しているものなのですが、
お問い合わせフォームより問い合わせをいただいた際に、
添付ファイルの選択ボタンも設置しており、ウェブ上よりは
添付ファイルを選択して添付ができて、送信するとメッセージは送信されます。

しかし、テストで行ってみると、メールの内容や送信者はは無事に受信ボックスに送信されてくるのですが、
添付ファイルだけが添付されていない状態でメールがきてしまいました。

どこをみて対処すればいいのでしょうか? 
sendmail.php内のコードは下記になっております。

<?php
$error = 0;
$to= "1hightouch@gmail.com";
$senderEmail = filterInput($_POST['email']);
$name = filterInput($_POST['name']); 
$message = filterInput($_POST['message']);
$subject = filterInput($_POST['subject']);
$attachment = $_FILES['file']['tmp_name'];
$attachment_name = $_FILES['file']['name'];
die('test');

function filterInput($data)
{
     $data = trim($data);
     $data = stripslashes($data);
     $data = htmlspecialchars($data);
     return $data;
}
    if( isset( $_FILES[ 'file' ] )){

        $attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'])));
        $filename = $_FILES['file']['name'];

        $allowed =  array('gif','png' ,'jpg');
        $filename = $_FILES['file']['name'];
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if(!in_array($ext,$allowed) ) {
            ?>
            <script type="text/javascript">

                window.location = 'index.php?error=1';
            </script>
            <?php
        }
        if($_FILES["file"]["size"] < 5120000 ) {
            ?>
            <script type="text/javascript">

                window.location = 'index.php?error=2';
            </script>
            <?php
        }
        $_FILES["imagefile"]["size"] < 2120000
        $boundary =md5(date('r', time())); 

        $headers = "From: ". $senderEmail ."\r\nReply-To: ". $senderEmail ."";
        $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\"";

        $message .="This is a multi-part message in MIME format.

--_1_$boundary
Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

--_2_$boundary
Content-Type: text/plain; charset=\"iso-8859-1\"
Content-Transfer-Encoding: 7bit

$message

--_2_$boundary--
--_1_$boundary
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment
--_1_$boundary--";

        mail($to, $subject, $message, $headers);

}else{
    $headers = "From: $senderEmail";
         $semi_rand = md5(time()); 
        $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
         $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 
    @mail($to, $subject, $message, $headers);

}

?>
<script type="text/javascript">

    window.location = 'index.php?msg=success';
</script>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Kosuke_Shibuya

    2018/08/08 13:21

    回答者が動作を再現するのに必要な部分のソースコードを提示してください。

    キャンセル

  • Kosuke_Shibuya

    2018/08/08 15:22

    phpMailer というライブラリを使っているように見えるのでタイトルから 「Mailer」を削除した方が良いですね。

    キャンセル

  • namda

    2018/08/08 19:29

    参考にしたページがあるならそのページのURLも乗せると良いでしょう。

    キャンセル

回答 2

+1

手元で動かく環境ないので推察ですが、multipartの入れ子構造がおかしいように思います。

multipartなメールの構造は通常どの程度まで複雑な入れ子になるか の「単純な添付ファイル付きメール」を参考にすると今回のパターンは

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="_1_$boundary"
This is a multi-part message in MIME format.

--_1_$boundary
Content-Type: multipart/alternative; boundary="_2_$boundary"

--_2_$boundary
--_2_$boundary--
--_1_$boundary
--_1_$boundary--

となっていて1発めにマルチパートを宣言しその子パートでもう一回マルチパートを指定しその中に本文を書き込み
続いて親パート側にファイルを添付しています。この場合メーラは親パートと子パートの関連性を正しく認識できないように思います。
※先のリンクの「HTMLメールで、代替テキストパートを含み、添付ファイルも添付した場合」にあたる。

なので

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="_1_$boundary"

--_1_$boundary
本文ボデー
--_1_$boundary
添付
--_1_$boundary--

とすれば動くのではないでしょうか。

 ただし!

メールのヘッダやボディを自家開発するのは非常に危険極まりない行為です。
自家開発で脆弱性を作り突かれ最悪スパムメールの踏み台にされ自分が加害者側に回る危険性すらあります。

PHPにはPHPMailerという多数の技術者が保守しているライブラリがあり、もっと簡単に本文や添付ファイルを添付することが出来るので使用することをおすすめします。
(過去に何度か脆弱性を突かれていますが都度メンテされセーフティに保守されています。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

このコード、そもそも実務に耐えられません。
スパムの踏み台にできるし、(多分)サイトまでたどり着けるんで、削除依頼出して問い合わせフォームはちゃんとした業者に任せたほうがいいですよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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