ホーム > フォーラム > 質問箱 > メール送信時のSubject文字化け

メール送信時のSubject文字化け
投稿者: typista | 投稿日時: 2005/10/28 19:50 | 閲覧: 80302回
typista
お世話なります。
XOOPSのメール送信で、Subjectが文字化けします。
どなたか対処法をご存知の方、ご教授ください。

  設定文字列:[XOOPS]承認が完了しました
  文字化け :[XOOPS]承認が完了しま$ 靴?

コードは、次のように記述し、EUC保存しており、本文(body)は文字化けしません。
---
$xoopsMailer =& getMailer();
$subject = ”[XOOPS]承認が完了しました”;
$xoopsMailer->setSubject( $subject );
$xoopsMailer->send();
---
※以下の文字コード変換もNG(化け方は違います)でした。
 上記の文字化けはmb_convertしてない例です。

$subject = mb_convert_encoding( $subject, "SJIS", "EUC-JP" );
$subject = mb_convert_encoding( $subject, "EUC-JP", "SJIS" );

---
XOOPS 2.0.9.2
PHP Version 4.4.0
です。

コメント(57)

新しいものから | 古いものから | ネスト表示 | RSS feed
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 16:24
domifara
引用:
selaさんは書きました:
3.ブログに投稿後にメーリスに配信されるのですが、こちらのほうはほぼ文字化けせずに来ました!今までは件名と本文の一部が文字化けしていたのですが、今回は件名は最初のマルチバイト35字ぐらいは問題なく最後の1文字だけ文字化けしています。本文は今のところ一箇所だけ文字化けしている程度です。まだ長い文章ではためしていませんが。。

以上、ご報告まで。

んー、わかりません
ただ、推測ですが EncodeHeaderの中で
$str = mb_convert_encoding($str, $encode_charset, mb_detect_encoding($str));
コード変換しているのは、必要なのかな、誤認識した場合重複して
コード変換されてしまうような気がします。

訂正したもの
お試しいただけるなら
上記コード変換取り除いたものテスト用

xoopsmailerlocal_php_test1.tgz
xoopsmailerlocal_php_test3.tgz


mb_struct関数無いと動かないのでは海外のサーバーで動かないので
mb_structを使わないでできるかも?
とEUC-JP以外コードでも使えるかもテスト用

xoopsmailerlocal_php_test2.tgz
xoopsmailerlocal_php_test4.tgz


xoopsmailerlocal_php_test5.tgz
どちらでも結果は同じでしょうか?
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 16:44
domifara
引用:
selaさんは書きました:
1.ユーザ宛メール送信ではメール送信ができましたが、送信ボタンを押した後に出るメッセージに引用:
xoopsmailerlocal.php100666 000000 000000 16306 10333770636 12621 ustar00rootwebmasterさん宛にメールを送信しました

なんていうのが出てしまいます。

これは、私の正規表現の記述が間違っていたからかな?
test1のは訂正済み

引用:
selaさんは書きました:
2.メールからブログへの投稿は問題なくいき、その後サイトから帰ってくる「投稿を受け付けました」の返信メールで件名が件名が文字化けしなくなったのですが、マルチバイト18文字で途切れてしまいます。また、本文の方にメールヘッダーのようなものが入るようになりました。(そこには、以前タイトル部に表示されていた文字化けしたタイトルも一番上にあります)

3.ブログに投稿後にメーリスに配信されるのですが、こちらのほうはほぼ文字化けせずに来ました!今までは件名と本文の一部が文字化けしていたのですが、今回は件名は最初のマルチバイト35字ぐらいは問題なく最後の1文字だけ文字化けしています。本文は今のところ一箇所だけ文字化けしている程度です。まだ長い文章ではためしていませんが。。

35は何バイトかな 70バイトかなということは
んー、両方ともタイトル文字の分割失敗かな?
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 17:14
domifara
たびだび
すいません

なんとなく、わかりました。たぶん

nobunobuさんに聞いてみないと、
わからないので
間違っているのかもしれませんが


            $cut_length = floor((76-strlen('Subject: =?'.$encode_charset.'?B?'.'?='))/4)*3;


ところは、計算式間違いで



            $cut_length = floor( (76-strlen('Subject: =?'.$encode_charset.'?B?'.'?=') )/4 * 3);

とかではないでしょうか?

