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 になってしまうためだと分かりました。どなたか原因に心当たりがある方がいらっしゃいましたら、ご教示頂けると幸いです。よろしくお願いします。