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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

HTML

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

Q&A

解決済

6回答

3448閲覧

添付機能付きメールフォームの作成

slboy18

総合スコア11

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

HTML

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

0グッド

1クリップ

投稿2016/06/23 08:47

編集2016/06/29 02:13

###前提・実現したいこと
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/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

kei344

2016/06/23 08:51

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
slboy18

2016/06/23 09:33

ご指摘ありがとうございます。
guest

回答6

0

ベストアンサー

$_FILES['uploadfile'] の配列数をカウントで取得してforでループします。

$_FILES['uploadfile'][カウンター変数]['tmp_name']
で取得でしょうかね

投稿2016/06/23 10:17

YK1037

総合スコア236

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

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

slboy18

2016/06/24 01:10

if(isset($_FILES['uploadfile'])){ for($i = 0; $i < count($_FILES['uploadfile']['name']); $i++){ $name = $_FILES['uploadfile']['name'][$i]; $filename = $_FILES['uploadfile']['tmp_name'][$i]; } foreach($filename as $key => $value){ $handle[$key] = fopen($value, 'r'); $attachFile =fread($handle, filesize($filename)); fclose($handle); $attachEncode = base64_encode($attachFile); } } 修正おねがいいします。
YK1037

2016/06/24 02:27

$fileMoveDir = "../dir/tmp/"; // ファイル格納ディレクトリ(例) $moveFileName[0] = "test0.xls"; $moveFileName[1] = "test1.xls"; $moveFileName[2] = "test2.xls"; if(isset($_FILES['uploadfile'])){ for($i = 0; $i < count($_FILES['uploadfile']); $i++){ $name = $_FILES['uploadfile'][$i]['name']; // 配列[i] の ファイル名 $filename = $_FILES['uploadfile'][$i]['tmp_name']; // 配列[i] の テンポラリファイル名 move_uploaded_file( $_FILES["uploadfile"]["tmp_name"], $fileMoveDir.$moveFileName[$i]); // アップロードテンポラリファイル => ファイル格納パスへコピー $handle[$key] = fopen($fileMoveDir.$moveFileName[$i], 'r'); // ファイルオープン[読み取り専用] $attachFile = fread($handle, filesize($filename)); // ファイルサイズを指定 fclose($handle); // ファイルクローズ $attachEncode = base64_encode($attachFile); // エンコーディング } }
YK1037

2016/06/24 02:28

修正 : [$key]は要りません。 $handle = fopen($fileMoveDir.$moveFileName[$i], 'r'); // ファイルオープン[読み取り専用] ですかね
slboy18

2016/06/27 00:37

返信が遅くなってすみません。test0.xlsのところはこの名前で格納されるという感じですか?無知ですみません
guest

0

PHPMailer を利用したラッパークラスの例

php

1require_once('PHPMailer/class.phpmailer.php'); 2 3/** 4 * Mail.class.php 5 */ 6class Mail 7{ 8 9 /** 10 * メールを送信する 11 * @param string $strRecipient 宛先 12 * @param string $strSubject 題名 13 * @param string $strBody 本文 14 * @param string $binAttachment 添付ファイルへのパス 15 * @throws \Exception 16 */ 17 public static function send($strRecipient, $strSubject, $strBody, $binAttachment = null) 18 { 19 mb_language('japanese'); 20 mb_internal_encoding('utf-8'); 21 22 $from = 'sender@example.com'; 23 $fromname = '送信者名'; 24 25 $mail = new \PHPMailer(); 26 27 $mail->IsSMTP(); 28 $mail->SMTPAuth = TRUE; 29 $mail->Host = 'ホスト名'; 30 $mail->Port = 'ポート'; 31 $mail->Username = 'SMTPユーザー名'; 32 $mail->Password = 'SMTPパスワード'; 33 34 $mail->CharSet = "iso-2022-jp"; 35 $mail->Encoding = "7bit"; 36 37 $mail->AddAddress($strRecipient); 38 $mail->From = $from; 39 $mail->FromName = mb_encode_mimeheader( 40 mb_convert_encoding( 41 $fromname 42 , "JIS" 43 , 'utf-8' 44 ) 45 ); 46 $mail->Subject = mb_encode_mimeheader($strSubject); 47 $mail->Body = mb_convert_encoding( 48 $strBody 49 , "JIS" 50 , 'utf-8' 51 ); 52 53 if (!is_null($binAttachment) && file_exists($binAttachment)) { 54 $mail->AddAttachment($binAttachment); 55 } 56 57 if (!$mail->Send()) { 58 throw new \Exception($mail->ErrorInfo); 59 } 60 } 61 62} 63

