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

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

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

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

Q&A

解決済

3回答

2861閲覧

php5.4からphp7.0へバージョンアップしたら文字化けした

sake

総合スコア52

PHP

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

0グッド

0クリップ

投稿2018/03/25 06:52

編集2018/03/26 03:19

最近phpをバージョンアップしたら、受信メールのアカウントの名前と件名と本文の半角カタカナが文字化けするようになりました。
メール受信するときは、ReceiptMailDecoder.class.phpを使わせていただいています。
OSは、Centos7です。
インターネットの情報では「php.iniのdefault_charsetというパラメーターがデフォルト値が空から"UTF-8"に変更されているようです」とあったので、php.iniのdefault_charsetを「空」にしましたが、改善されませんでした。
どなたか情報をお持ちの方がおられましたら力を貸してください。
よろしくお願いします。

php

1require_once('/usr/local/bin/ReceiptMailDecoder.class.php'); 2 3//X-Original-Toを取得する 4$deliveredto = $decoder->getDeliveredTo( 'x-original-to' ); 5 6//$deliveredtoからアカウントを取得 7$deliveredaccount = strstr($deliveredto, "@", true); 8 9//Fromから「名前<アカウント@ドメイン>」を取り出す 10$fromtxt = $decoder->getDecodedHeader('from'); 11$fromtxt = mb_convert_encoding($fromtxt,"UTF-8",mb_detect_encoding($fromtxt, "ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp", 'true')); 12 13//件名を取得する 14$subject = $decoder->getDecodedHeader( 'subject' ); 15$subject = mb_convert_encoding($subject,"UTF-8",mb_detect_encoding($subject, "ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp", true)); 16 17//本文を取得する 18$body = mb_convert_encoding($decoder->body['text'],'UTF-8','auto'); 19$body = mb_convert_encoding($body,'UTF-8',mb_detect_encoding($body, 'ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp','auto')); 20 21$subto='<'.$deliveredaccount.'@xxxxxxx.com>'; 22 23mb_language("japanese"); 24mb_internal_encoding("UTF-8"); 25 26//メール送信 27$atesaki = $subto; 28$kenmei = $subject; 29$naiyou = $body; 30$from = $txtfrom; 31 32//送信します 33echo mb_send_mail($atesaki,$kenmei,$naiyou,'From:'.$from); 34

受信したメール
受信したメール

