SMTPサーバーを作る−その1−

SMTPサーバーを作る−その1−
作ればわかるアプリケーション
の動作とメカニズム
秋月巌ソリューション事務所
第
9回
秋月 巌
SMTPサーバーを作る−その1−
AKIZUKI, Iwao
http://www.akizuki.co.jp/
SMTPサーバー
のプロトタイプ
きるだけで、実際のメール送信は
を無視すればいい。
まだできない。通信部分は、前回
とはいえ、AMTサーバーは非同
紹介した非同期サーバープログラ
期マルチスレッドプログラムとして
今回から、SMTPサーバーを作
ムテンプレートで あるAMT サー
実装されている都合上、かなり複
る。今回のサンプルはまだメールク
バーを利用する。だから、通信部
雑な処理になってしまっているの
ライアントプログラムと対話がで
分のプログラミングに関しては、前
で、それを理解するには2005年11
回までの記事を参考にしてほしい。
月号・12月号の本連載の記事が参
この記事で は、あくまで S M T P
考になるだろう。
Level
1
2
3
4
5
サーバー固有の実装についてのみ
説明する。
プログラムはテンプレートであ
メールサーバーと
メールクライアント
Technology Tools
る AMT サーバーのイベントプロ
Visual Basic
シージャに記述するが、AMTサー
SMTPサーバーの動作に関して
Visual C#
バーは.NET Frameworkの非同期
は、漠然と理解している人も多い
Socket通信のアーキテクチャをそ
だろう。実を言えば、私もこの記事
のまま踏襲しているので 、AMT
のサンプルを書き始めるまで は、
サーバーを利用せずに、普通にプ
そうだった。で、実際にSMTPサー
ログラムを記述した場合と比べて
バーを作ってみて、事前に漠然と
あまり変わらない。だから、.NET
理解していた通りだったことを確
Frameworkの非同期Socket通信の
認した。
Visual C++
SQL Server
Oracle
Access
ASP.NET
Other:
Samples
この記事で取り上げたソースコードおよび
サンプルプログラムは、
http://www.shoeisha.com/mag/windev/
からダウンロード可能です。
知識があるならば、AMTサーバー
メール通信には複雑な文字コー
を使用して実装しているというこ
ドの問題がある。少し前まで、よ
とを無視してプログラムを読んで
く文字化けしたメールを受け取っ
も、ほとんど問題がないはずであ
た人も多いだろう。しかし、それは
る。処理を記述していないイベン
メールクライアントの問題であっ
トプロシージャがあるので、それ
てSMTPサーバーには関係がない。
2006 January 147
.NET Framework で作る Windows サーバー
作ればわかるアプリケーションの動作とメカニズム
単に、クライアントから受け取ったテキスト文字列を、
サーバーでもありクライアントでもあるという意味で、
ほとんど、そのまま別のサーバーに転送するだけである。
SMTPサーバーはP2Pアプリケーションだということも
添付ファイルのようなバイナリファイルもメールクライ
できる。それぞれのサーバーが、別のサーバーに対して
アントがテキスト文字列化しているから、メールサー
クライアントとなる構図は、P2Pアプリケーションの場
バーは何もする必要がない。テキスト文字列化されたバ
合と同じである。つまり、SMTPサーバーはSMTPサー
イナリファイルを元のバイナリファイルに戻すのも、も
バー間で、P2Pネットワークを形成する。
ちろんメールクライアントの仕事である。Webサーバー
通常のP2Pアプリケーションとの違いは、その各サー
とWebブラウザの関係同様、メールの場合もサーバープ
バーに対して、メールクライアントというクライアント
ログラムのほうがよっぽど簡単なのである。
専用の端末が接続されることである。このメールクライ
アントとSMTPサーバーの関係は純然たるクライアン
SMTPサーバーは
DNSクライアントである
ト/サーバーシステムである。つまり、P2Pネットワー
ところで、メールサーバーはメールアドレスのドメイ
いうことになる。WWW(ワールドワイドウェブ)は各
ン部分から、送信先のSMTPサーバーを検出するために
Webサーバーに保持されているコンテンツが、他のサー
DNSサーバーに照会する必要がある。メールアドレスの
バーへのリンクを持つことがあるが、サーバー同士は通
「@」マーク以降は、あくまでドメイン名であり、それだ
信し合わない。Webサーバー同士が通信し合えば、何か
けでは送信先のSMTPサーバーが特定できないからであ
おもしろいことができるのではないかと考えてみたが、
る。そこで、SMTPサーバーはDNSクライアントとなっ
とりあえず、いまは新しいアイデアは思いつかない。ロ
て、DNSサーバーに登録されているMXレコードを検索
ボット型検索エンジンは、ある意味ではWebクライアン
する必要がある。
ト機能を備えたWebサーバーということができるかもし
クの各ホストに、複数のメールクライアントがぶら下
がっているのが、メール通信のためのネットワークだと
で、その方法を調べていて初めて知ったのだが、DNS
れない。もちろん、ロボット型検索エンジンは、イン
クライアントが DNS サーバーに問い合わせる場合、
ターネットの歴史の中でもとくにすぐれたアイデアのひ
HTTPやSMTPのようにテキストベースで対話をしてい
とつのわけだから、やはり、Webサーバー同士が通信す
るわけではなく、
「DNSパケット」と呼ばれるバイナリ
れば、他にも何か、興味深いことができそうである。
データでやり取りをする。この部分は、事前に私がイ
Webネットワークが分散処理ネットワークだというこ
メージしていたものとは異なっていた。だから、当初は
とは、今までにも何度も書いてきた。リンクひとつで負
DNSサーバーとの対話方法を調べていて、そのためのコ
荷を別のサーバーに分散することができる。しかし、そ
マンドをインターネットで検索しても、なかなか見つか
の場合も通信処理自体はあくまでも常にWebブラウザ
らないのを不思議に感じていた。ちなみにこの部分は、
が中心である。Webサーバーが Webクライアントにな
サンプルプログラムではまだ実装されていないし、今後、
ることはない。
実装するかも未定である。
SMTPサーバーは
P2Pアプリケーションである
SMTPサーバーはサーバーアプリケーションであると
メールサーバーのための
新しいアイデアはないか
ところで、せっかくSMTPサーバーを作るのだから、
通常にはない新しい機能を付け加えたいと思うのだが、
同時に、SMTPクライアントでもある。メールクライア
これもとくに新しいアイデアが浮かばない。ポストペッ
ントから受け取ったデータを、相手先のSMTPサーバー
トは興味深いアイデアだったが、あれはメールクライア
に接続して送信するときはクライアントプログラムとし
ントの機能である。HTMLページを配信するだけだった
て動作するからである。ひとつのアプリケーションが
Webサーバーが進歩して、Webアプリケーションを開発
148 Windows Developer Magazine