最初、学術・研究・軍事の目的で開発、利用されてきたインターネットが学校や職場で使えるようになり、さらにコンピュータを私生活でもよく使う人は早くからインターネットを導入してきた。
そのうち一家に一台の PC になり、いまや1人1台、いや1人でn台のコンピューティング環境を持つ、というのも決して珍しくなくなり、インターネット利用のすそ野は大きく広がった。
1人n台というのは大げさな話ではなく、自宅の PC でもちろんインターネット接続するだけでなく、今や携帯電話、PDA でも接続が可能だ。車の中でカーナビ経由で使えるインターネットはもっと普及するだろうし、いずれデジタルカメラなど普段持ち歩くものにも標準装備されるかもしれない。
インターネットがコンピュータ好きな人たちの間で使われているときはまだ「パソコン通信」のイメージが世間一般には多く、今ほどインフラが整っているわけでもなく、もちろんインターネットバンキングなどもなかった。それが今やほとんどのサービスがインターネットで受け連れられるようになり、この傾向はますます進むと思われる。
それにつれて自宅にダイレクトメールが舞い込む様にインターネットでも広告産業がにぎやかになってきた。それだけ生活に根ざした一つの通信手段になってきたからだと思う。
当初はメールとして送られてくる広告 ( スパムメール ) だけだったのが、最近はブログブームを反映してかブログに着くコメントやトラックバックまで利用して広告を貼り付けにくるほどだ。
僕がこの New York Watch のブログシステムとして利用している Mobable Type もそういったスパムコメントやスパムトラックバックに対応するため、大きなバージョンアップがあった。それが version 3.0だ。
ここ New York Watch でもいろいろなスパムが投稿されるので、早くから3.0をインストールし、さらにver 2.6x の時代からコメントが投稿されればすぐにメールで僕のところに通知されるように設定して注意を払ってきた。
ところが 2.6X から ver 3.11-ja にインストールし直したときに、なぜかメール通知機能が働かなくなってしまった。
このときはあまり詳しく調べず、単に google で検索してみると「2.6Xなど過去の Movable Type から lib/MT/Mail.pm を抜き出して、上書きすれば動作した」という他のユーザの書き込みが見つかった。そこでこのときは対処方としてこれに従って同じ事をやってみた。
もちろんこれで動くようになったのだが、今回、3.11-ja から3.15-ja へとアップグレードをするとやはりコメント通知機能が動作しなくなった。
そこで今回はもうちょっと詳しく調べてみようとググって見ると、どうやらこの現象は日本人にだけ起きていることがわかった。米国ではこの問題は報告されていないのだ。
今回のアップグレードでもやはり Mail.pm というモジュールが書き換えられているので、このファイルをエディタで開いてみて納得。
日本語環境で使用している場合に、メールの From: や Subject: の部分をエンコードしている部分があり、どうやらこのエンコードが正しく行われていないためにメールが送出できなくなっているようだった。
ググって見るとこれに気が付いている人たちがすでに対処法をのせている。僕が参照させてもらったのは「MT3.0以降でのメール文字化け修正」というブログのエントリだ。
こちらでは、文字化けという形で問題が出ているが、僕の場合は sendmail か Postfix とのハンドシェイクで失敗しているようでそのためにメールが送られない、とそれぞれ現象は違うがこの方の修正方法で僕の方も正しく動くようになった。
修正部分というのは lib/MT/Mail.pm ( 3.15-ja 版 ) の41行目の
$hdrs->{Subject} =~ s/\r?\n/\r\n/g;
という行をコメントアウトしてしまうこと。具体的には行頭に「#」を加えるだけだ。
すると付近の行のイメージはこんな感じになる。
if ($mgr->DefaultLanguage eq 'ja') {
my $enc = $mgr->PublishCharset;
$body = MT::I18N::encode_text($body,$enc,'jis');
$hdrs->{Subject} = MT::I18N::encode_text($hdrs->{Subject}, undef, 'jis');
$hdrs->{Subject} = Jcode->new($hdrs->{Subject}, 'jis')->mime_encode;
# $hdrs->{Subject} =~ s/\r?\n/\r\n/g;
$hdrs->{'Content-Type'} = qq(text/plain; charset="iso-2022-jp");
$hdrs->{'Content-Transfer-Encoding'} = "7bit";
}
僕の環境ではこれだけでメールの送信が正しく行われるようになったので、似たような現象で悩んでいる人は試してみては?
それにしても「デフォルト言語が日本語なら」という分岐部分なので、確かにこれなら日本人にしか起きない問題なわけだ。
ということで無事 Movable Type 3.15 にアップグレード完了。これからもご声援お願いします。