投稿2016/06/23 09:52

編集2016/06/23 09:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

slboy18

2016/06/24 01:14

PHPMailerを使った場合添付機能だけ追加する場合を記述すればできるということでしょうか? if (!is_null($binAttachment) && file_exists($binAttachment)) { $mail->AddAttachment($binAttachment); } if (!$mail->Send()) { throw new \Exception($mail->ErrorInfo);
退会済みユーザー

退会済みユーザー

2016/06/24 05:16

このソースを丸ごと使えば利用できますよ。
slboy18

2016/06/27 00:27

もともとある機能に追加するという形での使用は可能ですか?
退会済みユーザー

退会済みユーザー

2016/06/27 02:57

元々ある機能がどんなものなのか私は知りませんので、判断しかねます。
guest

0

$filename = $_POST['uploadfile']; ポストの書き方あってると思います
foreach((array)$filename as $key => $value){
$handle[$key] = fopen($value, 'r');
このなかで、fread,fwrite,fclose
もやらないといけないと思いますよ!
}

投稿2016/06/23 09:48

YK1037

総合スコア236

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

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

slboy18

2016/06/23 09:55

```php $filename = $_POST['uploadfile']; foreach($filename as $key => $value){ $handle[$key] = fopen($value, 'r'); $attachFile =fread($handle, filesize($filename)); fclose($handle); $attachEncode = base64_encode($attachFile); } ``` これであってますか?
YK1037

2016/06/23 10:01 編集

$_POST['uploadfile'] ✖︎ すいません。 $_FILE['uploadfile'] が正解です。
slboy18

2016/06/23 10:12

$_FILES['uploadfile']に直しました。 エラーが増えました,,,
YK1037

2016/06/23 12:31

$_FILES['uploadfile'] の配列数をカウントで取得してforでループします。 $_FILES['uploadfile'][カウンター変数]['tmp_name'] で取得でしょうかね
guest

0

phpのファイルアップロードの情報自体は$_FILESに入るのはずなので、まずはvar_dump($_FILES)でリクエスト時にどういう情報がきているかを確認してはどうでしょう。

$_POSTもhtml側で'inputval[]' で渡すと、$_POST['inputval'][0]でアクセスできるので、
同じように$_FILES['uploadfile'][0]で一つ目のアップロードファイルにアクセスできるかもしれないです。

以下、「もしかしたらこんな感じで動くんじゃないかな」というコードを載せるだけ載せてみます

php

1foreach ($_FILES['uploadfile'] as $_file) { 2 $handle = fopen($_file['tmp_name'], 'r'); 3 $attachFile = fread($handle, $_file['size']); 4 fclose($handle); 5 $attachEncode = base64_encode($attachFile); 6 7 // 略 8}

投稿2016/06/23 09:40

attakei

総合スコア2738

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

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

0

PHP

1$filename = $_POST['uploadfile'];

$POST_ ではなく $_POST ではありませんか。

投稿2016/06/23 09:18

編集2016/06/23 09:47
taman777

総合スコア10

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

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

slboy18

2016/06/23 09:32

ご指摘ありがとうございます。$filename = $_POST['uploadfile'];に修正しましたが、やはり Invalid argument supplied for foreach() inがでてしまいます。
taman777

2016/06/23 09:46 編集

ああ、すみません。 思い出しました。 $_POST でもなくて $_FILES['uploadfile'] です。
guest

0

**$_FILES('uploadfile')**が配列になっているので、foreachで回す。

PHP

1$filename = $_FILES('uploadfile'); 2foreach($filename as $key => $value){ 3 $handle[$key] = fopen($value, 'r'); 4}

配列**$handle**にファイルポインタが入る。

投稿2016/06/23 08:57

編集2016/06/27 04:54
Yasha_Wedyue

総合スコア830

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

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

slboy18

2016/06/23 09:12

yuyaさん回答ありがとうございます。 今度は Invalid argument supplied for foreach()がでてしまいました。
Yasha_Wedyue

2016/06/24 02:08

$POST_('uploadfile')が空の場合そうなってしまいますね。 foreach($filename as $key => $value) ↓ foreach((array)$filename as $key => $value) これで$filenameがNULLでもエラーでなくて済みそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問