仮説の裏づけ

メール送信に失敗すると、他人のマシンを勝手に操り、代理でメール送信をするなどというキチガイじみた仕様を本当にMicrosoftはやっているのか?

というのを検証する為に、Outlook2007とExchange Server2003でちょっとした実験をしてみた。

まず設定がどうなっているかであるが、
Exchangeの差出人のメールアドレスはmain@xxxxxxx.co.jp
そして、規定になっているLinuxサーバの差出人も同じmain@xxxxxxx.co.jp

このメールアドレスが会社の窓口のアドレスで、皆で共有しているアカウントだ。
Exchangeはメールがお客様に届かない事や、お客様のメールがこちらに届かない事があるので、送受信には使用しない。メールを投げるのは規定のLinuxのサーバに投げるように設定してある。

ウィルスバスター2009のパーソナルファイアウォールで、OutlookのTCPのPort25と465の送信を警告するように設定。

Outlook2007で規定のアカウントから、個人宛noizumi@xxxxxxxx.co.jpにメールを送信する。すると、ウィルスバスター2009で警告が出たので拒否。

普通なら、これで絶対にわしの個人アドレスにメールが届く事はない。
しかし、思った通り、届いたね。

ヘッダを見ると、マシン名が入っていたが勿論、わしのマシン名では無く、他人のマシン。そのマシンのOutlookはそのマシンの所有者に内緒で、裏でわしの送ったメールを代理で送信したのだ。

5回程、送信してみたが、色んなマシンが送信を代わりにやってくれた。
ウィルスバスターでOutlookのTCPの送信を全て拒否にしてたから、UDPか何かで送信しているようだ。

MS-Exchange ServerとOutlookを使うと、他人に成りすまして変なメールの出し放題ができます:-)

さすがはMicrosoft。こんな狂ってるとしか言い様が無い仕様を平気で実装するとは恐れ入る。

Microsoftって給料高いから優秀な人材が集まっているはずだが、恐らく、「どんな有能も無能の下では役に立たない」ってヤツかな。

救いようが無いMS-Exchange ServerとOutlook

会社で、Exchange Small Business Server 2003とOutlook2003、Outlook2007という環境があるのだが、それの腐りっぷりがすごい。

1つのExchange Serverのアカウントを会社の窓口アカウントとして複数人で設定しているが、お客さんのメールが届かなかったり、送信したはずのメールが送信されていなかったりと、極めて信頼性が低い。

その為、フォルダにメールを貯めるだけで、送受信はLinuxのサーバという運用になっている。

そして、お客さん宛のメールが2〜7通同じ文面で送信されるという怪現象があり、 時折、わしのマシンでOutlook2007で設定した差出人名で送信されている事があり、わしの設定がExchangeに移ってるのか?という疑惑があった。

今日、Outlook2007のログを有効にしたところ、わしは送信していないのに、勝手にこっそり裏でメール送信したログが残っていた!? 状況を収集したところ、別部署でメール送信中クラッシュしたそうで、どうやらそのメールがわしのマシンで勝手に送信されたようだ。

この事から類推するに、メール送信失敗をExchangeが関知すると、送信不能を避ける為に、その同じアカウントを共有するマシンで、代替送信をしているのではないかと思われる。

想像だが、その代替送信の仕組みとして、Exchange Serverが「メール送信失敗したヤツがいる!」と騒ぐと、その騒ぎを嗅ぎ付けたクライアントが、我先にと勝手に代理送信し、事後報告するという仕組みである為、同じ文面のメールが何通も相手に届くのではないだろうか? という気がする。

これで、差出人がわしのメールがお客様に送信されている謎の一つが分かった。わしの設定がExchange Server経由で他のメールクライアントに伝播したのでは無く、わしのOutlook2007がExchange Serverの指令を受けて、裏でこっそり他人のメールを送信していたからだ。

そういえば、Exchange Serverに投げるとマズいメールアドレスの形式もクライアントのOutlookが勝手に変更するというのがあった。

恐らく、Exchange Serverの欠陥をOutlookで補おうとした結果、他人が送信失敗したメールを他のマシンで勝手に送信するなどという、腐った実装になっているのだろう。

心底呆れた。こんな実装絶対にありえん!

Progress bar 実装

PHPでファイルアップロード時に進捗を表示するProgress barの実装をやってたりする。

PHP5のAPC(Alternative PHP Cache)で、ファイル送信時の情報取得が使えるようになったのだが、サーバがPHP4のシステムで動いているので、PHP5に置き換えられない。

PHP4とPHP5の同居が必要なのと、Apacheでモジュールを組み込むにしても、mod_phpは4と5を同時に組み込む事ができないので、それぞれを組み込んだApacheを動かす必要がある。

通常動かしているApacheとは別にもう1個別portで動かして、特定のURL以下をreverse proxyで置き換えなんてトリッキーなやり方で動作環境は確保した。

で、Progress barのソースサンプルを入手して実装しようとしたのだが、非常に難解な組み方をしていて、「何かあるな」という感じはしていたのだが、別に気にせず、原理を理解して、Ajaxのprototype.jsを使ってコードを書いた。

しかし、safariでテストした時、全然動かない。
非同期通信で呼ばれるPHPスクリプトのアクセスログが発生せず、Progress barを表示するページで、formにAjax.requestの処理の入った関数が呼ばれているかを吐き出すようにしてみると、ちゃんと呼ばれている。

しかし、Ajax.requestの行だけ、全く無視された状態になっていた。サンプルだと動く。サンプルは、ページ遷移しないか、一部が遷移するようになっていて、非同期通信でAPCの情報を取得しているのは、遷移しない部分…。

ここで、サンプルがなぜ難解な方法で組まれているのか全てを理解した。
APCの情報を取るのに、一部のブラウザではページ遷移が起こる場合、Ajax.requestなどの非同期通信のjavascriptコードが一切動かなくなるのだ。

根本的に構造の見直しが必要で、ほとんど一から作り直し(笑)

まあ、なんとかでっち上げつつあるが、今はIE6で後方互換モードでないと表示しないとかしょうもないブラウザのバグの対処に当たっている。

暫く、SI業から遠ざかっていたから動向を良く知らなかったが、Microsoftは相変わらず、世間に迷惑をかける実装を続けていたのか。実にMicrosoftらしいと感心する事しきり(笑)。

PHP

IMAPのメールサーバをimapsyncというツールで複製を取っているが、フォルダに関しては、コピー元のフォルダが基準となり、コピー先に無ければ作成して中身をコピーという動作になっている。

コピー元のフォルダが削除されたらどうなるか?と言えば、コピー先のフォルダはそのまんま。つまり、長期間複製を取っていると、コピー元で削除されたフォルダが、コピー先でどんどん増えていくという困った状態になる。

IMAPのサーバの機能としては、メールだけは「何日以上古いものは消す」という事はできるが、フォルダは消せない。

空のフォルダが溜まって来るのを何とかしないといけないので、ツールを作る事にした。

socket openとか低レベルな関数組み合わせてゴリゴリ作らなきゃいけないのかと思ったが、PHPにはIMAP Clientなる便利な関数群があった。

フォルダツリーを辿って、子フォルダが無く、メールも入ってないフォルダを削除するってのを再帰処理で組んだが、socketとかバッファとか、文字列処理とか考えなくていいからすげー楽だ。

いい世の中になったものよのう。

Cyrus IMAPd

業務でCyrus IMAPdなんかと戯れている。

社内の業務で使っているExchange Serverが、お客さんのメールをバシバシBadMailに落とし、届かないという由々しき事態となっているので、捨てようという話で(笑)、代替環境を試験している。

しかし、pop3コネクタかExchange Serverの挙動は非常におかしい。

MIMEエンコードしてあるメールアドレスの名前部分をデコードしてから、メールアドレスとして正しいかを評価し、RFC違反だとしてBadMailフォルダに叩き落してくれる。しかも、それがpostmasterには通知されない。

