オフィシャルサイト: Sendmail.org
参考文献: Mail Adminitration Guide (docs.sun.com),
TCP/IP Network Administration (unix.org.ua)

Sendmail

Sendmail の設定ファイル sendmail.cf を読み解くのに必要な基礎知識を、要点だけ掻い摘んでまとめてみた。設定するために勉強しただけなので、いつものような深くつっこんだ検証を経ていないことはお断りしておかなければならない。

Table of Contents

sendmail.cfの基本

CFファイル記述の基本原則

マクロとクラス

以下のようにしてマクロやクラス (ともに一種の変数ともいえる) が定義できる。セットした変数を参照するには $ を使う。例えば、マクロ X にセットされた値を別のディレクティブの中で参照して展開するには、$X のように書く。通常、マクロ値の展開は Sendmail が cf を読む時即座に行われるが、$&X のように & を挟むと、展開をその評価時まで遅らせることができる (Makefile の =:= の違いに似ている)。

Macro

書式 説明
DXval マクロ Xval という文字列をセットする。
LXkey マクロ X に、sendmailvars (通常 /etc/mail/sendmailvars ファイルから読み取られる変数群) の中の変数 key にセットされている値をセットする。
予約済みマクロ名

以下のマクロ名 (上記の X に当たる部分) は sendmail によってあらかじめ定義されている。参照時の表現($付き)で示す。

