LOGIN ID Password Auto Login Register Now! Lost Password?
Xoops Q&A

XCL2.2(pack2013)でメール送信すると本文にヘッダ情報

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています

投稿ツリー


前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 | 投稿日時 2014/6/1 13:19
kerokero  1st Class   投稿数: 35
いつもお世話になります
サーバー乗換をしたら問い合わせフォームから送信されたメール本文の始めにヘッダ情報が表示されるようになってしまいました
<受信メールのイメージ> http://www.crossl.net/blog/outlook_mail_trouble/

検索すると同様の方がおりましたが乗換前は問題なかったのでサーバー設定を中心に確認しましたが解決に至らず投稿させていただきました

■phpinfo
default_charset UTF-8
mbstring.encoding_translation Off
mbstring.http_input pass
mbstring.http_output pass
mbstring.internal_encoding UTF-8
mbstring.language neutral

■環境
レンタルVPS
OS:CentOS6.5
apache:2.2.15
PHP:5.3.3(x86_64)

xoops:XoopsX-legacy-corepack_20130130(XCL2.2.2)
使用言語:ja_utf8
XOOPSコンフィグ→メール設定→メール送信方法:PHP mail()
問い合わせフォーム:formmail (spam SSL対応版)1.2.8

MTA:postfix2.8.4

お気づきの点や参考URLなどありましたらご教示のほど、よろしくお願いいたします
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/1 17:42
nao-pon  Lieutenant   投稿数: 488
kerokero さん、こんんちは。

メールヘッダ中の Subject: の項目の改行が CRLF になっているため、MTA が改行2つと判断し、そこでメールヘッダが終了していると誤判定しているような感じですね。

メールヘッダの改行文字は RFC で CRLF と定められているのですが、一部の MTA では LF しか受け付けないためか、XOOPS で使用しているメールライブラリの PHPMailer クラスでは、メールヘッダの規定の改行コードを LF にしているようです。

PHP の mail() 関数の第二引数 "string $subject" は、RFC 2047 を満たす必要があり改行コードは CRLF を指定しなければ正しく改行されません。そこで、XCL の日本語環境下では、Subject: ヘッダのエンコードに PHP のmb_encode_mimeheader 関数を使って改行文字の指定に CRLF を指定するようになっています。(参照: Xoops Users Group Japan - XCL2.1.7から届くメールのsubjectが途中から文字化け - トラブル - Xoops Q&A)

ということで、メールヘッダ中に改行文字として CRLF と LF が混在することになり、それで問題が生じているのかも知れません。

