MTA(メール転送エージェント)とは

画像

MTA(Mail Transfer Agent)は、電子メールをサーバー間で転送する役割を担うソフトウェアです。宛先サーバーでメールを最終的にローカルのメールボックスへ配送する処理は、MTAに組み込まれたローカル配送機能、またはMDA(Mail Delivery Agent)が担います。ユーザーがメールを作成・閲覧するために使うメールソフト(MUA、Mail User Agent)とは役割が異なり、MTAはサーバー側でメールの受け渡し・配送処理を行います。SMTPのポート番号(25番等)や、POP3・IMAPによるメール受信の仕組み自体の詳細は「ネットワークの基礎」の技術解説記事で扱っているため、本記事ではMTAが提供する、エイリアス・転送設定・基本的なメール操作コマンドに絞って解説します。

Linux環境で広く使われているMTAには、後述するpostfix・sendmail・eximなどがあります。/etc/aliases・~/.forward・mailqなどは代表的な仕組み・コマンドですが、利用できるかどうか、書式、提供形態はMTAやディストリビューションによって異なります。mailはMTA本体とは別に提供されるメールクライアントです細部の実装(設定ファイルの保存形式や、エイリアスをデータベース化する具体的な手順等)はMTAによって異なります。資格試験では、特定のMTAの詳細な設定方法だけでなく、これらの基本概念も問われます。[1]。

電子メールのエイリアスを作成する

/etc/aliasesの基本構文

エイリアスとは、あるメールアドレス(多くの場合、ローカルユーザー名)宛てのメールを、別の宛先へ転送するための仕組みです。システム全体に適用されるエイリアスは、管理者権限で/etc/aliasesファイルに設定します。

name: value1, value2, ...

nameにはローカルの宛先名(ドメイン部分を含まないユーザー名等)を指定し、valueには転送先を指定します。1つのnameに対して、カンマ区切りで複数の転送先をまとめて指定することもできます。

valueの指定方法内容
メールアドレス指定したアドレスへ転送する
/file/name指定したファイルへメールメッセージ(ヘッダと本文)を追記する
`command`
:include:/file/name指定したファイルに列挙されているアドレス一覧へ転送する(メーリングリスト等で利用)
root:     admin@example.com
sales:    alice, bob, :include:/etc/mail/sales-list
backup:   "|/usr/local/bin/backup-notify.sh"

システムの一部のプロセス(cronジョブ等)はroot宛てに通知メールを送ることがあるため、root宛てのメールを実際に読む管理者のアドレスへ転送する設定は、実務でもよく使われます。

newaliasesコマンド

/etc/aliasesはテキストファイルですが、SendmailやPostfixなど多くのMTAは高速に検索するため、このテキストファイルをもとに作成した索引形式のデータベースファイル(/etc/aliases.db等)を参照してエイリアスを解決します。このような索引形式のデータベースを参照するMTAでは、/etc/aliasesをテキストエディタで書き換えただけでは、この索引ファイルには反映されません。 変更を反映させるには、newaliasesコマンドを実行して索引ファイルを再構築する必要があります。

newaliases

索引形式のエイリアスデータベースを使用するMTAでは、「/etc/aliasesを編集したのにエイリアスが効かない」という典型的なトラブルの原因は、このnewaliasesの実行忘れであることが多いため、資格試験でも頻出のポイントです。

電子メールの配送設定をする

~/.forwardによるユーザー単位の転送設定

/etc/aliasesが管理者によるシステム全体の設定であるのに対し、~/.forwardは、各ユーザーが自分自身のホームディレクトリに置くことで、自分宛てのメールの配送方法を個人の権限で設定できるファイルです。利用できる転送先の種類や複数指定の記法はMTAによって異なりますが、メールアドレスやコマンドなどを指定できます。

alice@newdomain.example.com
"|/home/alice/bin/filter.sh"

~/.forwardによる配送処理は、そのユーザー自身の権限で実行されます。また、~/.forwardファイル自体が本人以外に書き換え可能な状態になっていると、第三者に配送先を書き換えられてしまう恐れがあるため、多くのMTAは、このファイルの所有者やパーミッション(他ユーザーからの書き込み権限が無いか等)を確認したうえでのみ内容を有効にします具体的にどこまで厳密にパーミッションを検査するかはMTAの実装によって異なりますが、「~/.forwardは本人以外が書き換えられない状態にしておく」という基本的な考え方は共通しています。[2]。/etc/aliasesと~/.forwardは、どちらも書式は似ていますが、「誰が設定する仕組みか(管理者 or 利用者本人)」という役割の違いを混同しないようにしてください。

mailコマンドによるメールの送信

mailコマンド(mailx・s-nail等の実装が使われることもあります)は、コマンドラインから簡易にメールを送信・閲覧するためのコマンドです。

オプション内容
-s 件名メールの件名を指定する
-c アドレスCc(カーボンコピー)の宛先を指定する
-b アドレスBcc(ブラインドカーボンコピー)の宛先を指定する
mail -s "バックアップ完了通知" -c admin@example.com alice@example.com

