• ベストアンサー

mail()の文字化けについて

GOTTiの回答

  • GOTTi
  • ベストアンサー率25% (2/8)
回答No.5

すでに解決されているかもしれませんが・・・。 初めの方がおっしゃっているように、$body 変数の文字コードが統一されていない可能性があります。 $body の文字列を form 入力値から生成する際に、form 入力値などを適切に EUC に変換する必要があるのではないでしょうか?

rodem01
質問者

お礼

アドバイス有難うゴザイマス。 何分どしろうとなもので、文字コードが不統一だとか、nkfは自動識別だとか(よく考えれば何も入力に指定しないので当たり前なのですが)、formの文字コードは単純に<META>指定とは限らないだとか、全部意識せず突っ走ってきました、ここでいろいろ初めて知り、勉強になりました。 ホント有難うゴザイマス!

関連するQ&A

  • 文字化けしたときはnkf -mBにて日本語にしたい

    cat $HEADER |awk '/^Subject/'|nkf 上記コマンドにて日本語が表示される場合と =?ISO-2022-JP?という文字化けが起こる時があります。 なので、出来れば cat $HEADER |awk '/^Subject/'|nkf |if /=?ISO-2022-JP?/ ;then nkf -mB (笑) のようなコマンドで、文字化けが起きてる時だけnkf -mBコマンド を使うようなことはできないでしょうか 以下のようにcase文で試しましたがだめでした。 おそらくパターンにマッチする時の処理に 代入するということができないから失敗するのだと思います。 SUB=`cat $HEADER | awk '/^Subject/' case "$SUB" in =?ISO-2022-JP?*) $SUBJECT=`echo $SUB |nkf -mB` *) $SUBJECT=`echo $SUB |nkf` esac mail -s "$SUBJECT" アドレス

  • メール送信で文字化け

    メール送信で件名が文字化けしてしまいます。 カテゴリ内には同様の質問もあるようですが、 解決できないので、投稿しました。 以下のようなコードです。 $to= "aa@aa.aa"; $from= "bb@bb.bb"; $subject= "メール送信テスト"; $headers= "From:$from"; $subject = i18n_mime_header_encode(i18n_convert($subject, "JIS")); $name= $_POST["name"]; $sub= $_POST["sub"]; $body= $_POST["body"]; $message="$name \n $sub \n $body \n"; if(mail($to, $subject, $message,$headers)){ echo "送信完了"; }else{ echo "送信エラー"; } ちなみに、 $subject= base64_encode($subject); とかもやってみたけど駄目でした。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Gmailへのメール送信で文字化け

    PHPでフォームメールの作っているのですが、Gmailで送信したメールを受け取ると□□□□□というように文字化けが起こっていまいます。 アウトルック、ホットメールなどは大丈夫なのですが、グーグルのGmailだけ駄目なようです。なぜ文字化けするのでしょうか? mb_language("Ja"); $header = "From: reminder@aaa.com\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: text/plain;charset=ISO-2022-JP\r\n"; $header .= "Content-Transfer-Encoding: base64"; $to = "aaa@gmail.com"; $subject = "送信テスト"; $body = "本文テスト本文テスト"; $subject = base64_encode($subject); $subject = mb_convert_encoding($subject,"ISO-2022-JP"); $subject = "=?ISO-2022-JP?B?" . $subject . "=?="; $body = base64_encode($body); $body = mb_convert_encoding($body,"ISO-2022-JP"); $success = @mail($to,$subject,$body,$header); if($success) print "成功"; else print "失敗";

    • ベストアンサー
    • PHP
  • mail()でメール送信で、特定のメーラーの受信のみ件名が文字化け

    PHPでメール配信プログラムを作っております。 配信テストを行なったのですが、特定のメーラーで件名が文字化けしてしまう現象に見舞われしてしまい、対処法を探しております。 ■テストメーラー 1、OutlookExpress 2、EdMax 3、Thunderbird ■ソース(一部抜粋) mb_language('Japanese'); mb_internal_encoding("SJIS"); //1 $subject = mb_encode_mimeheader($subject); //2 $subject = mb_convert_encoding($subject,"JIS","SJIS"); $send_body = mb_convert_encoding($send_body,"JIS","SJIS"); $header = "From: $fronmail.\n"; $header .= "Return-path: $return\n"; $header .= "Reply-To: $fronmail.\n"; //3 $header .= "Subject: $subject\n"; $header .= "Message-ID: {$MessageID}\n"; $header .= "MIME-Version: 1.0\n"; $header .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; $header .= "Content-Transfer-Encoding: 7bit\n"; //4 $header .= "Content-Transfer-Encoding: base64\n"; $header .= "X-Mailer:PHP/".phpversion(); $chk_mail = mail($to_email,$subject,$send_body,$header); ■設定値 $body = $subject = "日本語テスト"; メールアドレスはプロバイダなどが発行しているもの ■現象 ソースのままだと1、2は件名は文字化けせず、3は文字化け(???{????? ※?はひし形に囲まれた?です)します。 それぞれコメントアウトを外したり切り替えたりするのですが、1、2も件名が文字化けになったりします。 3は基本的にどのコメントアウトを有効にしても文字化けのままです。 $subjectに関しては、mail関数のものが優先のようでして、試しに空にしてみたのですが、件名も空のままでした。 何故この形式を取っているかというと、半角カナを使いたいが為でして、mb_send_mailだと半角カナが使えなかったような気がしてmailを使っております。 あと、popenで直接コマンドを打つという手もありそうですが、sendmailではなくpostfixなのですがpostfixでコマンドをという手段を探した方が良いのでしょうか? 出来ればmailを使って文字化けもしない方向を希望なのですが、それが駄目なら他の手段など誘導していただければ幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPをつかったメール送信時の文字化け

    OS :FreeBSD4.8 PHP4.3.2 Apache2 を使用してるものです。 PHPでメール送信のフォームを作成して実際に送ってみるとサブジェクトがどうしても文字化けします。 $subject = i18n_mime_header_encode(i18n_convert($subject, "JIS")); mail($too, $subject, $memo, $ff.$from); 上記のように変換コード関数をいれると Fatal error: Call to undefined function: i18n_mime_header_encode() in /usr/home/mmiyagi/htdocs/send.php のようにエラーがでます。 php.ini設定不足でしょうか?

    • ベストアンサー
    • PHP
  • sendmailで本文が文字化けします

    sendmailを使ってメールを送信していますが、下記処理中で、charsetの指定を入れないと本文は文字化けしないのですが、指定を入れると文字化けしてしまいます。 ※ちなみに、OutlookExpressはどの場合でも文字化けしないで受信できました。 どなたかご存知のかた教えていただけないでしょうか。 ソースは以下のような感じです。 require "/XXX/jcode.pl";# 文字列変換 require "/XXX/mimew.pl";# MIME エンコード # メールHEADER作成 $head = "From: $FromUser\n"; $head .= "To: $ToUser\n"; $head .= "Subject: $Subject\n"; $head .= "Mime-Version: 1.0\n"; $head .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; $head .= "Content-Transfer-Encoding: 7bit\n"; $head .= "\n"; # JISコード変換 $code = &jcode'convert(*head, 'jis'); # エンコード $header = &mimeencode($head); # メール本文作成 $body = "メール送信のテストです\n"; $code = &jcode'convert(*body, 'jis'); if (open(MAIL,"|/usr/lib/sendmail -f $FromUser $ToUser")){ print MAIL $header; print MAIL $body; print MAIL "\n\n"; close(MAIL); }

  • メールフォームの件名が文字化けします

    PHPでメールフォームを作っていて、以前のサーバーではエラーも無く動いていたのですが、新しいサーバーでは件名がどうしても文字化けしてしまいます。(※本文も化けていましたが解決しました) 色々調べて色々試してみたのですが上手く動作せず・・・ 以下にPHPの必要と思われる部分を書いておきますので、ご解答の程よろしくお願いいたします。 ちなみにPHPのバージョンは4.4.2です。 <?php header("Content-Type:text/html;charset=Shift_JIS"); ?> <?php $mailto = "aaa@bbb.ccc" $subject = "フォームからのメール"; ~各種設定・エラーチェック等省略~ $body=mb_convert_encoding($body,"Shift_JIS","ASCII.JIS,UTF-8,EUC-JP,SJIS"); $subject=mb_encode_mimeheader($subject,"ISO-2022-JP"); if($from_add == 1) { $from = $_POST['E-mail1']; $header="From: $from\nReply-To: ".$_POST['E-mail1']."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); } else { $header="Reply-To: ".$_POST['E-mail1']."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); } if($mailcheck == 0 || $sendchk == 1) { mb_send_mail($mailto,$subject,$body,$header); if($remail == 1) { mb_send_mail($reto,$resubject,$rebody,$reheader); } } else { htmlHeader(); ?> ~送信確認画面レイアウト・その他処理省略~ <?php } ?>

    • ベストアンサー
    • PHP
  • phpで送ったメールのヘッダーが本文にはみ出す

    表題のことでこまっております。 phpでメールフォームを作ったのですが、送ったメールをOutlookExpress(OE)で受信したときに、ヘッダーの一部が本文に表示されてしまいます。 OEで受信メールのプロパティを開くと下記のようになっております。 Return-Path: <xxx@xxx> Delivered-To: xxxxx_xxxxx@xxxx.xxx Received: (qmail 16291 invoked by uid 48); 1 Feb 2007 16:26:13 +0900 Date: 1 Feb 2007 16:26:13 +0900 Message-ID: <20070201072613.16290.qmail@xxxx.xxx> To: yyyyy@yyyy.yyy Subject: =?iso-2022-jp?B? From: zzz@zzzz.zzz X-Mailer: ContactForm MIME-Version: 1.0 Content-Type: text/plain;charset=ISO-2022-JP Content-Transfer-Encoding: base64 本文にはみ出るのは最後の3行(MIME~base64)です。 原因は空行が入っているためだと思いますが、OEのメールソースでは空行はありません。 プログラムのソースは $header ="From: $from\r\n"; $header ="CC: $cc\r\n"; $header .= "X-Mailer: $mailer\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: text/plain;charset=ISO-2022-JP\r\n"; $replyheader .= "Content-Transfer-Encoding: base64\r\n"; $Subject='=?iso-2022-jp?B?'.base64_encode(mb_convert_encoding($Subject,'JIS','SJIS')).'?='; @mail($from,$Subject,$Message,$header); hotmailなどのwebメーラーで見たときにははみ出していません。 これはなぜでしょうか?宜しくお願いします。

    • ベストアンサー
    • PHP
  • cgiメールの文字変換がうまくできない

    CGIメールです。 元々shiftjisなので、これをiso-2022-jpに変換させようとしてます。 $charset = "iso-2022-jp"; open(MAIL,"| $sendmail -t") || &error("失敗"); print MAIL "To: <$to>\n"; print MAIL "From: <$from>\n"; &jis("タイトル"); &base64("$msg"); print MAIL "Subject: $str\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=$charset\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; foreach ( split(/\n/, $body) ) { &jis("$_"); print MAIL $_, "\n"; } close(MAIL); sub jis{ $msg = $_[0]; Encode::from_to($msg, "shiftjis", $charset); ####1#### } sub base64 { use MIME::Base64; $str = $_[0]; if($str =~ /[^!-~\s]/){ $str = encode_base64($str, ""); if($charset eq "utf8"){ $str = '=?utf-8?B?' . $str . '?='; }else{ $str = '=?iso-2022-jp?B?' . $str . '?='; } } } このようにしてみたのですが、タイトル部分はきちんと表示されるのですが、ボディー部分が文字化けしてしまいます。(メーラーで手動にてshit-jisにエンコードしたらボディー部分が読めタイトル部分は文字化けする) Encode::from_to($msg, "shiftjis", $charset); の$charsetを"$charset"にしても同じ現象です また、元々参考にしたものでは####1####に retern $msg; があったのですが、これを入れるとsyntax errorになったので、これをコメントアウトしたらエラーにはならず送信そのものはできました ただ目的の文字変換ができないのですが、どこをどう改善すればいいでしょうか。 どうかご存じの方ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • PHPメールフォームでの文字化けに苦しんでいます。

    レンタルサーバー(ファーストサーバ)でPHPのメールフォームを作っています。 PHPフォームから出力される送信確認画面と、送られるメールで特定の文字が (例えば「契」が「啓」に)化けてしまいます。 色々調べて出来る対策はしたのですが一向に分かりません。 どうやれば文字化けが直るか具体的に教えてください。 文字化け対策用に.htaccessをディレクトリに入れています。 .htaccessの中身 php_flag mbstring.encoding_translation off php_value default_charset "Shift_JIS" PHPフォームのメイン処理部分です。 <?php header("Content-Type: text/html;charset=Shift_JIS"); ~~~省略~~~ $body=mb_convert_encoding($body,"Shift_JIS","ASCII.JIS,UTF-8,EUC-JP,SJIS"); $subject="=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($resubject,"Shift_JIS","ASCII.JIS,UTF-8,EUC-JP,SJIS"))."?="; if($from_add == 1) { $from = $_POST['E-mail']; $header="From: $from\nReply-To: ".$_POST['E-mail']."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); } else { $header="Reply-To: ".$_POST['E-mail']."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); } mail($mailto,$subject,$body,$header); else { htmlHeader(); ?> <!-- 送信確認 --> 間違いがなければ送信ボタンを押してください。<br><br> <form action="form.php" method="POST"> <? echo $err_message; ?> <table width="500" bgcolor="#cccccc" cellspacing="1" cellpadding="3"> <?php foreach($_POST as $key=>$var) { if(get_magic_quotes_gpc()) $var = stripslashes($var); $var = htmlspecialchars($var); print("<tr bgcolor=#ffffff><td bgcolor=#eeeeee width="."125"." ><small><div style = line-height:0.5>".$key."</small></td><td><small>".$var); ?> <input type="hidden" name="<?= $key ?>" value="<?= $var ?>"> <?php print("</div></small></td></tr>\n");}?> ~~~後処理省略~~~ よろしくお願いします。

    • 締切済み
    • PHP