プロが教えるわが家の防犯対策術!

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

A 回答 (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を使用するとどうなりますか?
    • good
    • 0
この回答へのお礼

たびかさなるご回答ありがとうございます。

>サブジェクトを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で表示されます。
これがタイトルが無題へとなっている原因なのでしょうか?

お礼日時:2007/02/18 17:31

通常のメール送信は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エンコードをしてみてください。
もしかしたら全体的に文字コードを統一しないと駄目かも知れません。

サブジェクトを英字のみにしたら届くでしょうか?
その場合は文字コードが原因かと思います。
    • good
    • 0
この回答へのお礼

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側に届くメールは英字も日本語もすべて無題となってしまいます。

お礼日時:2007/02/17 20:41

ソースを拝見しましたが、


$header に $subject も $title も入ってないのですが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2007/02/17 17:09

変数に値が入っていないとか。


ソースを見ないと問題発見は難しいです。
    • good
    • 0
この回答へのお礼

$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--";
}
以下メール送信といったソースコードです。

お礼日時:2007/02/17 13:25

文字コードの問題ではないですか?



何かのメーラーで件名が無題になってしまう現象があり、
mb_convert_encodingで適切な文字コードに変換したら
解決した記憶があります。

【参考】mb_convert_encoding
http://php.s3.to/man/function.mb-convert-encodin …

参考URL:http://php.s3.to/man/function.mb-convert-encodin …
    • good
    • 0
この回答へのお礼

タイトル部も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");
エンコード仕方が間違っているのでしょうか?

お礼日時:2007/02/17 15:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!