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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

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

Q&A

解決済

1回答

3373閲覧

jqueryのajaxのフォームで添付ファイルが送信できない

nosonosolife

総合スコア42

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

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

0グッド

0クリップ

投稿2017/12/02 15:55

jqueryのajaxとphpを使用して添付ファイル付きメールを送信するフォームを作成したのですが、「正しく送信されました」とポップアップが出たにもかかわらずメールが送信されていません。
原因は何でしょうか。ご提示よろしくお願いいたします。

javascript

1$(document).ready(function(){ 2 $("#mailform form").submit(function(event) { 3 // HTMLでの送信をキャンセル 4 event.preventDefault(); 5 6 var errMsg = ""; 7 var isFormError = false; 8 9 var tmpName = ""; 10 var tmpMessage = ""; 11 12 var buf = ""; 13 buf = $(this).find("[name = Penname]").val().replace(/\s+$/,""); 14 if(buf == ""){ 15 errMsg += "ペンネームを入力してください\n"; 16 isFormError = true; 17 } 18 else if(buf.length > 20){ 19 errMsg += "ペンネームが長すぎます("+buf.length+"文字))\n"; 20 isFormError = true; 21 } 22 else{ 23 tmpName = buf; 24 } 25 26 buf = $(this).find("[name = Message]").val().replace(/\s+$/,""); 27 if(buf ==""){ 28 errMsg += "メッセージを入力してください\n"; 29 isFormError = true; 30 } 31 else if(buf.length > 10000){ 32 errMsg += "メッセージが長すぎます 現在("+buf.length+"文字)\n"; 33 isFormError = true; 34 } 35 else{ 36 tmpMessage = buf; 37 } 38 39 if(isFormError == true){ 40 alert(errMsg); 41 event.preventDefault(); 42 return false; 43 } 44 else if(window.confirm("この内容で送信します。")==true){ 45 // 無駄な空白を省いた物(telは全角半角変換も有り) 46 $(this).find("[name = Name]").val(tmpName); 47 $(this).find("[name = Message]").val(tmpMessage); 48 49 $.ajax({ 50 type: $(this).attr('method'), 51 url: $(this).attr('action'), 52 data: $(this).serialize(), 53 timeout: 10000, // 単位はミリ秒 54 processData: false, 55 contentType: false, 56 57 // 送信前 58 beforeSend: function(xhr, settings) { 59 // ボタンを無効化し、二重送信を防止 60 $(this).find('submit').attr('disabled', true); 61 }, 62 // 応答後 63 complete: function(xhr, textStatus) { 64 // ボタンを有効化し、再送信を許可 65 $(this).find('submit').attr('disabled', false); 66 }, 67 success: function(result, textStatus, xhr) { 68 alert('正しく送信されました。'); 69 $(this).find("[name = Message]").val(''); 70 }, 71 // 通信失敗時の処理 72 error: function(xhr, textStatus, error) { 73 alert('正しく送信されませんでした。\n' + error ); 74 } 75 }); 76 77 return false; 78 } 79 return false; 80 }); 81});

php

1<?php 2 3//Ajax通信ではなく、直接URLを叩かれた場合はエラーメッセージを表示 4if ( 5 !(isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest") 6 && (!empty($_SERVER["SCRIPT_FILENAME"]) && "hoge.php" === basename($_SERVER["SCRIPT_FILENAME"])) 7 ) 8{ 9 header("HTTP/1.1 404 Not Found"); 10} 11// SETUP 12mb_language( "japanese" ); 13mb_internal_encoding( "UTF-8" ); 14date_default_timezone_set("Asia/Tokyo"); 15 16$field_subject = $_POST["Subject"]; 17$field_penname = $_POST["Penname"]; 18$field_pref = $_POST["Pref"]; 19$field_message = $_POST["Message"]; 20$date = date("Y/m/d D H:i:s"); 21 22$to_email = "test@hoge.com"; 23$from_email= "test-from@hoge.com"; 24$from_name = "test-from@hoge.com"; 25$subject = $field_subject." 投稿通知"; 26 27$body = "[投稿日時] ".$date."\n"; 28$body .= "ペンネーム : ".$field_penname."\n"; 29$body .= "都道府県 : ".$field_pref."\n"; 30$body .= "\n"; 31$body .= "■メッセージ"."\n"; 32$body .= $field_message."\n"; 33 34if (is_uploaded_file($_FILES['upfile']['tmp_name'])) { 35 // 未定義である・複数ファイルである・$_FILES Corruption 攻撃を受けた 36 // どれかに該当していれば不正なパラメータとして処理する 37 if (!isset($_FILES['upfile']['error']) || !is_int($_FILES['upfile']['error'])) { 38 header("HTTP/1.1 503 Service Unavailable"); 39 return; 40 } 41 42 // $_FILES['upfile']['error'] の値を確認 43 switch ($_FILES['upfile']['error']) { 44 case UPLOAD_ERR_OK: // OK 45 break; 46 case UPLOAD_ERR_NO_FILE: // ファイル未選択 47 header("HTTP/1.1 503 Service Unavailable"); 48 return; 49 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 50 case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 (設定した場合のみ) 51 header("HTTP/1.1 503 Service Unavailable"); 52 return; 53 default: 54 header("HTTP/1.1 503 Service Unavailable"); 55 return; 56 } 57 58 // ここで定義するサイズ上限のオーバーチェック 59 // (必要がある場合のみ) 60 if ($_FILES['upfile']['size'] > 8000000) { 61 header("HTTP/1.1 503 Service Unavailable"); 62 return; 63 } 64 65 // $_FILES['upfile']['mime']の値はブラウザ側で偽装可能なので 66 // MIMEタイプに対応する拡張子を自前で取得する 67 if (!$ext = array_search( 68 mime_content_type($_FILES['upfile']['tmp_name']), 69 array( 70 'gif' => 'image/gif', 71 'jpg' => 'image/jpeg', 72 'png' => 'image/png', 73 'pdf' => 'application/pdf', 74 ), 75 true 76 )) { 77 header("HTTP/1.1 503 Service Unavailable"); 78 return; 79 } 80 81 // ファイルデータからSHA-1ハッシュを取ってファイル名を決定し,保存する 82 if (!move_uploaded_file( 83 $_FILES['upfile']['tmp_name'], 84 $path = sprintf('./upload/%s.%s', 85 sha1_file($_FILES['upfile']['tmp_name']), 86 $ext 87 ) 88 )) { 89 header("HTTP/1.1 503 Service Unavailable"); 90 return; 91 } 92 93 // ファイルのパーミッションを確実に0644に設定する 94 chmod($path, 0644); 95} 96// send the email 97if (!empty($field_penname)) { 98 sendmail_jpn($to_email, $subject, $body, $from_email,$from_name, $path); 99} 100sleep(1); 101 102//関数----------------------------------- 103 104function sendmail_jpn($to, $subject, $message, $from_email,$from_name, $filepath) 105{ 106if (!empty($filepath)) { 107$file_ext = pathinfo($filepath, PATHINFO_EXTENSION); 108 if ($file_ext == "pdf") { 109 $mime_type = "application/pdf"; 110 } elseif ($file_ext == "jpg" || $file_ext == "jpeg") { 111 $mime_type = "image/jpeg"; 112 } elseif ($file_ext == "gif") { 113 $mime_type = "image/gif"; 114 } elseif ($file_ext == "png") { 115 $mime_type = "image/png"; 116 } else { 117 $mime_type = "application/octet-stream"; 118 } 119 120// 添付ファイルのエンコード 121$filename = basename( $filepath ); 122 123// マルチパートなので、パートの区切り文字列を指定 124$boundary = "----=_Boundary_" . uniqid(rand(1000,9999) . "_") . "_"; 125}else { 126$boundary = null; 127} 128 129// 件名のエンコード 130$subject = mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8"); 131$subject = mb_encode_mimeheader_ex($subject); 132 133// 本文のエンコード 134$message = mb_convert_encoding($message, "ISO-2022-JP", "UTF-8"); 135 136// toをエンコード 137// $to = mb_convert_encoding($mail["to"]["name"], "SJIS", "UTF-8"); 138$to = "=?ISO-2022-JP?B?" . base64_encode($to) . "?= <" . $to . ">"; 139 140// fromをエンコード 141// $from = mb_convert_encoding($mail["from"]["name"], "SJIS", "UTF-8"); 142$from = "=?ISO-2022-JP?B?" . base64_encode($from_name) . "?= <" . $from_email . ">"; 143 144if (!empty($filepath)) { 145// 添付ファイルのエンコード 146$filename = mb_convert_encoding($filename, "ISO-2022-JP", "UTF-8"); 147$filename = "=?ISO-2022-JP?B?" . base64_encode($filename) . "?="; 148} 149 150// ヘッダーの指定 151$head = ""; 152$head .= "From: {$from}\n"; 153$head .= "MIME-Version: 1.0\n"; 154if (empty($filepath)) { 155$head .= "Content-Type: text/plain; charset=ISO-2022-JP;" . 156"Content-Transfer-Encoding: 7bit\n"; 157}else { 158$head .= "Content-Type: multipart/mixed; boundary=\"{$boundary}\"\n"; 159} 160$head .= "Content-Transfer-Encoding: 7bit"; 161 162$body = ""; 163 164// 本文 165if (!empty($filepath)) { 166$body .= "--{$boundary}\n"; 167$body .= "Content-Type: text/plain; charset=ISO-2022-JP;" . 168"Content-Transfer-Encoding: 7bit\n"; 169$body .= "\n"; 170} 171$body .= "{$message}\n"; 172$body .= "\n"; 173 174if (!empty($filepath)) { 175// 添付ファイルの処理 176$body .= "--{$boundary}\n"; 177$body .= "Content-Type: {$mime_type}; name=\"{$filename}\"\n" . 178"Content-Transfer-Encoding: base64\n" . 179"Content-Disposition: attachment; filename=\"{$filename}\"\n"; 180$body .= "\n"; 181 182$fp = fopen( $filepath, "r" ) or die("Error on mailing. (attachment file cannot open)"); 183$contents = fread( $fp, filesize($filepath) ); 184fclose( $fp ); 185$f_encoded = chunk_split(base64_encode($contents)); //添付ファイルをbase64エンコードする 186$body .= "{$f_encoded}\n"; 187$body .= "\n"; 188} 189 190if (mail($to, $subject, $body, $head)) { 191echo "sendmail_jpn : OK."; 192} else { 193echo "sendmail_jpn : FAILURE."; 194} 195} 196 197// mb_encode_mimeheaderのバグ対策用 198function mb_encode_mimeheader_ex($text, $split_count = 34) { 199$position = 0; 200$encorded = ""; 201 202while ($position < mb_strlen($text, "ISO-2022-JP")) { 203if ($encorded != "") { 204$encorded .= "\r\n "; 205} 206$output_temp = mb_strimwidth($text, $position, $split_count, "", "ISO-2022-JP"); 207$position = $position + mb_strlen($output_temp, "ISO-2022-JP"); 208$encorded .= "=?ISO-2022-JP?B?" . base64_encode($output_temp) . "?="; 209} 210 211return $encorded; 212} 213?>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/12/02 16:04

ログの内容を解析しましたか?
nosonosolife

2017/12/02 16:13

ご回答いただいたところ申し訳ございません、「ログの内容」とは何のことでしょうか?
退会済みユーザー

退会済みユーザー

2017/12/02 16:20

PHPのエラーログです。
nosonosolife

2017/12/02 16:35

ajax通信でphpのエラーログの確認をする方法をご提示していただけませんでしょうか。
退会済みユーザー

退会済みユーザー

2017/12/02 16:39

サーバーの種類やPHPのインストール方法を提示してください。
nosonosolife

2017/12/02 16:44

サーバーは「xrea」、phpのバージョンは71です。
退会済みユーザー

退会済みユーザー

2017/12/02 16:45

それであればxreaの公式サポートページに書かれているはずです。
nosonosolife

2017/12/02 17:05

確認したところ、サーバーの種類は「Apache」でした。「PHPのインストール方法」については分かりませんでした。
guest

回答1

0

ベストアンサー

var form = $('#mailform form').get()[0]; var data = new FormData( form );

シリアライズじゃなくこっちでどうだい?

投稿2017/12/03 01:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nosonosolife

2017/12/03 09:03

ご提示していただいたコードをもとに書き換えたところ上手く動きました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問