対話的に実行した場合、本文はコマンド実行後にキーボードから入力し、行の先頭に.(ピリオド)のみの行を入力するか、Ctrl+D(EOF)で入力を終えて送信します。シェルスクリプト等から非対話的に使う場合は、標準入力からリダイレクトして本文を渡すのが一般的です。

echo "バックアップ処理が完了しました。" | mail -s "バックアップ完了通知" admin@example.com

mailqコマンドによるメールキューの確認

送信されたメールは、宛先のサーバーへ即座に配送できるとは限らず、一時的にMTA内部のメールキューに蓄積されることがあります(宛先サーバーが応答しない場合等)。mailqコマンドは、このメールキューに残っている、まだ配送が完了していないメールの一覧を表示します。

mailq

表示される内容には、キューID・メッセージサイズ・受付日時・差出人・宛先に加えて、直前の配送試行が失敗していた場合はその理由も含まれます。mailqはキューの状態を確認するだけのコマンドであり、メールの送信そのものを行うコマンドではない点に注意してください。

sendmail互換コマンドという考え方

mailqやnewaliasesは、名前だけを見るとPostfix固有のコマンドのように見えますが、実際には歴史的に主流だったSendmailが提供していたコマンド体系(sendmail本体に加えてmailq・newaliases等)を踏襲した、互換コマンドとして提供されています。Postfixはこのようなsendmail・mailq・newaliases互換コマンドを提供しています。一方、Eximなどでは、ディストリビューションによって互換コマンドが提供される場合があるほか、exim -bpやexim -biのようなMTA固有の呼び出し方を使う場合もあります例えばPostfixでは、sendmailコマンドは実体としてはPostfix独自の処理を呼び出しますが、Sendmail時代からの主要なコマンドラインオプション(メッセージヘッダから宛先を抽出する-tや、mailq相当の動作をする-bp等)をそのまま受け付けるようになっています。[3]。このように、互換コマンドを利用できる環境では、MTA本体を入れ替えても周辺のコマンド体系を共通化できます。

一般的に使用可能なMTAプログラムについて知っている

出題範囲には「一般的に使用可能なMTAプログラムについて知っている」とあり、基本的なSMTP設定も対象です。ここでは、各MTAの詳細な設定方法(postfixのmain.cf、sendmailのsendmail.cf、eximのexim.conf等)は扱わず、それぞれがどのようなソフトウェアかという概要レベルの知識にとどめます。

MTA概要
Sendmail1980年代前半にUC BerkeleyのEric Allman氏が開発した、歴史上もっとも古くから使われてきたMTAの1つです。1990年代にはインターネット上のメールサーバーの大多数がSendmailを使用していましたが、設定ファイル(sendmail.cf)の複雑さが以前から指摘されてきました。
Postfix1990年代後半にIBMのWietse Venema氏が、Sendmailに代わるセキュアで高速・管理しやすいMTAとして開発したソフトウェアです。多くの主要ディストリビューションで既定のMTAとして採用されています既定のMTAはディストリビューションのバージョンや設定によって変わり得るため、「常にPostfixが既定である」と断定はできません。あくまで広く採用されている代表例の1つとしてご理解ください。[4]。
Exim1995年にUniversity of CambridgeのPhilip Hazel氏が開発したMTAです。Debianで既定のMTAとして長く採用されてきましたこちらもディストリビューションのバージョンや設定によって既定が変わり得る点は同様です。[5]。
QmailDaniel J. Bernstein氏が開発した、セキュリティを重視した設計で知られるMTAです。Sendmail、Postfix、Eximと並んで、代表的なMTAとして挙げられます。

いずれのMTAも、同じIPアドレス上で通常のSMTP用ポート(25番)を同時に待ち受けられるのは通常1つのMTAだけです。「複数のMTAを同時に本番稼働させる」ことは通常想定されておらず、あるMTAから別のMTAへ乗り換える際は、既存のMTAを停止したうえで新しいMTAをインストール・有効化する、という運用になります。


補足

  1. 細部の実装(設定ファイルの保存形式や、エイリアスをデータベース化する具体的な手順等)はMTAによって異なります。資格試験では、特定のMTAの詳細な設定方法だけでなく、これらの基本概念も問われます。 ↩
  2. 具体的にどこまで厳密にパーミッションを検査するかはMTAの実装によって異なりますが、「~/.forwardは本人以外が書き換えられない状態にしておく」という基本的な考え方は共通しています。 ↩
  3. 例えばPostfixでは、sendmailコマンドは実体としてはPostfix独自の処理を呼び出しますが、Sendmail時代からの主要なコマンドラインオプション(メッセージヘッダから宛先を抽出する-tや、mailq相当の動作をする-bp等)をそのまま受け付けるようになっています。 ↩
  4. 既定のMTAはディストリビューションのバージョンや設定によって変わり得るため、「常にPostfixが既定である」と断定はできません。あくまで広く採用されている代表例の1つとしてご理解ください。 ↩
  5. こちらもディストリビューションのバージョンや設定によって既定が変わり得る点は同様です。 ↩