書式 説明
$a オリジネーション日時 (その処理プロセスの開始日時?) を RFC822 の書式で表したもの
$b 現在の日時を RFC822 の書式で表したもの
$c ホップカウント
$d UNIX (ctime) フォーマットで表現した日時
$e SMTPセッション開始時に現れる文字列
$f メール送信者のエンベロープFrom アドレス
$g メール送信者のエンベロープFrom アドレス。受信者アドレスからの相対表示
$h メール受信ホスト
$i キューID
$j この sendmail が動作しているホストのFQDN
$k UUCPノード名。つまり uname の出力
$l UNIX From のフォーマット
$m gethostname() から得られるホスト名のドメイン部
$n デーモン名。エラーメッセージに使用される
$o トークンの区切りとして認識される文字のリスト (operator chars)
$p sendmail のプロセスID
$q 送信者のメールアドレスのデフォルトフォーマット。つまり、こうであるべきだという書式
$r 使用するプロトコル
$R デフォルトリレー
$s メールを送信してきたホストのホスト名
$S @domain を持たない From: アドレスにデフォルトで補完するドメイン名
$t 現在日時を数字だけで表したもの
$u 受信ユーザ
$v sendmail のバージョン
$Z sendmail のバージョン
$w このサイトのホスト名
$x 送信者の完全な名前(メールアドレス?)
$Y ANOTHER_ADDRESS。def や mc でこれを定義すると、マクロ言語処理によって cf に `smtp2' メーラーの定義が作成され、このドメインが smtp2 メーラーのデフォルトドメインになる
$z 受信者のホームディレクトリ
$- 評価後の送信者アドレス
$? 正確にはマクロというよりもステートメントに近い。これは条件分岐の開始マーク。条件分岐の最後は $. で締めくくる。例えば `$?x$K$.' は、マクロ x に値がセットされていたらマクロ K の値を返す
$. 上記 $? を参照
$| これも条件分岐の一部で、 else を示す。例えば`$?x  hello $| bye $.' は、マクロ x に値がセットされていれば文字列 hello を返し、そうでなければ bye を返す

以下の $ 類はマクロとは似て非なるメタシンボル(Metasymbol) と呼ばれるもので、アドレスリライティングの章で述べる;

$*, $+, $n, $>n, $@, $#mailer, $@host, $:user, $[host$], ${X name$}

Class

マクロとの違いは、クラスは単一の値でなくリストである点。アドレスリライティングの過程でアドレスの@左辺でマッチする文字を見つける時などに使用される。参照する際には、クラス名に $= を付けるとそのクラスのメンバが OR で肯定評価され、$~ を付けると否定評価 (「このクラスにないものにマッチ」) される。詳しくはアドレスリライティングの章で述べる。

書式 説明
CC val1 val2 ... クラス C に値 val1val2 と ... をセットする。
FCfile [pattern] クラスC に、ファイル file から読み取った値のリストをセットする。内部的には、読み取りには scanf() が使用されるようだ。 pattern も指定された場合には scanf() に読み取りフィルタ(?) として渡される。パターン記述については scanf のman参照。
FC | cmd クラス C に、コマンド cmd の実行結果によって得られた値のリストをセットする。
GCkey クラス C に、sendmailvars の中の key 変数の値をセットする。
予約済みクラス名

以下のクラス名(上記の C に当たる部分) はあらかじめ定義されており特別な意味を持つ。当然ながら、これらも全てリストである。参照時の表現のひとつである $= 付きで示す。

書式 説明
$=w このホストの名前。とにかく sendmail の知っている、このホストを指す名前(エイリアスなど含む?) 全部
$=m このホストのローカルドメイン名。複数あればそれらすべて
$=e この sendmail サーバでサポートしている Content-Transfer-Encoding: MIMEフォーマット
$=k このホストの UUCPノード名
$=n 7-bit, 8-bit エンコードしてはならない MIMEの body タイプ。初期値は multipart/signed
$=q Base64 エンコードしてはならない Content-Type: MIMEタイプ。初期値は text/plain
$=s 再帰的に処理されるべき MIME の message サブタイプ。初期値は rfc822
$=t 信頼するユーザのリスト

その他のコマンド文字

書式 説明
Oopt=val sendmail の動作オプション opt の設定。
Pname=val precedence: (優先度) フィールドに文字列 name が現れた場合の優先度を符号付き整数 val (マイナスの値も採りうる) に設定する。TCP/IP Network Administration - sendmail Configuration の 10.5.6 Defining Mail Precedence の項参照。
Tuser1 [user2 ...] 信頼するユーザのリスト。ただし、このクラスは旧式で、今では使えない。
Mname, field1=value, field2=value, ... メーラーの素性を定義する。Sendmail で言うメーラーとは、localprogsmtpesmtp など、配送に使用する仕組みのこと。fieldsendmail であらかじめ決められているプロパティ名で、P, F, T など。value はそのプロパティにセットする値。更なる説明は次項 Mailerについて 参照。
H[?flag?]header: format ヘッダフォーマットの定義。ヘッダ (例えば Return-Path: ヘッダ) に formatで示すフォーマットを採用する。format は 固定の文字列やマクロを組み合わせて記述できる。 ?flag? 部は省略可能で、これは上記 M コマンドの F フィールドでメーラーに指定したフラグと合致するかどうかの評価。書いた場合は、そのフラグを持つメーラーに対してのみこのヘッダフォーマットが採用される。 ?flag? を書かなければ全てのメーラーに対して採用される。
Vlevel[/vendor] cf の言語バージョンレベルと、それに対して拡張/カスタマイズした部分があればその定義元ベンダー。
Kname type [arg] データベース name の定義。type はそのデータベースのクラスタイプ、省略可能な arg には通常そのデータベースへの ファイルPATH が指定される
Rpattern transform comment アドレスリライティングルール。次章で述べる。
Sn アドレスリライティング・ルールセットの定義開始宣言。次章で述べる。

Mailer定義について

上の表の説明にも書いたが、sendmail.cf で言うメーラーとは、クライアントのメールリーダー/センダーのことではなく、Sendmail が配送に使用するプログラムや仕組みのこと。性質の組み合わせによって定義した処理概念のセット といったほうが当たっているかもしれない。TCP/IP Network Administration - sendmail Configuration の `10.5.8 Defining Mailers' の項に詳細な説明がある。

主な Mailer の種類
Name 説明
prog メールをプログラムに渡す。prog メーラーは必ず定義しなければならない
local この sendmail サーバ上のユーザへローカル配送する。local メーラーは必ず定義しなければならない
file ファイルへ流し込む。sendmail が内部的に定義するので定義する必要はない
include :include: リストに処理を委ねる。sendmail が内部的に定義するので定義する必要はない
任意の名前 その他のメーラーは任意の名前で定義することができる
Mailer定義のフィールド

フィールドの種類は以下。全てのフィールドを設定しなければならないわけではない。記述例はデフォルト値とも限らず推奨値でもない、単なる例だ。

フィールド名 説明 記述例
P そのメーラーへのPATH P=/bin/mail
F 動作様式や性質を示すフラグ。次表 Mailerフラグ 参照 F=lsDF
S 送信者 (Sender) のアドレスを処理させるオプションルールセット。S=16 という風に単一のルールセットを指定することも可能だが、右の例のようにスラッシュを使ってふたつ並べると、エンベロープFrom にはルールセット 16、コンテントFrom を 25 という具合に別々に指定することができる。Sフィールドで指定したルールセットは、デフォルトのルールセット 1 とルールセット 4 の間で評価される S=16/25
R 宛先 (Recipient) のアドレスを処理させるオプションルールセット。上記 S フィールドと同様に、例のようにスラッシュで分けるとエンベロープの rcptto とコンテント To に別々のオプションルールセットを巡らせることができる。Rフィールドで指定したルールセットは、デフォルトルールセット 2 とルールセット 4 の間に評価される R=31/26
A そのメーラープログラムに渡す引数。通常、例のようにマクロから展開される値 (右の例の $u はユーザ名) を含む A=sh -c $u
E 改行コード。デフォルトは \r\n つまり CRLF E=\r\n
M 扱えるメッセージボディサイズの上限 (単位:バイト)。デフォルトはどうやら 1000000 つまり 1MB らしい。ちなみに、どのメーラーと限らずあらゆる ESMTP メッセージに対して受信制限値を一括指定したい場合には、メーラー定義でなく O コマンドを使って `O MaxMessageSize=xxx ' を記述する方が手っ取り早い M=1000000
L メッセージの 1行に収まる文字数。MIMEのある今でこそ任意に指定することも可能だが、(Eの付かない)SMTPの場合は規格的に 80 文字が上限だった L=100
D メーラープログラムのワーキングディレクトリ。コロン (:) で区切って複数のディレクトリを指定することも可能 D=/var/mail
U そのメーラーをこの UID:GID で実行する。指定しなかった場合には `O DefaultUser=x:x ' で設定した UID 及び GID が用いられる U=uucp:wheel
N NICE値 N=10
C 8-bit MIME キャラクタの文字コードセット。MIMEメールにのみ意味を持つ。指定しなかった場合には `O DefaultCharset=xxx ' で設定されてた文字コードが用いられ、それも定義されていない場合には unknown8-bit になる C=iso8859-1
T MIME に関するエラーメッセージに用いる MIME情報タイプ。値は、スラッシュで隔てられた 配送エージェントのタイプメールアドレスのタイプエラーコードのタイプ の 3つのフィールドから成る。MIMEメールにのみ意味を持つ。デフォルトは dns/rfc822/smtp T=dns/rfc822/smtp
Mailerフラグの種類 (Fフィールドに指定)
フラグ 説明
C @を欠いたアドレスには @domain を付ける
D Date: ヘッダが必須
E メッセージの行のうち、 From: で始まる行には > を付ける
e expensive なメーラー
F From: ヘッダが必須
f 信頼できるユーザからは -f フラグの使用を許す
h ホスト名の大文字を小文字に直さない
I 他の sendmail に対して SMTPプロトコル通信をする能力がある
L 1行の文字数を RFC821 に準拠させる
l local メーラーである
M Message-ID: ヘッダが必須
m ひとつのトランザクションで複数のユーザにメールを送れる
n UNIXスタイルの From: 行を挿入しない
P Return-Path: ヘッダが必須
R Use the MAIL FROM: return-path rather than the return address
r 信頼できるユーザからは -r フラグの使用を許す
S そのメーラーをコールする前のユーザID をリセットしない
s そのメーラーをコールする前にはアドレスのクォーテーションを取り除く
U UNIX: スタイルの From: 行を要求する
u ユーザ名の大文字を小文字に変換しない
X ドットで始まる行には頭にドットを足す
x Full-Name: ヘッダが必須