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

メール送信時のSubject文字化け
投稿者: typista | 投稿日時: 2005/10/28 19:50 | 閲覧: 80301回
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文字化け 
投稿者: dendeke | 投稿日時: 2005/10/28 23:04
dendeke
typistaさん、こんにちわ。

的外れかもしれませんが、PHP4.4がリリースされた直後にPHPをアップグレードして4.4にしたところ、同じような現象に出会ったような記憶があります。結果、PHPを元の4.3.11に戻して今も運用し、文字化けは発生していません。

kypistaさんの環境がわからないので何とも言えませんが、自宅サーバなどで自由にPHPのアップグレードもダウングレードもできるようでしたら、一度PHP4.3.11あたりを試してみたらどうなりますか?

ご参考までに。
Re: メール送信時のSubject文字化け 
投稿者: typista | 投稿日時: 2005/10/28 23:16
typista
dendeke さん
ご回答ありがとうございます。貴重な情報です。
ローカルではXSASを利用しているので、PHP4.4.0ですが、アップする対象は4.2.Xなので、少し期待(?)が持てるかも知れません。

ただ、ローカルで発生しているもののデフォルト状態では文字化けしないので、私の操作/コードに問題があるのかと疑っています(TT
ちなみに、PHPファイルはEUC保存しています。
Re: メール送信時のSubject文字化け 
投稿者: Marijuana | 投稿日時: 2005/10/28 23:49
Marijuana
既出ですよ。
Re: メール送信時のSubject文字化け 
投稿者: okuhiki | 投稿日時: 2005/10/29 1:47
okuhiki
\xoops-2.0.13a-JP\html\language\japanese\xoopsmailerlocal.php Line130
$encoded = mb_convert_encoding((phpversion() == "4.4.0" ? "\n" : "").$str, _CHARSET, mb_detect_encoding($str));
として、4.4.0なら先頭に改行を入れて試たところ化けなくなりました。
なぜ化けなくなったのか、また他の問題が発生する可能性なども不明です。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/5 20:36
nobunobu
PHP4.4.0における、メールヘッダの文字化けについて調査したところ、PHP4.4.0以降でmb_encode_mimeheader()が想定外の動作を行う事が判りました。

次リリースにて対応版をリリースする前提で、ここで暫定修正版を公開させて頂きます。
一応、PHP4.3.11 4.4.1 4.4.2-dev(XREA.COMの最新環境)にて動作確認をさせて頂いておりますが、環境によって所定の動作が行われない場合には、当スレッドにレスを下さい。

[暫定修正版入手先]
xoopsmailerlocal.php
上記リンクよりファイルをダウンロードして、language/japanese/xoopsmailerlocal.php と置き換えて下さい。

現状の正式版との差分については、[差分]にてご覧いただけます。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/7 3:54
sela
nobunobuさんはじめまして。

私もサイトからのメール配信で文字化けを経験していて困っているのですが、早速暫定修正版を試してみました。
すると、今まで使えていたユーザ宛のメール送信まで機能しなくなってしまったみたいです。送信ボタンを押しても送信してくれません。なにか分かることあれば、ご教授ください。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/7 10:24
nobunobu
「メール送信まで機能しなくなってしまった」っていうのは、非常に申し訳ありません。
とりあえず元のファイルに戻して下さい。
で、selaさんの使用されている、XOOPS及びPHPのバージョンを教えて下さいませんでしょうか。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/7 10:53
sela
使っているXOOPSバージョンは2.0.13a-JPです。
サーバーはXREAです。

よろしくお願いします。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/7 11:38
nobunobu
引用:

selaさんは書きました:
使っているXOOPSバージョンは2.0.13a-JPです。
サーバーはXREAです。
よろしくお願いします。


XREAということは、サーバにより若干の違いはあるかもしれませんが小生のサイトと同じで、PHP Version 4.4.2-dev ですね。
先ほど、念のため自サイトにて「ユーザ宛メール送信」を試しましたが、うまく配信されています。

あと数点質問させて下さい。
1.「ユーザ宛メール送信」を実行した場合に、
引用:

XXXXXさん宛にメールを送信しました

メッセージの送信を完了しました

 の様な完了画面は表示されますか?
 それともその他のメッセージなど表示されるのでしょうか?

2.「管理者メニュー」の「システム管理」-「一般設定」-「メール設定」画面にて、「メール送信方法」は、
  [PHP mail()]
  [sendmail]
  [SMTP]
  [SMTPAuth]
 のいずれに設定されていますか?
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/7 18:24
sela
お手数おかけします。

1.ファイル上書き前は、引用:
XXXXXさん宛にメールを送信しました

メッセージの送信を完了しました
というメッセージがちゃんと表示されていたんですが、書き換え後はリンクが見つからないらしく「ページを表示できません」と出てきます。

2.メール配信方法は、デフォルトの[PHP mail()]になっています。

よろしくお願いします。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/7 20:51
nobunobu
引用:
書き換え後はリンクが見つからないらしく「ページを表示できません」と出てきます。

ということから見ると、おそらくどこかで無限ループしてTimeoutしたのかもしれませんね。(XREAだとTimeoutが30秒なので・・)

お手数を、おかけしますが、できれば、
「ユーザ宛メール送信」にて、「送信者(メール使用時)」にて指定されている文字列を教えて頂ければ幸いです。
あと、.htaccessなどで、
mbstring.func_overload
のパラメータ設定などされていないですよね?
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/7 21:04
sela
どうやら「送信者(メール使用時)」のところで日本語を使っているのが問題みたいですね。ここをアルファベットにしたら送信できました!

ただ、やはり送信者名は日本語での表示がいいので、対応できたらと思います。ちなみに、送信者名には漢字7文字+カタカナ9文字を設定していました。これはサイトのタイトルと同じものです。

よろしくお願いします。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/7 22:17
nobunobu
引用:
漢字7文字+カタカナ9文字

ってのが、大きな助けになりました。
やはり、特定の文字列長にて無限ループになっておりました

ということで、
引用:

[暫定修正版入手先]
xoopsmailerlocal.php
上記リンクよりファイルをダウンロードして、language/japanese/xoopsmailerlocal.php と置き換えて下さい。


を修正版に差し替えました。
再度ダウンロードしていただけませんでしょうか。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/7 23:00
sela
早速の対応ありがとうございます!
通常の「ユーザー宛メール送信」はうまくいきました!

ところが、そもそもの問題だったPopnupBlogから配信されるメールでは文字化けをしてしまいます。PopnupBlogはメール送信の際、Xoops本体のメール関数を使っているようなので、こちらが修正されれば改善されるだろうと期待していました。ただ、現実はそうではないようです。
メールからブログに投稿できるのですが、それは正常に機能します。その後、「投稿されました」という返信メールが送信者に送られるのですが、サイト名が表示されるべきタイトルが白紙で件名も文字化けをしています。
さらに、ブログに投稿されるとメーリスに配信する機能がついているのですが、上書き前のxoopsmailerlocal.phpでは件名などが文字化けしていたもののちゃんと送信されていたのが、修正版では送信すらしてくれないみたいです。
何か、分かることがありましたらご教示ください。

よろしくお願いします。
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: nobunobu | 投稿日時: 2005/11/8 0:10
nobunobu
引用:
PopnupBlogから配信されるメール

は、XOOPSのNotifyの仕組みを使っているようですね。
当方で別モジュールWeblinksからのNotifyは文字化けせずに受け取れているんですけど・・f^_^;

PopnupBlogは、現在「PopnupBlog v2.22 Redwood-1106」というのしか入手できませんでしたが、
selaさんの使われているバージョンは幾つでしょうか?

こちらの調査に関しては少々時間をいただけますでしょうか?
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/8 1:59
sela
調査していただけるだけ、大変感謝しています!
今後の改良の手助けになればと思います。

使っているPopnupBlogのバージョンはv2.21です。
役に立つかわかりませんが、一応メール送信に関する記述があるPopnupBlogUtils.phpの一部を掲載しておきます。

よろしくお願いします。

引用:
function send_mailinglist($from,$to,$uname,$subj,$blogname,$blogurl,$message='',$files) {
global $xoopsConfig,$BlogCNF;
$debug = 0;
$xoopsMailer =& getMailer();
$xoopsMailer->useMail();
$xoopsMailer->setTemplateDir($BlogCNF['path']."language/".$xoopsConfig['language']."/mail_template/");
$xoopsMailer->setTemplate("mailinglist.tpl");
$xoopsMailer->setToEmails($to);
$xoopsMailer->assign("POST_TITLE", $subj);
$xoopsMailer->assign("POST_MESSAGE", $message);
$xoopsMailer->assign("BLOG_URL", $blogurl);
$xoopsMailer->assign("SITENAME", $xoopsConfig['sitename']);
$xoopsMailer->assign("SITEURL", $xoopsConfig['xoops_url']."/");
$xoopsMailer->assign("BLOG_UNAME", $uname);
$xoopsMailer->assign("BLOG_MAIL", $from);
$xoopsMailer->setFromEmail($from);
$xoopsMailer->setFromName($uname);
$subj = sprintf(_MD_POPNUPBLOG_MAILINGLIST,$xoopsConfig['sitename'],$blogname);
if ( function_exists('mb_encode_mimeheader') )
$subj = mb_encode_mimeheader( $subj, PopnupBlogUtils::get_mailcode(), "B" );
$xoopsMailer->setSubject($subj);
if ($debug){ echo "Attached files=".count($files)."
"; }
for($i=0;$i if ($debug){ echo "Path=".$files[$i]['path']." File name=".$files[$i]['name']."
"; }
if (preg_match("/\.(gif|jpe?g|png|bmp)$/i",$files[$i]['path'])){
$size = getimagesize($files[$i]['path']);
if ($size[0] // Send Thumbnail or Under Thumbnail size
$xoopsMailer->multimailer->AddAttachment($files[$i]['path'],$files[$i]['name'],"base64",$size['mime']);
}
} else {
// Send Attach file
$xoopsMailer->multimailer->AddAttachment($files[$i]['path'],$files[$i]['name']);
}
}
$xoopsMailer->send();
}
function send_notify($blogid,$blogname,$blogurl,$subj,$message=''){
// RMV-NOTIFY
// Define tags for notification message
$tags = array();
$tags['BLOG_NAME'] = $blogname;
$tags['POST_NAME'] = $subj;
$tags['POST_URL'] = $blogurl;
$tags['POST_CONTENT'] = $message;
$notification_handler =& xoops_gethandler('notification');
$notification_handler->triggerEvent('blog', $blogid, 'new_post', $tags);
$notification_handler->triggerEvent('global', 0, 'new_post', $tags);
$notification_handler->triggerEvent('global', 0, 'new_fullpost', $tags);

// If user checked notification box, subscribe them to the
// appropriate event; if unchecked, then unsubscribe

if (!empty($xoopsUser) && !empty($xoopsModuleConfig['notification_enabled'])) {
$notification_handler->subscribe('blog', $blogid, 'new_post');
}

}
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 8:58
domifara
引用:
selaさんは書きました:
使っているPopnupBlogのバージョンはv2.21です。
役に立つかわかりませんが、一応メール送信に関する記述があるPopnupBlogUtils.phpの一部を掲載しておきます。

		if ( function_exists('mb_encode_mimeheader') )
			$subj = mb_encode_mimeheader( $subj, PopnupBlogUtils::get_mailcode(), "B" );
		$xoopsMailer->setSubject($subj);


これは
PopnupBlogの方で、先にメールヘッダーのエンコードをしてしまっているため
xoopsmailerlocal.php
の方で2重に編集されてしまって文字化けしてしまいます。

これが、以前のmb_encode_mimeheaderを使っている
(xoops2.0.13aJP)ものだとなぜそうならないか?
というのが、どうも
mb_encode_mimeheaderは,内部に
すでに変換済かどうかの判定を持っているみたいで
変換済の場合はそのまま出てくる・・みたいな動きをするので
今までは問題でなかったのではないかと思います
テストコード

$subj = "漢字" ;
$subj = mb_encode_mimeheader( $subj , "UTF-8", "B" );
echo $subj ;
echo "<br />" ;
$subj = mb_encode_mimeheader( $subj , "UTF-8", "B" );
echo $subj ;

何回重複してmb_encode_mimeheaderしても、結果はおなじなります

だから、
今回の4.4.x対応のも
mb_encode_mimeheaderの代わりをするところは

すでに、変換済かどうか判定処理しないといけないと思います
line 127

   function encode_header ($str, $position = 'text', $force=false) {
        $encode_charset = 'ISO-2022-JP';

の下
(こんなので判定効くのかな?)

function encode_header ($str, $position = 'text', $force=false) { $encode_charset = $this->CharSet; if (preg_match ( '|' . preg_quote('=?' . $encode_charset . '?'). '.\?|', $str) ) { $encoded = $str ; return $encoded; }

| でなくて / ごめんなさい間違えてました


    function encode_header ($str, $position = 'text', $force=false) {
       $encode_charset = $this->CharSet;
        if (preg_match ( '/' . preg_quote('=?' . $encode_charset . '?'). '.\?/i', $str) ) {
            	$encoded = $str ;
		        return $encoded;
        }

あたりを入れるとか
訂正
ふにゃ間違えてた
line 128 にいれないといけなかったです

追記、
2重に変換しちゃう問題と
php4.4.xでmb_encode_mimeheader使っているモジュールは?
文字化けしちゃう問題とは別で
両方対応が必要でしたね
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 9:41
domifara
さっきの間違えたので、訂正したのですが
念の為、私の改造テスト中のxoopsmailerlocal.php

こちらに置いておきました

注意:上記余計にものが追加されています
PHP Mailer が 1.7x とかでメソッドの名が微妙に変わっています
encode_header が EncodeHeader
addr_format が AddrFormat
となっいます。xoopsmailerlocal.phpは
コンパチに動くようにしているのです。

Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: domifara | 投稿日時: 2005/11/8 9:54
domifara
selaさんへ

		if ( function_exists('mb_encode_mimeheader') )
			$subj = mb_encode_mimeheader( $subj, PopnupBlogUtils::get_mailcode(), "B" );

のところ
PHP 4.4.xでは
mb_encode_mimeheader
が予期せぬ文字化けを起すということなので
この行を削除するか
コメント // のマークを行の先頭

//		if ( function_exists('mb_encode_mimeheader') )
//			$subj = mb_encode_mimeheader( $subj, PopnupBlogUtils::get_mailcode(), "B" );

にいれてみてください
Re: メール送信時のSubject文字化け[PHP 4.4.x用暫定対応版公開] 
投稿者: sela | 投稿日時: 2005/11/8 14:06
sela
domifaraさん、ありがとうございます。

一つ確認なんですが、xoopsmailerlocal.phpを上書きして、PopnupBlogの方をコメントアウトするという両方をやるのでいいんですよね?

ためしにやってみました。検証点は以下の3つです。

1.ユーザ宛メール送信ではメール送信ができましたが、送信ボタンを押した後に出るメッセージに引用:
xoopsmailerlocal.php100666 000000 000000 16306 10333770636 12621 ustar00rootwebmasterさん宛にメールを送信しました
なんていうのが出てしまいます。

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

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

以上、ご報告まで。

投票(0)

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