以上の事を鑑みまして、html/class/mail/xoopsmultimailer.php の 153行目あたりの
  function XoopsMultiMailer(){
    global $xoopsConfig;
の下に改行コードを CRLF に設定するために行を追加し次のようにシてみてください。
  function XoopsMultiMailer(){
    global $xoopsConfig;
    $this->LE = "\r\n";
これでどのような結果になるかは、MTA 次第です。

ちなみに私の環境(Webサーバーの MTA postfix -> ドメインの MTA X-Mail Server [Windows] -> 外部の SMTP サーバ)では、変更前・変更後ともに正常な状態です。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/1 18:44
kerokero  1st Class   投稿数: 35
nao-ponさん
いつもサポートありがとうございます。
さっそく1行追加してみましたが、残念ながら変化なしでした

正常時に届いたメールと現在のメールのソースを眺めてみると、subjectのところで

■正常時
Subject: =?ISO-2022-JP?B?(xxxxxxx)?=
=?ISO-2022-JP?B?(xxxxxxx)?=

■現在
Subject: =?ISO-2022-JP?B?(xxxxxxx)?= =?ISO-2022-JP?B?(xxxxxxx)=?=

※(xxxxxxx)は書き換えています

メールのソースは「WindowsLiveMail2012:メッセージのソース」で確認していますが途中で改行が足りないのが原因なのでは?と感じましたが的外れだったらすみません。。。
他に必要な情報などありましたら記載させていただきますので、よろしくお願いいたします
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/1 21:18 | 最終変更
nao-pon  Lieutenant   投稿数: 488
> さっそく1行追加してみましたが、残念ながら変化なしでした

それは、残念でした。外しちゃいました

php.ini の mbstring.func_overload の値は何になっていますか?
この値が 1,3,5,7 のいずれかだと mail() は mb_send_mail() のエイリアスになるので、もしかしたらその辺りが関係するかも知れません。
もし、mbstring.func_overload が 0 以外になっているのであれば、何もオーバーロードしない 0 がお勧めです。

その値が「0」であるなら・・・大元の原因は何だろう?ご推察の通り、Subject: が改行されずに一行に繋がっているのは問題があると思うのですが、そのような場合そこでメールヘッダが終了とみなされるのはちょっと不思議な気もします・・・。文字化けしちゃってるのかな?


投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/1 21:49
kerokero  1st Class   投稿数: 35
nao-ponさん

早速の返信、ありがとうございます。

phpinfo()で確認しmbstring.func_overload 0となっていました
postfixの設定なのかな?と感じていますがこの辺は特に意識したことが無くあたりを付けるのも難しい感じです。。。

また何かお気付きの点などありましたらよろしくお願いいたします
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/3 23:31
nao-pon  Lieutenant   投稿数: 488
多分、メールヘッダの Subject: の値に起因することだと思うので、どのような値が mail() に渡っているかを確認すると何か分かるかも知れません。

具体的には、html/class/mail/phpmailer/class.phpmailer.php の 732行目あたりからの MailSend($header, $body) 関数内の 742行目あたりの

if ($this->Sender != '' and !$isSafeMode) {

の前に

file_put_contents(XOOPS_TRUST_PATH.'/cache/maildbg.txt', print_r($this->EncodeHeader($this->SecureHeader($this->Subject)), true));

を追加すると、メール送信のタイミングで、XOOPS_TRUST_PATH/cache/maildbg.txt に mail() に渡る Subject の値が出力されますので、その内容を確認してみてください。

mail() に渡す Subject の折り返し改行文字は CRLF でないと、一行に繋がってしまいますので、そのあたりがポイントかな。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/6/4 0:28
kerokero  1st Class   投稿数: 35
nao-ponさん。夜分、大変恐縮です
早速、埋め込んでlog確認しました。

=?ISO-2022-JP?B?(xxxxxxx)?=
 =?ISO-2022-JP?B?(xxxxxxx)?=

1.
バイナリエディタで確認したところ、上段と下段の間には16進0D、0A、20となっていました(<CR><LF><スペース>)

2.
また、以前正常に受信できていたメールの控えと比較し(xxxxxxx)部分の文字列が一致した事が確認できました。

3.
試しにGmail(ブラウザ)でメール受信したところ、本文にヘッダが表示されていませんでした
※WindowsLiveMail2012の問題でしょうか?

やはりMTA(postfix)の設定なのかな?という気がしておりますが、何か手がかりがあればとググっているものの。。。。
お気づきの点ありましたらご教示のほど、よろしくお願いいたします
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/5 23:04 | 最終変更
kerokero  1st Class   投稿数: 35
無事、解決しましたのでご報告いたします。
やはり同様の方がいらっしゃいまして、モジュールの修正を行いました。

/html/language/ja_utf8/xoopsmailerlocal.php
140行目

変更前)
$encoded = mb_encode_mimeheader($str, 'ISO-2022-JP', 'B', "\r\n", 9); // offset strlen("Subject: ") as 9

変更後)
$encoded = mb_encode_mimeheader($str, 'ISO-2022-JP', 'B', "\n", 9); // offset strlen("Subject: ") as 9

参考URL http://blog.bmoon.jp/diary/xcl22iso-2022.php

経緯があって\n→\r\nとなっているようですので、不本意ではありましたが、正常にメール送信できたことから
今回はこの修正(\r\n→\n)で対応したいとおもいます。

nao-ponさん。お力添え大変ありがとうございました
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/6 10:48
nao-pon  Lieutenant   投稿数: 488
> 経緯があって\n→\r\nとなっているようですので、不本意ではありましたが、正常にメール送信できたことから
今回はこの修正(\r\n→\n)で対応したいとおもいます。

確認したいことがあるので、もう少々お付き合いください。

\n にすると、送信されたメールは Subject の改行がなくなり1行につながっていませんか?

詳しくは、PHPのmail()のできの悪さ - よくきたblog といったことなのですが、現状の PHP のソースを確認してみましたが、この記事の当時のままとなっているようです。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/6 19:13
kerokero  1st Class   投稿数: 35
nao-ponさん
おせわになります。

メッセージのソースをWindowsLiveMail2012で確認したところ1行につながっていました
Subject: =?ISO-2022-JP?B?(xxxxx)?= =?ISO-2022-JP?B?(xxxxx)?=

※間にスペース2個入っている感じです。

他に確認したいことがあれば仰ってください。
ご連絡おまちいたします。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/6/6 20:26 | 最終変更
nao-pon  Lieutenant   投稿数: 488
> メッセージのソースをWindowsLiveMail2012で確認したところ1行につながっていました

やはり、そうなりますよね。本来ならメールヘッダは 79 文字を超える前に適宜改行し、先頭にスペースを入れるというのが RFC 的には正しいのですが、MTA によっては CRLF を改行2回と判断するような感じなので、xoopsmailerlocal.php で、mb_encode_mimeheader() に与える改行文字種を設定できるようにしたほうがよさそうですね。

ただ、そのような挙動をする MTA としては qmail が知られているのですが、kerokero さんのサーバーは postfix ですよね。

そこが、ちょっと疑問でもあります。私のところのサーバーは postfix 2.8.10 ですが、CRLF で特に問題ないんです。

まあ、とにもかくにも定数あたりで指定できるようにしてみようと思います。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/6/6 21:48
kerokero  1st Class   投稿数: 35
nao-ponさん
ご連絡ありがとうございます。

いままで特に問題なくメール送信できていたので、気にしていませんでしたが色々クセがあるんですね
当方の環境はやはりpostfixでした

# alternatives --display mta
mta - status is manual.
link currently points to /usr/sbin/sendmail.postfix
/usr/sbin/sendmail.postfix - priority 30


#yum list installed | grep postfix
postfix.x86_64 2:2.8.4-12052415 @PSA_11_0_9-dist

色々お力添えいただき大変ありがとうございました。
また、確認したいことがあればご連絡ください
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/6/7 21:44
nao-pon  Lieutenant   投稿数: 488
原因が、PHP の mail() に渡す改行コードが規定値の CRLF の場合に、一部の環境において、メール Subject が正しく処理されないということが判明しましたので、次の XCL のバージョンより preload により、その改行コードを指定できるようになります。

具体的には、改行コードを LF にシたい場合は、prelaod ディレクトリに次の内容のファイルを置いて下さい。ファイル名は preload の命名規則に従えば何でも構いませんので「XoopsMailerLocalSetLE.class.php」とでもすればOKです。

<?php
define('XCUBE_MAILERLOCAL_MAIL_LE', "\n");

まずは、XOOPS X の先行版(CorePack および pilot)に取り込みましたので、先立って適用したい場合は、X-update の一般設定の「非表示ストア(開発・先行版)も表示する」を「はい」にすることで表示される「For Developer」ストアにある「legacy ( XoopsX_CorePack ) 」か「legacy ( XoopsX_pilot ) 」で legacy をアップデートすることで、上記の preload が利用できるようになります。

また、上記 preload は html/preload/disabled ディレクトリに含まれていますので、それを html/preload に移動すれば OK です。
投票数:1 平均点:10.00
  条件検索へ

Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities