###前提・実現したいこと
PHPでメールフォームの機能を
作っています。
添付機能を新たに追加したいのですがなかなか
上手くいきません。
解決策や実装方法などありましたら教えてください。
現在アップロードしたファイルを添付して送信する
という処理を行っているのですが、送信メールに
送信されません。
###発生している問題・エラーメッセージ
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Type: image/jpeg; name=""
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=""
こんな感じになります。
###該当のソースコード
html
1<form id="testform" method="post" action="mail.php" enctype="multipart/form-data"> 2<input type="file" name="uploadfile[]"><br> 3<input type="file" name="uploadfile[]"><br> 4<input type="file" name="uploadfile[]"><br> 5</form>
php
1$dir ='img/upload/'; 2const MAX_SIZE =2048000; 3 4if(! checkPostMaxSize()){ 5 echo 'ファイルサイズは2MB以下にしてください<br><br>'; 6} 7 8if(isset($_FILES['uploadfile'])){ 9 for($i = 0; $i <count($_FILES['uploadfile']['name']); $i++){ 10 11 list($result, $ext, $error_msg) = checkFile($i); 12 if($result){ 13 $name = $_FILES['uploadfile']['name'][$i]; 14 $tmp_name = $_FILES['uploadfile']['tmp_name'][$i]; 15 $move_to = $dir.$name; 16 if(move_uploaded_file($tmp_name,$move_to)){ 17 echo h($move_to) . '<br>'; 18 echo '<img src="' . h($move_to). '" alt="アップロードされた画像"><br>'; 19 }else{ 20 $error_msg[] = '画像のアップロードに失敗しました'; 21 } 22 } 23 $handle = fopen($move_to, 'r'); 24 $attachFile = fread($handle, filesize($tmp_name)); 25 fclose($handle); 26 $attachEncode = base64_encode($attachFile); 27 if(count($error_msg) > 0){ 28 foreach($error_msg as $msg){ 29 echo h($msg). '<br>'; 30 } 31 } 32 } 33 } 34 35function checkFile($i) 36{ 37 $error_msg = array(); 38 $ext =''; 39 40 $size =$_FILES['uploadfile']['size'][$i]; 41 $error =$_FILES['uploadfile']['error'][$i]; 42 $img_type =$_FILES['uploadfile']['type'][$i]; 43 $tmp_name =$_FILES['uploadfile']['tmp_name'][$i]; 44 if($error != UPLOAD_ERR_OK){ 45 if($error == UPLOAD_ERR_NO_FILE){ 46 }elseif ($error == UPLOAD_ERR_INT_SIZE || 47 $error == UPLOAD_ERR_FORM_SIZE){ 48 $error_msg[] ='ファイルサイズは100KB以下にしてください'; 49 }else{ 50 $error_msg[] = 'アップロードエラーです'; 51 } 52 return array(false, $ext, $error_msg); 53 }else{ 54 if($img_type == 'image/gif'){ 55 $ext ='gif'; 56 } elseif ($img_type == 'image/jpeg' || $img_type == 'image/pjpeg'){ 57 $ext = 'jpg'; 58 } elseif ($img_type == 'image/png' || $img_type == 'image/x-png'){ 59 $ext = 'png'; 60 } 61 62 $finfo = new finfo(FILEINFO_MIME_TYPE); 63 $finfoType = $finfo->file($tmp_name); 64 65 if($size == 0){ 66 $error_msg[] ='ファイルが存在しないか空のファイルです。'; 67 }elseif ($size > MAX_SIZE){ 68 $error_msg[] ='ファイルサイズは100KB以下にしてください'; 69 }elseif ($img_type != $finfoType){ 70 $error_msg[] ='MIMEタイプが一致しません'; 71 }elseif ($ext != 'gif' && $ext !='jpg' && $ext != 'png'){ 72 $error_msg[] ='アップロード可能なファイルはgif、jpg、pngのみです'; 73 }else{ 74 return array(true, $ext, $error_msg); 75 } 76} 77 return array(false, $ext, $error_msg); 78} 79 80function checkPostMaxSize() 81{ 82 $max_size = ini_get('post_max_size'); 83 84 $multiple= 1; 85 $unit = substr($max_size, -1); 86 if($unit == 'M'){ 87 $multiple= 1024*1024; 88 } elseif ($unit == 'K'){ 89 $multiple =1024; 90 } elseif ($unit == 'G'){ 91 $multiple =1024*1024*1024; 92 } 93 $max_size = substr($max_size, 0, strlen($max_size) - 1)* $multiple; 94 95 if ($_SERVER['REQUEST_METHOD'] == 'POST' && 96 $_SERVER['CONTENT_LENGTH'] > $max_size){ 97 return false; 98 }else{ 99 return true; 100 } 101}
PHP
1function adminHeader($userMail,$post_mail,$BccMail,$to){ 2 $header = ''; 3 if($userMail == 1 && !empty($post_mail)) { 4 $header="From: $post_mail\n"; 5 if($BccMail != '') { 6 $header.="Bcc: $BccMail\n"; 7 } 8 $header.="Reply-To: ".$post_mail."\n"; 9 }else { 10 if($BccMail != '') { 11 $header="Bcc: $BccMail\n"; 12 } 13 $header.="Reply-To: ".$to."\n"; 14 } 15 $header.="Content-Type:text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); 16 return $header; 17 $header .= "MIME-Version: 1.0\n"; 18 $header .= "Content-Type: multipart/mixed; boundary=\"__PHPRECIPE__\""; 19} 20 21function mailToAdmin($arr,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp){ 22 $adminBody="「".$subject."」フォームから送信されました\n\n"; 23 $adminBody .="Content-Type: text/plain; charset=\"ISO-2022-JP\"\r\n"; 24 $adminBody .="\r\n"; 25 $move_to = mb_encode_mimeheader($move_to, "ISO-2022-JP", "B"); 26 $adminBody .="Content-Type: image/jpeg; name=\"$name\"\r\n"; 27 $adminBody .="Content-Transfer-Encoding: base64\r\n"; 28 $adminBody .="Content-Disposition: attachment; filename=\"$name\"\r\n"; 29 $adminBody .="\r\n"; 30 $adminBody .= chunk_split($attachEncode) . "\r\n"; 31 $adminBody .="===========================\n\n"; 32 $adminBody.= postToMail($arr);//POSTデータを関数からセット 33 $adminBody.="\n===========================\n"; 34 $adminBody.="送信された日時:".date( "Y/m/d (D) H:i:s", time() )."\n"; 35 $adminBody.="送信者のIPアドレス:".@$_SERVER["REMOTE_ADDR"]."\n"; 36 $adminBody.="送信者のホスト名:".getHostByAddr(getenv('REMOTE_ADDR'))."\n"; 37 if($confirmDsp != 1){ 38 $adminBody.="問い合わせのページURL:".@$_SERVER['HTTP_REFERER']."\n"; 39 }else{ 40 $adminBody.="問い合わせのページURL:".@$arr['httpReferer']."\n"; 41 } 42 if($mailFooterDsp == 1) $adminBody.= $mailSignature; 43 return mb_convert_encoding($adminBody,"JIS",$encode); 44}
###試したこと
課題に対してアプローチしたことを記載してください
一度添付ファイルをサーバーにアップロードして
そこから読みとって添付しようとしましたが
ファイル名まで読み取れず失敗しました。
$filename=$_FILES["uploadfile"]等
もやってみましたができませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
回答6件
あなたの回答
tips
プレビュー