ハウツー:Sendmailの代わりにシンプルなsSMTPを使う
MTA(Mail Transfer Agent)として知られるアプリケーションは、はるか昔に、つまりインターネットでSMTP(Simple Mail Transfer Protocol)が標準規格化されるよりも前に、メールの処理やメール配信のための最適なルートの決定を手助けするものとして設計された。そのようなもっとも初期のMTAの一つがSendmailで、複数のネットワーク間でのメールの配信をするために非常に普及した。Linuxが広まりつつあった当時、Sendmailはメール配信用のオープンソースソフトウェアとして唯一実用的なものだったため、多くのLinuxディストリビューション上で提供されるデフォルトのMTAになった。
メールの処理はこれまでも常に分業化されていて、MTAがメールの配信を受け持つのに対して、ユーザがメールを作成/管理するのにはGNOMEのEvolution、KDEのKMail、MozillaのThunderbirdなどといったMUA(Mail User Agent)が使われる。MUAはメールの配信については最初のステップのことだけしか把握していない。言い換えると、MUAは最終的なメールの宛先にメールが届くまでのことを知っているわけではなく、通常はサーバ上にある特定のMTAにメールを届ける(その後MTAが最終的な宛先までのメール配信を担当する)方法について把握しているだけだ。
メール経由で警告を送るcronジョブや何らかの自動化システムを使用している場合、システムがメールの送信にデフォルトで使用することになるのはSendmailだ。これは、Linuxシステムのmail
コマンド(通常は/bin/mail)が使用するデフォルトのMTAがSendmailであるためだ。そのためそのようなメールもISPのメールサーバから受け取るためにはメールリーダの設定を行なうだけでなく、Sendmailの設定も行なう必要があるということになる。
残念ながらSendmailの設定は非常に煩雑なため、ベテランユーザでもできることなら避けて済ませたいという代物だ。そのためSendmailは、普通のデスクトップユーザにとって理想的なツールだとは言い難い。
Sendmailの代替物として普及しているMTAにはQMailとPostfixの2つがあって、どちらも当初はシンプルなMTAだったものの、自ずと複雑なシステムへと変化し、今では単に手元のマシンからISPまでメールを送りたいというだけの普通のデスクトップユーザのニーズをはるかに越えた機能が備わっている。その他にも、elmやpineなど/bin/mail以外のツールに直接SMTPを扱わせてメールを送信するようにするという方法もあるが、これらはフル装備のMUAクライアントなので、ISPにメールを届けるというメインの目的にとってはオプションがあまりに多すぎオーバースペックだ。
シンプルな方法:sSMTP
sSMTP は、複雑なSendmailの代わりに使用することができるシンプルなツールだ。上記のような代替物とは違って複雑ではない。sSMTPを使えば、SMTPに関する設定をもっとシンプルで小さな設定ファイルで置き換えることができる。この設定ファイルでは、リモートのSMTPサーバ、認証情報(ユーザ名とパスワード)、送信メールに表示する送信元ドメインなどをメールリーダの設定と非常に似た感じで設定することができる。
sSMTPは、各ディストリビューションのパッケージマネージャ経由でインストールすることもできるし、ソースから構築してインストールすることもできる。後者の場合は、ソースパッケージを展開した後、ソースコードのあるディレクトリに移動して「./configure --prefix=/usr/local/ssmtp --enable-ssl --enable-md5auth
」をコマンドラインで実行すれば良い。このようにしてSSLとMD5Authを有効にしておけばSMTPのログインが必要なISPとのやり取りを行うことができる。また必要ならIPv6のサポートも有効にすることができる。詳しくは--help
を参照しよう。
設定が完了したら、通例のmake
コマンドとsudo make install
コマンドとを使用してパッケージの構築とインストールをする。installコマンドを実行すると、いくつかの項目を入力するように求められるので、表示された指示に従えば良い。インストールが完了すれば、/usr/local/ssmtpというディレクトリが作成されていることと、sbinサブディレクトリの中にsSMTPのバイナリ、etc/ssmtpサブディレクトリの中に設定ファイルがそれぞれあることを確認できるはずだ。
この時点でSendmailを終了して、sSMTPと置き換えることができるようになった。System Vのinitスクリプトを使用しているLinuxディストリビューション(最近のディストリビューションはほとんどが使用している)上でSendmailを終了するには、service
コマンドを使うと良いだろう。
sudo service sendmail stop sudo chkconfig --levels 2345 sendmail off
一つめのコマンドは、その時点で実行中のSendmailのインスタンスを終了する。二つめのコマンドは、リブート時にSendmailが再び起動しないようにする。手元のLinuxディストリビューションがSysVInitパッケージを使用していない場合は、「sudo killall sendmail
」などのコマンドを手動で実行してsendmailのプロセスを終了する必要があるだろう。
Sendmailを置き換えるには単に、Sendmailを別のファイル名でバックアップしておいた上で、sendmailからsSMTPへのシンボリックリンクを作成すれば良い。
sudo mv /usr/sbin/sendmail /usr/sbin/sendmail.orig sudo ln -s /usr/local/ssmtp/sbin/ssmtp /usr/sbin/sendmail
一つめのコマンドは、元のsendmailを邪魔にならないように別のファイル名(sendmail.orig)にする。二つめのコマンドは、システム上のプログラムがsendmailを呼び出した際にsSMTPが実行されるようにしている。こうしておけば、sSMTPを使用していて何か問題が起こったとしても、シンボリックリンクを削除して、名前を変更しておいたsendmailのファイルを元の名前に戻すだけで良い。
設定
sSMTP用の設定ファイルの場所は、上記でsSMTPをソースコードから構築する際にconfigureコマンドで使用した--prefix
で指定したディレクトリの下となり、今回の場合は/usr/local/ssmtp/etc/ssmtp/ssmtp.confとなる。 この設定ファイルには、デフォルトでは4つのよく使われるオプションが含まれているだけだが、後からいくつか認証用のオプションを追加することもできる。
sSMTPを試しに構築してみると、私の環境では次のような設定ファイルが作成された(先頭に「#」記号がある行はコメント行)。
# /etc/ssmtp.conf -- a config file for sSMTP sendmail. # # The person who gets all mail for userids < 1000 # Make this empty to disable rewriting. root=postmaster # The place where the mail goes. The actual machine name is required # no MX records are consulted. Commonly mailhosts are named mail.domain.com # The example will fit if you are in domain.com and you mailhub is so named. mailhub=mail # Where will the mail seem to come from? #rewriteDomain=graphics-muse.org # The full hostname hostname=kepler.graphics-muse.org
root=
の値は、cronジョブのエラー出力やログファイルの分析など、システムによって生成されたメールのすべてを受け取るためのメールアドレスに変更しよう。私の場合、この行は自分の個人用メールアドレスに変更した。
mailhub=
には、メールが送信されるべきSMTPサーバを定義する。この行には、メールリーダにSMTPサーバとして指定しているホストを指定しよう。
hostname=
には、メールの受信者に見せたいメールホストの名前を指定する。例えば私の場合、メールに対する返信はメールリーダを使って受信することができるようにISPのドメインに送って欲しいので、この行にはISPのドメインを指定した。このドメインは、外部に向けて送信するすべてのメールのドメイン部分になる。つまり、システム上の全ユーザからのメールはこのドメインから送信されたように見える。
rewriteDomain=
は、送信元を別のドメインに見せかけるために使用することができる。私の場合はすでにhostnameの行でサーバのアドレスを詐称しているので、この行はコメントのままにしておいた。
自動生成直後の最初の状態の設定ファイルには、認証が必要なSMTPサーバにログインするための情報は含まれていない。この情報は、ISP経由でメールを送信するためにメールリーダに指定する必要がある情報と同じ内容だ。この情報を指定するには、以下のような行を追加すれば良い。
AuthUser=ユーザ名 AuthPass=パスワード AuthMethod=CRAM-MD5
上記のように設定しておくと、システムが/bin/mailを使用してメールを送信する度に、実際にはsendmailに置き換わっているsSMTPが呼び出されて、sSMTPが設定ファイルで指定された認証情報を使用してISPのSMTPサーバにログインして外部ホスト宛のメールを送信する。
注意点
SendmailをsSMTPに入れ替えるのが有効なのは、ユーザが一人しかいないデスクトップPCの場合だ。ユーザが複数人いる場合にはsSMTPは使用しない方が良いかもしれない。というのもデフォルトでは、mailコマンドで送信されるすべてのメールが一人のユーザから送信されたものであるように見えるためだ。revaliasesという設定ファイルを追加して利用すれば、送信メールの特定のFrom: アドレスに対して特定のローカルユーザを割り当てて、特定のメールサーバ経由でそのメールを送るということは可能だ。しかし認証情報が必要なサーバの場合には、異なる認証情報を使用する異なるメールサーバ上で異なるログインをするように設定する方法というものは存在しない。つまりsSMTPでは、外部に送信するメールについて接続することができるリモートのMTAは基本的には一つだけと考えた方がいいだろう。
またシステム上の全ユーザがsSMTPを使用するためには全ユーザがssmtp.confファイルの読み取り権限を持っている必要があるということだが、誰でもが読むことのできる設定ファイル内にISPのログイン情報を書くということは、システム上の全ユーザがあなたのメールの認証情報を知ることができるということだ。繰り返すが、このことからも、sSMTPはシステム上にユーザが一人しかいないホームユーザにのみ向いていると言える。なおこの問題についてはユーザとグループを適切に設定した上でsSMTPをsetuidプログラムとして実行することで対処することもできるが、そのようなことをするのは、そもそもの目的であった、できるだけシンプルにするということに反することになるだろう。
sSMTPはSendmailの代わりになるが、完全に置き換わるわけではない。重要な違いの一つは、Sendmailとは違ってメールの受信を行うことはできないという点だ。メールをISPから受信して読むためには、メールリーダを使用する必要がある。
またsSMTPはメールのキューを管理しないため、送信メールを即座に配信しようとするという違いもある。なおsSMTPのマニュアルページでは、Sendmailがサポートしているものと同じコマンドラインオプションがすべて表記されているが、実際にはsSMTPはそれらのオプションのほとんどを無視するだけだ。
最後に、sSMTPの実装上、送信メールのヘッダの容量には制限が設けられている。そのため、あまりに長い受信者リストやあまりに長いサブジェクトは含めないようにしよう。多数の受信者に対してメールを送信する必要がある場合には、すべての受信者をコマンドラインで手動で列挙するのではなく、エイリアスを設定すれば良い。
sSMTPは、その名の通り「シンプル」だ。設定には最低限の作業しか必要ではなく、長期的な保守もほとんど(あるいはまったく)必要ない。とは言えsSMTPはあらゆるユーザにふさわしいわけではなく、マシン上にユーザが一人しかいない場合の、技術者ではないホームユーザに対して最大の価値を発揮する。そのようなユーザにとってsSMTPは、メール管理を向上させるための簡単な方法となり得る。
Michael J. Hammelは、コロラド州コロラドスプリングズを拠点とするCEI(Colorado Engineering, Inc.)のソフトウェアエンジニア長。ソフトウェア開発/管理における20年以上の経験があり、様々なオンライン/紙媒体の雑誌で100を越える記事を執筆してきた。GIMP関連の3冊を含む、オープンソース関連の複数の書籍の著者。