たぶん
76バイトごとに分割しないといけないけど
制御用の文字も計算にいれないといけないので
その分を引いておいて
安全?のため 3/4 にして、
計算結果、整数(切り捨て)を
文字の分割の文字スにしたいのではないかと思うです。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/8 17:41
nobunobu
domifaraさんフォローありがとうございます。
小生も、今日内職で少々デバッグしておりましたが、一つは、mb_strcutでJISの場合切断位置によって
シフト文字が自動挿入されるので、これを検知して補正する仕組みが必要な事が判りました。
domifaraさんの、PHP Mailer 1.72対応部分やmb_string無しの場合の対応も参考にさせて頂き、今晩帰宅後に対応したいと思います。
とりあえず、シフト文字位置補正版は、
[暫定修正版入手先]
xoopsmailerlocal.php
より入手できるようになっております。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 17:55
domifara
引用:
nobunobuさんは書きました:
domifaraさんフォローありがとうございます。
小生も、今日内職で少々デバッグしておりましたが、一つは、mb_strcutでJISの場合切断位置によって
シフト文字が自動挿入されるので、これを検知して補正する仕組みが必要な事が判りました。
domifaraさんの、PHP Mailer 1.72対応部分やmb_string無しの場合の対応も参考にさせて頂き、今晩帰宅後に対応したいと思います。

シフト文字ですか? 難しいですね
UTF-8だと結構いい線までいけてます

それと、3/4 にしているところ

Base64でエンコード後をあらかじめ算出するためだとしたら
2/3 ではないでしょうか?
マニュアルによる
引用:

Base64でエンコードされたデータは、エンコード前のデータにくらべて 33%余計に容量が必要です。

となってます
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/8 17:56
nobunobu

$cut_length = floor((76-strlen('Subject: =?'.$encode_charset.'?B?'.'?='))/4)*3;

の意味は、
MIMEHeaderで使用する、Base64変換する部分に関しては、3Byteのバイト列が4Byteに変換されます。
3Byteといっても1〜3バイトの文字列はすべて4Btyteに変換されます。
そこで、まず76文字からBase64変換後の文字列に許される最大文字数、

$cut_length = 76-strlen('Subject: =?'.$encode_charset.'?B?'.'?=')

を求め、そのBase64変換される前の文字列の最大長

floor(最大Base64変換後文字列 / 4) * 3

を求めています。
ので、おそらく間違ってはいないと思います。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/8 17:59
nobunobu
引用:

33%余計に33%余計に容量が必要です。

というのは
元々3byteが4byteになるので、4/3は1.333で33%余分にって事だと思いますよ!
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 18:29
domifara
引用:
nobunobuさんは書きました:
引用:

33%余計に容量が必要です。

というのは
元々3byteが4byteになるので、4/3は1.333で33%余分にって事だと思いますよ!

そうでした。理解しました。

引用:

floor(最大Base64変換後文字列 / 4) * 3
引用:

だと 3/4 計算

最大Base64変換後文字列

(変換前の3/4 ) * (変換後4/3に増える) = 1

ですね。

(変換前に33%引いてしまうと 2/3 ) * (変換後4/3に増える) だと 1 にならないです。
了解です
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/8 21:25
nobunobu
domifaraさんのソース拝見しました。
今回の修正版提供の目的が、基本的には、
「PHP4.4.xにおけるmb_encode_mimeheader()のバグに対応する」
ということなので、
個人的には以下の方針で考えています。(コアチームの正式見解ではありません)

・今回は、mb_encode_mimeheader()の置き換えなのでPHPにてmb_stringエクステンションが
 導入されていることを前提とする。


domifaraさんの、mb_strcut()代替の、getJ_cleanLostByteTail()を拝見しましたが、
メールで使用する肝心の'ISO-2022-JP'におけるシフト文字制御がなされていないため、
正しい分割は出来ないという事になります。

----余談になりますが----
たとえば「あいうabcえお」という文字列は、'ISO-2022-JP'では実際には、
「↑あいう↓abc↑えお↓」となっています。

(↓↑はシフト文字を記号化したもので実際にはそれぞれ3バイト)
この文字列を10バイトずつに区切るとなると、

「↑あい↓」 (3+2+2+3 => 10)
「↑う↓ab」 (3+2+3+1+1 => 10)
「c↑え↓」 (1+3+2+3 => 9)
「↑お↓」 (3+2+3 => 8)

