• ベストアンサー

送信したメールのタイトルが無題に・・・

現在、PHPによるファイル添付プログラムを作成している者です。 添付メールを試験的にgmailに送信するようにしているのですが、 メールを確認してみると入力したはずのタイトルが 無題となってしまいます。 まったくの無題となってしまうので問題となる点がどこなのか よく分かりません。 この場合には、問題が考えられるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.5

文字コードを統一してみてください。 また、 サブジェクトをbase64エンコードしてからJISにして、それをなかったことにしてmimeエンコードをかけている意味のないことをしているので、修正してください。 > $subject = base64_encode($subject); > $subject=mb_convert_encoding($subject,"ISO-2022-JP","Shift_JIS"); > $subject = mb_encode_mimeheader($title); エンコードせずに送るとどうなりますか? また、添付ファイル付きと添付ファイルなしだと違いますか? mb_send_mailを使用するとどうなりますか?

sody
質問者

お礼

たびかさなるご回答ありがとうございます。 >サブジェクトをbase64エンコードしてからJISにして、それをなかったことにしてmimeエンコードをかけている意味のないことをしているので、修正してください。 の点は   $subject = $title;  $subject=mb_convert_encoding($subject,"ISO-2022-JP","SHIFT-JIS");  $subject = base64_encode($subject); のように修正しました。 このプログラムはhtml上で入力された値を一旦PHPにPOSTを使って 受け渡し、PHPで確認ページを生成し、正しければメール送信というものなのですが、 htmlもphpも <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=SHIFT-JIS"> でSHIFT-JISになるよう統一しているはずなのですが html部ではSHIFT-JISで入力されていることになっているのに 確認ページはなぜかEUC-JPで表示されます。 これがタイトルが無題へとなっている原因なのでしょうか?

その他の回答 (4)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.4

通常のメール送信はJISで送信しないと、メーラーによっては文字化けします。 で、回答ですが、 サブジェクトをbase64エンコードしてからJISにして、それをなかったことにしてmimeエンコードをかけているのがよく分かりませんが・・・ $subject = base64_encode($subject); $subject= mb_convert_encoding($subject,"ISO-2022-JP","Shift_JIS"); $subject = mb_encode_mimeheader($title); jisにしてからbase64エンコードをしてみてください。 もしかしたら全体的に文字コードを統一しないと駄目かも知れません。 サブジェクトを英字のみにしたら届くでしょうか? その場合は文字コードが原因かと思います。

sody
質問者

お礼

mb_language("Japanese"); mb_internal_encoding("Shift_JIS"); $to = "";  //gmailアドレスにしております $boundary = md5(uniqid(rand())); $php_v = PHP_VERSION; $PHP_SELF = $_SERVER["PHP_SELF"]; $title = $_POST['title']; $action = $_POST['action']; $email = $_POST['email']; $comment = $_POST['comment']; $upfile = $_FILES['upfile']['tmp_name']; $upfile_name = $_FILES['upfile']['name']; $upfile_type = $_FILES['upfile']['type']; if($action == "post"){ if($email){ $title = htmlspecialchars($title); $email = htmlspecialchars($email); $comment = htmlspecialchars($comment); $comment = nl2br($comment); $comment = str_replace("\r", "", $comment); $comment = str_replace("\n", "", $comment); if($action == "send"){ $msg = ""; $from =$email; $subject = $title; $subject = base64_encode($subject); $subject=mb_convert_encoding($subject,"ISO-2022-JP","Shift_JIS"); $subject = mb_encode_mimeheader($title); $header = "From: $from\n"; $header .= "Reply-To: $from\n"; $header .= "X-Mailer: PHP/".phpversion()."\n"; $header .= "MIME-version: 1.0\n"; if(file_exists($upfile)){ $header .= "Content-Type: multipart/mixed;\n"; $header .= "\tboundary=\"$boundary\"\n"; $msg .= "This is a multi-part message in MIME format.\n\n"; $msg .= "--$boundary\n"; $msg .= "Content-Type: text/plain; charset=Shift_JIS\n"; $msg .= "Content-Transfer-Encoding: 7bit\n\n"; }else{ $header .= "Content-Type: text/plain; charset=Shift_JIS\n"; $header .= "Content-Transfer-Encoding: 7bit\n"; } 文字数の都合によりファイル添付部とメール送信部は削っております。 以上のようにコードを変更いたしましたが 本文とファイル添付はうまくいっているのですが gmail側に届くメールは英字も日本語もすべて無題となってしまいます。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

