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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

2回答

2322閲覧

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

tomo39-.

総合スコア27

PHP

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

0グッド

1クリップ

投稿2018/08/08 04:19

編集2018/08/08 06:26

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

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

どこをみて対処すればいいのでしょうか? 
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>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/08 04:21

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

退会済みユーザー

2018/08/08 06:22

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

2018/08/08 10:29

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

回答2

0

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

投稿2018/08/08 11:43

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

手元で動かく環境ないので推察ですが、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という多数の技術者が保守しているライブラリがあり、もっと簡単に本文や添付ファイルを添付することが出来るので使用することをおすすめします。
(過去に何度か脆弱性を突かれていますが都度メンテされセーフティに保守されています。)

投稿2018/08/08 11:23

namda

総合スコア705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問