という形で区切る必要があるからです。
これをシフト文字の補完を行わずに、

「↑あいう」 (3+2+2+2 => 9)
「↓abc↑」 (3+1+1+1+3 => 9)
「えお↓」 (2+2+3 => 7)

などというように区切ったものをBase64変換してしまうと、メールソフト側でうまく復元できないようです。
(メールソフトによっては復元してくれますが・・)
---余談ここまで----

さらに、本 xoopsmailerlocal.php の位置づけを考えた上で、
(これもコアチームの正式見解ではありませんが、少なくとも2.0.12にて小生が当ソースを修正した前提では)

・PHP Mailer1.72対応は、別途互換性の検証を終了後に、PHP Mailerの置き換えを行うときに対応する。
 (各3rd Party Libraryのバージョンアップはコアチームの健闘テーマになっています)

・現行、languageディレクトリ下で言語別のインプリメンテーションを置く前提にしているので、
 日本語以外への対応ロジックは当ソースには含めない。


・日本語におけるメールは、'ISO-2022-JP'によるエンコーディングを事実上の標準と
 とらえて、'UTF-8','SJIS'によるエンコーディングは含めない。


・XOOPSのUTF-8対応については、将来的に検討することを前提として、拡張性は維持する。

ということで、domifaraさんが拡張されている部分については、UTF-8対応への
方針策定も含めて今後のリリースの中で徐々に取り込ませて頂きたいと考えています。

なお、PopnupBlogなどですでに、エンコーディング済みのものの2重エンコード抑止に関しては、
現在更新してあるソースでは、大丈夫だと思います。
できましたら、selaさんにも再び当方のソースにて検証頂ければ幸いです。
(但し、これについてはPHP4.4.xではmb_encode_mimeheader()のバグを避けるために、
 mb_encode_mimeheader()を使用している部位については、コメントアウトなどが必要ですが)
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/9 1:13
sela
なんだか、私には理解できない難しい話になってきましたが、nobunobuさんの新しいファイルを試してみました。

ユーザ宛メール送信はまったく問題ないです。
また、もちろんですがブログへのメール送信は問題ありません。

ただ、ブログからの返信メールが以前と同じように、件名が(35文字ぐらいで)途中で切れてしまうのと本文に以下のようなものが入ってしまいます。

=?ISO-2022-JP?B?GyRCJW0lMDRJTX0/TSRSJEgkaiQ0JEgkWEVqOUYkNyReJDckPxsoQg==?=
Received: from phpmailer ([***.***.***.***]) 
by www.*****.com with HTTP (phpmailer);
Wed, 9 Nov 2005 01:04:38 +0900
Date: Wed, 9 Nov 2005 01:04:38 +0900
From: =?ISO-2022-JP?B?GyRCRURDZkMkTTo4JjVmMnElKiVVJSMlNyVjJWslNSUkGyhC?= =?ISO-2022-JP?B?GyRCJUgbKEI=?= <*****@*****.com>
Message-ID: <2b3182f7a9af9f08477b1c24f0a7b74d@www.*****.com>
X-Priority: 3
X-Mailer: phpmailer [version 1.65]
X-Mailer: PHP/4.4.2-dev
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="iso-2022-jp"


さらに、メーリスへの配信がこなくなってしまいました。
なぜでしょうか?
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: dendeke | 投稿日時: 2005/11/9 2:18
dendeke
みなさん、こんにちわ。

既にdomifaraさんやnobunobuさんがいろいろと作業していただいておりますので、これが既知 AND/OR 的外れでしたらスルーしてください。

こちら」に今回の文字化けに関する参考記述がありましたので、一応ご報告いたします。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/9 8:05
nobunobu
dendekeさん情報ありがとうございます。
今回の修正作業は、ご紹介頂いたPHP4.4.0、PHP4.4.1における、
「mb_encode_mimeheader() が正常に動作しない問題」
を回避するための対応を行っています。
4.4.2で修正予定となっていますが、XREA.COMで使用されているの4.4.2-DEVでもまだ修正されておらず、
今までもmbstring関連に対するPHPの修正対応からすると少し時間がかかるであろうとの
勝手な推測から、逃げ道を探っているという、いわばあまり前向きでない対応となっています。
(PHPのバグ回避をアプリ側で行おうという試みですから・・・)