ソースを拝見しましたが、 $header に $subject も $title も入ってないのですが。

sody
質問者

お礼

ご回答ありがとうございます。 メール送信は分からないことが多いので追加質問させていただきます。 文字数の関係で省略しておりますメール送信の部分に mail関数を仕様しており mail関数の場合 mail("$to","$subject","$msg","$header"); で良いはずなので タイトル部に$subjectにしているのですが、 それだけではだめなのでしょうか? $header部に$subjectの内容ももたせなければならないのでしょうか?

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

変数に値が入っていないとか。 ソースを見ないと問題発見は難しいです。

sody
質問者

お礼

$PHP_SELF = $_SERVER["PHP_SELF"]; $title = $_POST['title']; $action = $_POST['action']; $email = $_POST['email']; $comment = $_POST['comment']; $upfile = $_FILES['upfile']['tmp_name']; $upfile_name = $_FILES['upfile']['name']; $upfile_type = $_FILES['upfile']['type']; if($action == "send"){ $msg = ""; $from =$email; $subject = $title; $subject = base64_encode($subject); $subject= mb_convert_encoding($subject,"ISO-2022-JP","Shift_JIS"); $header = "From: $from\n"; $header .= "Reply-To: $from\n"; $header .= "X-Mailer: PHP/".phpversion()."\n"; $header .= "MIME-version: 1.0\n"; $subject = mb_encode_mimeheader($title); if(file_exists($upfile)){ $header .= "Content-Type: multipart/mixed;\n"; $header .= "\tboundary=\"$boundary\"\n"; $msg .= "This is a multi-part message in MIME format.\n\n"; $msg .= "--$boundary\n"; $msg .= "Content-Type: text/plain; charset=EUC-JP\n"; $msg .= "Content-Transfer-Encoding: 7bit\n\n"; }else{ $header .= "Content-Type: text/plain; charset=EUC-JP\n"; $header .= "Content-Transfer-Encoding: 7bit\n"; } if($comment){ $comment = str_replace("<br />", "\n", $comment); $msg .= "$comment\n"; } if(file_exists($upfile)){ $fp = fopen($upfile, "r") or die("error"); //ファイルの読み込み $contents = fread($fp, filesize($upfile)); fclose($fp); $f_encoded = chunk_split(base64_encode($contents)); $msg .= "\n\n--$boundary\n"; $msg .= "Content-Type: " . $upfile_type . ";\n"; $msg .= "\tname=\"$upfile_name\"\n"; $msg .= "Content-Transfer-Encoding: base64\n"; $msg .= "Content-Disposition: attachment;\n"; $msg .= "\tfilename=\"$upfile_name\"\n\n"; $msg .= "$f_encoded\n"; $msg .= "--$boundary--"; } 以下メール送信といったソースコードです。

  • edge8040
  • ベストアンサー率46% (7/15)
回答No.1

文字コードの問題ではないですか? 何かのメーラーで件名が無題になってしまう現象があり、 mb_convert_encodingで適切な文字コードに変換したら 解決した記憶があります。 【参考】mb_convert_encoding http://php.s3.to/man/function.mb-convert-encoding.html

参考URL:
http://php.s3.to/man/function.mb-convert-encoding.html
sody
質問者

お礼

タイトル部もEUC-JPにエンコードしてみましたが やはり無題のままになってしまいます。 mb_language("Japanese"); mb_internal_encoding("EUC-JP"); $title = $_POST['title']; $title = htmlspecialchars($title); $subject = $title; $subject = base64_encode($subject); $subject = mb_convert_encoding($subject,"ISO-2022-JP","EUC-JP"); エンコード仕方が間違っているのでしょうか?