変換後のメール
![変換後のメール

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/26 01:01

どのような文字化けが発生しているか画像で示したりできますか?
sake

2018/03/26 03:22

質問に画像を追加したので、見ていただけますか? よろしくお願いいたします。
guest

回答3

0

ドキュメントを読みましょう

default_charset string PHP 5.6.0 以降は "UTF-8" がデフォルトになり、 htmlentities() や html_entity_decode() そして htmlspecialchars() で encoding パラメータを省略した場合は、このデフォルト値を利用します。 また、default_charset の値は、 iconv 関数で iconv.input_encoding、 iconv.output_encoding、 iconv.internal_encoding が未設定の場合や、 mbstring 関数で mbstring.http_input mbstring.http_output mbstring.internal_encoding が未設定の場合のデフォルトとしても用いられます。 すべてのバージョンの PHP は、PHP から送信する Content-Type ヘッダのデフォルト値としてこれを使います。 ただし、header() で上書きされている場合は別です。 default_charset に空文字列を指定することは、おすすめしません。

投稿2018/03/25 07:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/03/25 08:02

デフォルト値とは空にしたときの値である
guest

0

その文字化けは、UTF-8(BOMなし)の文字列が
西ヨーロッパ言語(iso-8859-1)として扱われているためですので、
From:やSubject:ヘッダーに記載する箇所に
「=?charset?encoding?encoded-text=?=」
みたいな形式で埋め込めば済む話のように見えます。

PHP: mb_encode_mimeheader - Manual
を使えば解決しそうです。

php

1<?php 2 3$text = 'テストメール'; 4 5echo mb_encode_mimeheader($text, 'iso-2022-jp') . PHP_EOL; 6echo mb_encode_mimeheader($text, 'UTF-8') . PHP_EOL;

エンコード結果

MIMEエンコード/デコードのテストに、
MIMEエンコード・デコード | WEBシステム開発のWELLHAT
を活用すると良いでしょう。
あるいは、簡単なテストコードはOnline PHP editor | Run code in 200+ PHP & HHVM versions でもよろしいかと。

投稿2018/03/26 03:28

編集2018/03/26 09:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sake

2018/03/26 08:40

メールの件名は「テストメール」として、 以下の様に修正しました。 //受信メールから件名を取得する $subject = $decoder->getDecodedHeader( 'subject' ); $subject = mb_convert_encoding($subject,"UTF-8",mb_detect_encoding($subject, "ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp", true)); $atesaki = mb_encode_mimeheader($subto, 'UTF-8'); $kenmei = mb_encode_mimeheader($subject, 'UTF-8'); $naiyou = $osirase.$honbun; $from = $txtfrom; //メール転送 echo mb_send_mail($atesaki,$kenmei,$naiyou,'From:'.$from); 結果は下記のようになりました。 件名: =?UTF-8?B?w6PCg8KGw6PCgsK5w6PCg8KIw6PCg8Khw6PCg8K8w6PCg8Kr?= 他に修正するところがありますか? よろしくお願いします。
退会済みユーザー

退会済みユーザー

2018/03/26 09:13

一見良さそうなエンコードですが、テストツールにかけると文字化けします。 mb_convert_encodingでの加工が余計だったりしませんか。
sake

2018/03/26 09:34

下記をコメントアウトして //$subject = mb_convert_encoding($subject,"UTF-8",mb_detect_encoding($subject, "ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp", true)); 再度試してみました。結果は、 件名: =?UTF-8?B?w6PCg8KGw6PCgsK5w6PCg8KIw6PCg8Khw6PCg8K8w6PCg8Kr?= 変化ありませんでした。???????
退会済みユーザー

退会済みユーザー

2018/03/26 09:44

申し訳ないけど、100%ズバリの回答までは期待しないでください、再現できる環境がないので。 mb_detect_encoding()はなぜ必要ですか、そこで本来のエンコーディングと違う結果を返して文字化けを誘発していたりしないでしょうか。 UTF-8の「テストメール」を変換すると「=?UTF-8?B?44OG44K544OI44Oh44O844Or?=」になるはずなのに、そうならない、ということは余計な変換や加工が加わっていると考えるのが筋だと思います。 送信されるメールの中に「=?UTF-8?B?44OG44K544OI44Oh44O844Or?=」のまま含まれないと、受信側でデコードできません。 変換元文字列のエンコードが処理する都度変わってしまうのですか? そんなことはないでしょう。
退会済みユーザー

退会済みユーザー

2018/03/26 10:04

ここまでいったら「ReceiptMailDecoder.class.php」がデータをこわしてんじゃないのと疑いたいよな・・・
guest

0

自己解決

自己解決しました。
m6uさんの

UTF-8の「テストメール」を変換すると「=?UTF-8?B?44OG44K544OI44Oh44O844Or?=」になるはず
なのに、そうならない、ということは余計な変換や加工が加わっていると考えるのが筋だと思います。

が参考になりました。

php

1ReceiptMailDecoder.class.php の 2function getDecodedHeader( $header_name ) { 3 return mb_decode_mimeheader($this->getRawHeader( $header_name )); 4} 56function getDecodedHeader( $header_name ) { 7 return $this->getRawHeader( $header_name ); 8} 9に変更して 10//件名を取得する 11$subject = $decoder->getDecodedHeader( 'subject' ) 12

この変更がどこに影響するかは、これからの検証になりますが、一先ず一件落着です。
回答を寄せていただいた皆さん、ありがとうございました。

投稿2018/03/26 19:03

sake

総合スコア52

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問