できるだけカバレッジを広げようという小生の試みが、ぬかるみに足を踏み入れた状態となっております。

さらにPopnupBlogモジュールの様に従来XOOPSのメール送信で文字化けが当たり前であったために、
独自でエンコーディングされているケースもあり、万全の対応ではないです。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/9 8:11
nobunobu
引用:

ただ、ブログからの返信メールが以前と同じように、件名が(35文字ぐらいで)途中で切れてしまうのと本文に以下のようなものが入ってしまいます。

さらに、メーリスへの配信がこなくなってしまいました。
なぜでしょうか?


う〜ん、うまくいきませんか・・・
サンプルでは、本来折り返しされたヘッダの先頭には空白文字が入るはずのところが、
空白がなくなってしまっていますね・・・
PopnupBlogでは、mb_encode_mimeheader()が3箇所で使用されているようですが、
すべてコメントアウトして頂けたでしょうか?
当方もPopnupBlog環境を作ってテストしてみます。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/9 9:10
sela
何度もお手数をおかけしてすみません。

mb_encode_mimeheader()が3箇所あることに気づかず、
PopnupBlogUtils.phpの1018・1019行目だけしかコメントアウトしていませんでした。
他のところが見つからないのですが、
どちらにあるのかご教示願えるとうれしいです。

Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/9 9:24
domifara
引用:
selaさんは書きました:
mb_encode_mimeheader()が3箇所あることに気づかず、
PopnupBlogUtils.phpの1018・1019行目だけしかコメントアウトしていませんでした。
他のところが見つからないのですが、
どちらにあるのかご教示願えるとうれしいです。

今popnupblog222.zipをダウンロードして検索かけてみました。
このバージョンだと
popnupblog/pop.php line 550,551
popnupblog/popnupblog.php line 643,644
popnupblog/PopnupBlogUtils.php line 1053,54
の3ヶ所です

引用:
nobunobuさんは書きました:
個人的には以下の方針で考えています。(コアチームの正式見解ではありません)

・今回は、mb_encode_mimeheader()の置き換えなのでPHPにてmb_stringエクステンションが
 導入されていることを前提とする。


説明ありがとうございます。
JISのシフトコードは面倒でキチンと私では作れそうも無かったので手出ししないで、他力本願で様子見ます(ゴニョゴニョしてみます)。
いろんなコード対応風に改造しているのは
理由は別件で(必要にせまられて)相手先(ユーザー)ごとに
メールのコードを変える改造に対応するためで
テストをかねてSJIS送信できるように?それ風にしてたりしてますが、
これは日本のソフトはなぜだか規格はともかく日本のソフトはSJISだけにはどこも対応してたりして・・どうしても(携帯に)・・って時に(趣味の領域でしかないけど)。

selaさんの問題がこのスレッドで解決すれば、
nobunobuさんの修正によって
日本ユーザーの当面のPHPの不具合の問題は解決すると思います

-------------------------------------------------
私の、蛇足、参考情報

EUC-JP環境で'ISO-2022-JP'に送信するようにメールの送信で
コンバーターを必要するのは,
(たぶん)日本だけの問題なので
xoopsmailerlocal.php
のようなもので各国の対応せざる得ないとは思います

ただ、
マルチバイト系のメールを使用するのは日本だけではないのですが
mb_stringエクステンションが使えるのは、
日本だけなので
メールヘッダーに関する今回のnobunobuさんの変更は参考になると思います。

中国語、韓国語等のxoopsは、自国語キャラクターの
エンコード指定をしているだけだと思いますから
長いタイトルは文字化けしているはずです。(知ってるわけではないけど)
マルチバイト系でなければ問題もなくphpmailerで使えるので
マルチバイト系のユーザーがなんとかするしかないところ。

私は、個人サイトをUTF-8で運用しているため、UTF-8の送信について。
メールもUTF-8で送信していますが、UTF-8送信について
現時点で、送信側が正しくても、
メールでのUTF-8での送信は、残念ながら受け側の問題で
まだまだ文字化けしますから、
日本のxoopsで採用するのは時期が早いと思います
(今だと、できるようにしても、混乱するだけ)

情報:
 現時点で確実に(UTF-8で文字化けする)とわかっているクライアント側は