すみません、トラバ重複して行ってしまったようです、一つ削除下さい。申し訳ありません。
shkdさん、このたびはお世話になりました。おかげでメール通知がうまく動作するようになりました。
ところでこんなお時間まで起きてらっしゃるんですか?
トラックバックの重複は削除しておきました。これからもどうぞよろしくです。
ひ さん、こんちは。
MT (3.11-ja)の設定をしてコメントが来たらメール通知をするようにしてみましたが、僕の環境ではデフォルトの状態で何の問題もなくメールが送信でき、受信(文字化けしてない)できたようです・・・。というか僕にはコメントアウトしたところがどういう意味を持つのか今一つ良くわかってなかったり(^^;
ROSOさん、Mail.pmの中では「管理画面で日本語を選択している場合、MIMEエンコードを行う」というように書かれています。なのでいくつかシミュレーションすると、
1 管理画面が英語の場合、MIMEエンコードは行わず、パススルーしている。受信時文字化け等見られない場合はメーラによって救済されている可能性も。
2 管理画面が日本語の場合、MIMEエンコードされるんですがこの中で改行コードの変換をしています。(\n -> \n\r )
これによってSubject:が複数行にまたがってしまうという。それでも受信出来ているのはおそらくMTAが改行コードの修復をしているのではないか、と思います。僕が借りているサーバsendmailが使えるんですが、Subject:のせいで送信エラーになります。また送信出来ても文字化けする人もこのケースのようです。
ちなみに最近見つかったMTの脆弱性ってこのあたりの事みたいですよ。つまりこの改行コードを埋め込むことでSubject:が複数になる = そこに From: などのようなヘッダと同じような語句を潜ませておけばメーラはそこから新しいヘッダと勘違いしてそのまま送ってしまう、と言うことだと思います。
ひ さん、再びこんちは。
丁寧なご返事、どうもありがとうございます。
僕がちょっと勘違いしてたところがわかりましたが、おいおい書きますね。
その前に僕の使用環境は「2:管理画面が日本語の場合」でサーバーでは sendmail を使用してます。
> この中で改行コードの変換をしています。(\n -> \n\r )
> これによってSubject:が複数行にまたがってしまうという。
まずここですが、RFC的には同一フィールドは複数行あっても構わないわけですよね。ただし改行コードは「CRLF」、つまり "\r\n" であり、改行した次の行の先頭は空白である、ぐらいの条件はあったと思います(もうちょっと厳しかったのかもしれませんし、緩かったのかも知れません、うろ覚えです)。この間の MT の脆弱性はこの辺りのチェックをサボっていたためフィールドの上書きができたのかなぁ、とぼんやりと考えてました。
それで lib/MT/Mail.pm 内の send という関数を、特に日本語で分岐するところをおっかけてみるんですが、まず mime_encode してるところがありますよね。これは Jcode が処理してますが、 Jcode 自体はこの mime_encode の処理を MIME:Base64 にまかせるので Subject: フィールドが長い場合適当にセパレーターを "\n "(空白もあることに注意。)で分割されることになります。
MT の日本語版の場合 MT が付けてくれる日本語メッセージが長いので、(多分)どの Blog タイトルであってもまず間違いなく分割されます。つまりここで $hdrs->{Subject} には "\n" がはいっちゃうわけです。
解決策として提示していただいてる行はこの "\n" を「CRLF」に変換する、つまり RFC に沿った形に変換するので、僕にはこの行が悪いことをしてるとはとても思えなかったのです。その結果僕の弱い頭は無限ループに陥いってしまったわけすが(^^;
・・・で、初めに書いた「勘違い」してた部分なのですが、メッセージを sendmail -t で渡す時は必ずしも RFC に沿った形でなくていいのですね。つまり改行コードは "\n" で受けつけてくれるみたいです。というか世間にあるサンプルコードはみんな "\n" です。また lib/MT/Mail.pm の部分の実際に sendmail に渡してるところでも改行コードは "\n" です。
・・・。
もしかしたら "\r\n"は禁句(?_?)
もちろんオプション付けて "\r\n" を受けつけるようにはできるみたいですけどね。そのオプションなしで sendmail が "\r\n" にでくわした時にどういう挙動をするように定められているのか man page から見つけることができませんでした。
僕の使ってるサーバーでは "sendmail -t" でメッセージを渡す時改行コードを "\r\n" にしても("\n" と "\r\n"と交ぜても)メールは無事送信できるんですね。そういうわけで僕のところでは何もしなくても大丈夫だったんだろうな、と思ってます。
長々とすいません。
ROSOさん、詳しく、かつ優しい説明ありがとうございました。
僕もRFCを確認せずいい加減なことを書いてましたね。いまちょっと確認したのですが、ヘッダーの複数行はRFCで定義されていました。Foldingというようですが、この場合は確かに改行のあとに一つのスペースを置くことになっているようです。
ところがMail.pmではこの"\n "を"\r\n"に変換してしまってスペースを落としているのが問題なのではないでしょうか???
つまりコメントアウトしたことで動くようになったのは、"\r"を挿入しなくなったからではなく、Folding後に必要な頭のスペースを削除しなくなったから、という効用ではないかと。
なのでsendmail -tが使えるROSOさんのところでは、行頭のスペースが無くても送信出来ているのではないかと。
それともう一つ質問なんですが(自分で調べるべきですけれど、もし知っていたら教えてください)、なんで\nをDOSと同じくCR・LFに変える必要があるんでしょうね? sendmailや他のMTAがUNIXだけでなく、WindowsNTサーバで稼働していることも考慮してなのかな?それともこれもRFCで定められているのでしょうか。
いまからちょっとデバッグしてみます。
ひ さん、こんちは。
何かチャット状態ですね(^^)
先程は長々とまた結論もなしに書きこんでしまいましてすいません。
> Mail.pmではこの"\n "を"\r\n"に変換してしまってスペースを落としているのが問題なのではないでしょうか???
Mail.pm の該当部分は
> $hdrs->{Subject} = Jcode->new($hdrs->{Subject}, 'jis')->mime_encode;
> $hdrs->{Subject} =~ s/\r?\n/\r\n/g;
ですので、空白は落ちないですよね?あれ?僕、何か勘違いしてます?
> ROSOさんのところでは、行頭のスペースが無くても送信出来ているのではないかと。
えーっと、でもこの仕様になってるとフィールドとの区別がつかなくなってしまいますよね。例えば
Subject: hoge
From: fuga
が 「hoge\nFrom: fuga」が Subject なのか、fugaさんが Subject が「hoge」のメッセージを送ろうとしてるのかわからなくなっちゃいますよね。
> なんで\nをDOSと同じくCR・LFに変える必要があるんでしょうね?
全然知りません(^^;
これ結構古いですよね。sendmail に -ba オプションというのがあって、これは「ARPANET モードに移行」という意味ですけど、この ARPANET モードでは改行は CRLFなんですね。で、この ARPANET ってのは何かと思って(ひ さんはご存知かも知れませんが)調べてみると↓だとか。
http://yougo.ascii24.com/gh/11/001130.html
まさにひ さんのこの記事の先頭ですよね(^^)
(もちろん RFC2822 の前身(?)である RFC822 も ARPANETですけどね。)
CRLFというのはこの辺から引きずっていて、その互換性を保つために今でもこうなってるんだろうと思うんですけど、そもそも ARPANET で何故 CR・LF にしたかについては知りません。
昔のタイプライターだと「改行」するのにキャリッジリターン(CR)とラインフィード(LF)を使うのではなかったでしたっけ?
何度もすいません。書き忘れてました。前後になるんですが、
>それともこれもRFCで定められているのでしょうか。
そうです。RFC2822です。sendmailさんはよそとお喋りするときは "CR・LF" に変えないといけないハズ。(←実はちょっとうろ覚え。間違ってるカモ。)
MT ーーー→ sendmail ーーーーーー→ 世間
ここは CR・LF (←多分)
前に書いたのは MT から sendmail さんにメッセージを渡すときどうするか、についてですね。ここは LF (\n)のままでいいのか、というか、そのほうが好ましいのか、というところですね。
ROSOさん、こちらは金曜日の朝ですが、そちらはそろそろ深夜に入る時間帯ですね。まだ起きてらっしゃいますか?(^.^)
僕の勘違いかもしれませんが、Perl(というかこの部分はsedの文法ですね)の置換部分、"\r?"の?がワイルドカードで、スペースもここに含まれると思ってました。
未だになぜ僕の方のは修正後のスクリプトが動いて、ROSOさんはオリジナルで動くのかまだ分かってません。
調べてみましたら"?"は直前の文字0個または1個にマッチ、なんですね。ということでここでは"\r\n"でも"\n"でも"\r\n"にせよ、という処理だけでスペースが取り消されることはないようです。お騒がせしました。
が謎はやはり残る。結局sendmailやPostfixをどんな環境で使っているかによる差異なんでしょうか。仕様としてはROSOさんの環境の方が正しいようです。
ひ さん、こんにちは。
あれからすぐ寝てしまい、今起きました。
正規表現、シェルだとそうなりますよね。このあたりまぎわらしくて、僕も良く間違ってしまいます(^^;
結局のところ、僕も良くわかりません。複数の環境(もしかしたらほとんどの環境)であの行をコメントアウトすることで正しく動作するとなるのだから、何かあるんだと思うんですが、良くわからないですね。MTの日本語版を作ってくれてる人の環境は僕のものと似ているのかも知れませんね。そうなると永遠にこのまま、ということになってしまいそうです。何かわかればブロガーのためになるとは思うのですが・・・。
ROSOさんこんにちは。こちらは久しぶりに暖かい気候で晴れ間ものぞいているのでこれからちょっとお出かけしてきます。
どうもMTAの仕様によって動作が異なるようですね。検索すると\r\nを入れて直った、という人と無くして直ったという人、そしてどちらでも動くという三通りの解があるようです。こうなるとMTAの仕様ではないかなと思います。
ところで最近、googleやYahooの検索エンジンの上位にこのサイトが並ぶようになりました。僕のいい加減な発言で皆さんを混乱させないようにしないと。
今回の件もサーチするといつのまにかこのエントリーが上位に位置しています。でもなぜ急にYahooとGoogleがここをピックアップしだしたのだろう。
管理人様へ
コメントのメール通知がうまく動作せず、もう2日が過ぎようとしています。Mail.pmのコメントアウト処理(41行目)は実行してみましたが動作しません。
投稿者 ひ(管) : 2005年02月05日 14:16のエントリーには、
どうもMTAの仕様によって動作が異なるようですね。検索すると\r\nを入れて直った、という人と無くして直ったという人、そしてどちらでも動くという三通りの解があるようです。こうなるとMTAの仕様ではないかなと思います。
とありますが、具体的にはどのような修正方法なのでしょうか?非常に気になります。
プロフィールのメールアドレスの設定、mt.cfg、などは多分大丈夫なものと思っています。サーバーのsendmaiの動作を疑いましたが、フリーのCGIでは正確に動作しています。
残すところは、mail.pmの修正、または2.66系のmail.pmと入れ替えるくらいでしょうか?
ブログビギナーに良いお知恵を賜りますよう、お願いします。
ともぞうさん、初めまして。
コメント通知機能ですが、切り分けとして2.66のMail.pmと一時的に置き換えてテストしてみる、というのは有効でしょう(3.15または3.151のMail.pmをどこかに保存しておく)。それで動作するのなら多少セキュリティの面で不安がありますがそれでしばらく使ってみるというのも手です。
2.66のMail.pmで動作しないとなるとやはり環境を疑うことになります(2.66でメールが送れなかった、という話は聞いたことがないので、おそらく環境ではないかという判断です)
ということで一つずつ確認していくと良いと思うのですが、プロフィールの編集画面で作者のメールアドレスに正しいものが入っているかどうか。
ドキュメントによるとmt.cfgの方が優先されるとあったので、僕の場合は、mt.cfgファイルの中に明示的に同じメールアドレスを記述しています。
と言うことで僕が使用しているmt.cfgの中から関連する行を抜粋すると、
EmailAddressMain hiro@nomeri.com
↑行頭の#を取り外して有効にしています。
SendMailPath /usr/sbin/sendmail
↑同じく行頭の#を外してsendmailへの絶対パスを書いておきます。パスに付いては他のcgiからsendmailを呼び出されたものが動作していると言うことでそれと同じなら動くはずですね。
# MailTransfer smtp
# SMTPServer smtp.your-site.com
↑こちらはコメントしたままにしておきます。 MailTransferタグは表順でsendmailが使用されることになっているのですが、もしともぞうさんがSMTPをお使いでしたらここは変更されていると思います。
どちらも使用出来るのならスイッチしてみたらいかがでしょう。
それからもう一つ、ここには「sendmail」「smtp」の他に「debug」という指定も可能なようです。これにすると標準出力にメールがデバッグプロセスが表示される、と言うことですから、一時的にdebugと指定し、ブラウザからテストのコメント投稿をしてみるとその場で画面が変わって送信シミュレーションをするんではないかと想像しています。良かったら試してみてください。何かヒントが得られるかもしれませんよ。
おはようございます
昨日、投稿しました「ともぞう」です。
早々に、丁寧なご指導いただきありがとうございました。
早速、ご指導いただいたようにチェック、ファイルのアップロードを行いました。ところが状況は変わらず。・・・・・・「debug」?かと思いながらも、昨日こちらに投稿したときのことをふと思い出し、根本的なことを勘違いしていることに気がつきました。
コメントの事前確認を有効にする。
というチェックボックスが「On」になったままでありました。この設定を「Off」にすることで「メールでの通知」が届くようになりました。
どうもお騒がせしました。
ブログビギナーとはいえ、こんな事に気づかないで丸2日過ごしたかと思うと、センスのなさに愕然としてしまいます。
導入前から、セキュリティやスパムメールのことが気になっていたもので、「コメントの事前確認を有効にする。」「 名前とメールアドレスを必須にしますか」当然するでしょう。なんて思いこんでいましたので、昨日メアド無しで投稿できたことに少し驚きを感じていたところでした。
そんな「不届きもの」には別の手だてを講じれば良いのですね。
ThrottleSeconds関連のことは、今日からググルつもりです。
☆結局のところ、次のような設定にしました。
MTはVersion 3.151-ja です。
# EmailAddressMain
# SendMailPath /usr/sbin/sendmail
↑
コメントアウトせず、
mail.pmの41行目のコメントアウトもしない。で暫く様子を見てみます。(文字化けしたときにはやってみまぁす)
教訓:基本的なことを見落とすな。でありました。
ともぞうさん、問題解決できて良かったです!
僕も「コメントの事前確認を有効にする」オプションだとは夢にも思いませんでしたから、僕にも起きうる事だったかも。
ちなみにスパムコメントについては、mtというディレクトリ以外のところにインストールすることでだいぶ減ります。どうも ドメイン名/mt/mt-comment.cgiをねらい打ちしているからのようです。
これでも埒があかないときは画像認証システムを入れると良いと思います。いまのところここには少なくなったのでまだ導入するつもりはありませんが。
はじめまして。うちも3.151-jaにした途端に、コメントのメール通知が来なくなりました。
こちらもいろいろと参考にさせていただいております。ありがとうございます。
ともぞうさんと同じく、「コメントの事前確認」がONで届かず、OFFなら届きます。
しかし、本来はONにした場合でも通知が来ないといけないんですよね。
試しに3.121にすべて戻したところ、やはりONでも通知されるようになりました。
解決方法はいろいろ調べてもまだわかっていないのですが、
3.151(もしくは3.15)になって出てきた不具合だと感じています。
素早く承認するためには、通知が届いてくれないと困るんですけどねぇ…。
keiさん、はじめまして。MTユーザですね!
そっか、keiさんに言われるまでともぞうさんのコメントを誤解してました。「コメントの事前確認」はコメントが着いたら、ブログの管理者が許可をしてはじめて公開されるんだけど、コメントが着いたときにメールが管理者に届かなくてはいけないわけですよね。3.12で動作すると言うことなのでこのあたりは仕様が変わったのかバグなのか、判断に苦しみますね。僕も何か分かったフォローアップします。
すみません、何回もトラックバック送信してしまったようです。お手数ですが、余分のは削除してください。
ログにはPing 'http://www.nomeri.com/mt301/mt-tb.cgi/1263' failed: HTTP error: 500 read timeout
となっているので、送れてないと判断されて何度も送ってしまったみたいです・・・
iswebでのMT3.151-jaの設置に四苦八苦していますが、こちらをはじめいろいろなサイトを参考に、いろいろ試しています。
nonchanさん、こんにちは。さっそくトラックバックは1つだけ残して後のものは削除させて頂きました。
僕もトラックバックのエラーは確認しているのですが、原因不明なので放ってあります。せっかくトラックバックを送ってくれる人に失礼なのはわかっているんですが、なぜこのエラーになるのか・・・しかもちゃんとトラックバックはされているし・・・。
それにしてメールの問題はさらにやっかいですね。iswebではエンコードの部分がうまく動作しないのかな。MTAの違いやら実相されている日本語環境によって動作が異なるのか・・・これまた不明です。すみませんお役に立てませんで。m(__)m
トラックバックに対してコメントを頂いたGOです。
lib/MT/Mail.pm 41行目のコメントアウトでは問題が解決しなかったのですが、もしかすると原因はもっと別のシンプルなところにあったのかも知れません。
実はずぅっと TypeKey が使えない状態だったのですが、サーバーに MIME::Base64 がインストールされていないためでした。
そこでこれをダウンロードして、[MT]/extlib/MIME/ に入れたところ、TypeKey が使えるようになっただけではなく、「コメントが書き込まれた」というメールが送られてくるようになりました。
subject は文字化け無し、本文は見事に化け化け(Linux サーバーで EUC のためですかね?)でしたが、ともあれメールが届きました。
もしかして、「コメントアウトでもダメ」というほかの方々も、僕と同じ理由という可能性があるかもしれません。
MT インストール時に MIME::Base64 に関する注意は表示されていましたが、気にしなくても良いのだと思っていました。
色々とお心遣い、ありがとうございました。
GOさん、こんにちは。
このトラブルに関して、GoogleやYahooが検索結果の上位に僕のブログを表示するため、たくさんの方から問い合わせがありました。今回のGOさんの情報もとても有用なので、追記という形で紹介させていただきます。
ご連絡ありがとうございます。
すいません・・・重複トラックバックしてしまいました・・・
他ページへのトラックバックがタイムアウトしたので、
つい再度、送ってしまいました。
お手数ですが、削除お願い致します。
PS: この問題の解決に、hiroさんの記述やトラックバック群を大変参考にさせていただきました。
ありがとうございました(>皆様)。
naokiさん、初めまして。重複トラックバックは削除しました。どうやら僕の使用しているサーバの反応が遅いためにタイムアウトしてしまう見たいですね。
ブログも拝見しました。この件では皆さんお困りのようですね。検索エンジンがここを拾い上げるので、僕もきちんとフォローアップしないと。
MT::App::Commentsにバグがあるようです。
349行目に「if ($comment->visible) {」という記述があり、これでコメントを保留にするかどうか判定しているようで、
メールを送る処理が保留しない方にしかありません。
そこで、349行目のif文に対応するelseを追加して
356行目と360行目~372行目までをコピーすれば、コメントを保留にするにしてもメールがくるようになりました。
chankenさん、初めまして!ブログのほうも拝見しました。どうやらいろいろな原因があるみたいですね。もう少ししたらまとめてみたいと思います。コメントを保留にするとメールが送られていなかったというのは、僕が抱えていた問題とは別でしたね。それにしてもMT3.15はお騒がせバージョンだ・・・。
おかげでこのエントリ、ますます引き合いが多くなってますけれど(笑)。
貴重な情報、どうもありがとうございました。