喩えば、「(株)会社名<hoge@fuga.co.jp>」みたいなので、()内はメールアドレスではコメント扱いだが、( だけが削除されて、複数の変なアドレスに変換される。

これは、Outlookも変な仕様を継承していて、宛先などの行頭に ( が入っていると勝手に削除する。

()を全角にすり替えてやると通るのだろうが、そもそもSMTPでRFC違反にならないように、わざわざMIMEエンコードしているものを、なんでデコードした上に正しくないアドレスを創作して、評価するんだ?

「ユーザーは馬鹿だから、かしこいマイクロソフトが正しいRFCに準拠したアドレスに修正して、メールが不達になる最悪の事態を防ぎます」とでも言いたそうだな。

実際は、その蛇足のせいで、届いて当たり前のメールが届かなくなっているんだが、一体何を考えとるんだ?

MIMEデコードしているのは、恐らく、サーバーサイドのメールの振り分けの為だろうが、MIMEデコード前にメールアドレスが正しいのかをチェックして、それからMIMEデコードだろう。何でこんなクソな実装ができるのか理解に苦しむ…。

Cyrus IMAPdはさすがに軽くてパフォーマンスは良い感じ。しかし、sendmail、procmailと連携させるのに色々と調べないといけなかった。

古いドキュメントを見ると、色々と設定しなくてはいけないのだが、新しいsendmailになると、cyrus imapdとの連携が出来るようになっていて、sendmail.mcに2行書いて終わりとか簡単になっている。

procmailと連携させる場合だと、sendmail.mcはいじる必要が無く、/etc/procmailrcを作成すれば良いのだが、cyrus imapにメールを渡す時にヘッダ部にFrom: 以外のFromがあるとダメなので、formailで削除しておくとか、殆ど検索しても出てこないようなマイナーな設定をやらないといけないから苦労した。

余りコードをゴリゴリ書くような事は無く、殆ど設定弄って環境構築するシステムインテグレーションだから、楽でいいなあ。

Norton AntiVirus 2009

無償アップデートできるそうなので、入れてみた。

「信頼できるファイル」を何度もスキャンしない事で軽くなっていて、今まで完全スキャンがスケジュールでなされていたのが、アイドルタイムスキャンで、コンピュータが暇な時に行われるようになったそうだ。

わしはパソコンつけっぱなしなので、Norton AntiVirus 2008では、月曜早朝にいつも完全スキャンを行う設定にしてあったのだが、スケジュールによるスキャンを設定すると、アイドルタイムスキャンが無効になる。

アイドルタイムスキャンも「週ごと」というのが一番頻度が高い設定で、いつ行われるのかは分からない。インストールして8時間ほどになるが、アイドルタイムではスキャンされていないようだ。

うーむ。暫く放置しておくか。

マウス購入

マウスがクリックしただけで勝手にダブルクリックするようになってきたので、logicoolのV120 Laser Mouse for Notebookのマウスを購入。

ほほう。最近は Laser ですか。
光学式に比べると、勝手にマウスカーソルが移動する事も無いし、いい感じ。

モバイル用マウスは小さくてケーブルも細めで、買う時は大抵モバイル用を志向するのだが、このマウスを買って失敗したと思う事が一つ。それはケーブルが短い。

Let’s noteは左側にUSBソケットがあるので、ケーブルをパソコンの後へ回してマウスを右へ持ってくると、もうカツカツで余裕が全く無い。今度買う時は別のモデルにするか。

IRC daemonに接続できません

ircdに外部から接続できない障害が発生しております。

多分、ルータの設定のせいだと思うけど、家に帰るまで直せないなあ。

【追記】
直したけど、やっぱりルータで、DHCPで固定IPアドレスを振る機能が腐ってた。
自動でホストを検出して固定IPアドレスを振る機能があるのだが、ホストが認識できないと、浮動IPアドレスを振ってしまう。

MACアドレス指定で固定IPアドレスを振るようにしたので、もう再発しないとは思うが、いい加減古いので、良いルータに買い換えたいなあ。