携帯電話宛て(これはどうしようもないISO-2022-JPかSJIS)
hotmail.comとyahoo.co.jpのウェブメールツール
(ウェブメールはなんでかな?なんとかしてほしい、
しかたがないので特定の相手を指定してコード変換して送信している)。

また、
UTF-8で受けれるメーラーでも、他国後(パソコンにない)文字はもし化けするのは当然として、
パソコン内に対応の持っていて本文は文字化けしなくても、
メールのタイトルだけはフォントが固定?(不完全)のためだったりしてタイトルだけ文字化けするので、今回の件と混乱するのがoutlook系のメーラー。

----------------------------------------------------
このスレッドは引き続き selaさんのスレッドなので、私はここまで。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/9 13:59
sela
domifaraさん、親切にありがとうございます。
早速修正して試してみましたが、
popnupblog.phpのものをコメントアウトしてしまうと、ブログページ自体が真っ白になってしまうのと、メールからの投稿が出来なくなってしまっているのでこれはコメントアウトしないほうがいいと判断しました。

その結果、メール投稿はいつもどおり問題なくいきました。
メール返信では以前より件名部分の表示文字数がマルチ3文字ぐらい減りました。
本文には相変わらず、メールヘッダーのようなものが残ります。
メーリス配信にいたっては、全く機能していない模様です。

以上、ご報告まで。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/9 15:51
nobunobu
引用:

popnupblog.phpのものをコメントアウトしてしまうと、ブログページ自体が真っ白になってしまう

どうやらコメントアウトの仕方がまずいのでは無いかと思います。
メーリス配信ができないのも、同様の原因かもしれません。

pop.php、popnupblog.php、PopnupBlogUtils.php それぞれのソース中に、

        if (function_exists('mb_encode_mimeheader')){
            $subject = mb_encode_mimeheader($subject, $mailcode, "B");
        }

という3行を発見されたら、
これを、

        if (function_exists('mb_encode_mimeheader')){
//            $subject = mb_encode_mimeheader($subject, $mailcode, "B");
        }

か、

//      if (function_exists('mb_encode_mimeheader')){
//            $subject = mb_encode_mimeheader($subject, $mailcode, "B");
//      }

の様にコメントアウトする必要があります。
もしかしてこれを、

//      if (function_exists('mb_encode_mimeheader')){
//            $subject = mb_encode_mimeheader($subject, $mailcode, "B");
        }

のように、mb_encode_mimeheader が含まれている2行に対して行われていないでしょうか?
これだと、if文の{ の対応関係が崩れるために、エラーになって真っ白になりますが・・・・
確認の方をお願い致します。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/9 16:28
sela
すみません、そのとおりでした。
大変幼稚なミスを犯してしまいご迷惑をおかけしております。

真っ白になる問題は解決しました。
しかし、メーリスにはいっこうに配信されてくれません。

またメールヘッダーも本文に表示されます。
こちらは表示されないように出来ないのでしょうか?

Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/9 18:02
nobunobu
う〜〜ん、メーリス だめですか・・・
小生の憶測では、メーリスのトラブルも
「PopnupBlogUtils.phpの方のコメントアウトミスでは??」
なんて勝手に思いこんでいたんですが・・・

メールヘッダ表示の件ですが、
ちなみにselaさんは、メール受信ソフトは何をお使いですか?
とりあえず参考のために教えて頂けませんか?

家に帰って冷静に調べさせて頂きます
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: uishii | 投稿日時: 2005/11/9 19:14
uishii
こんにちは
おそまぎながらアンド横やりかもしれませんが
popnupblogのメーリングリストが配信されないのは
2つぐらい前のxoopscubeからだったとおもいます。
作者さんは本家の方を基準にされてるようでしたよ。
xoopscubeのバージョン重ねるごとに文字化けが出たりしてきました。
あとメーリングリストの配信、メールでの投稿の場合できなくなって、
直接、編集すると機能してました。(これは投稿があったときのお知らせにも当てはまりこなくなった)
で設定でメーリングリストに画像をつけない設定もしてたのですが、ついてくるようにもなってしまってます。
ちなみにうちでは、トップページのブロックにアクセスがあったとき、メールボックスをチェックしにいくようにプチ改造してます。
雑文乱筆お許しください

投票(0)

新しいものから | 古いものから | RSS feed
 
To Top