home(h) links(l) memo(m) profile(r)
memo(m) unix関係(u) sendmail関係

メモ〜sendmail関係

よく知られ歴史のあるメール配信ソフトとしてsendmailがあるが、設定が難解。Postfixの方が設定しやすいらしい。

以下の記述は特に断りがなければCentOS 5.5環境でのものです。 Postfixについてはこちら

インストール

OSインストール時に選択していれば、既に入っているのでとりあえず省略(CentOS 5.3)。

バージョン確認

telnetが使える場合。

shell> telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 www.hoge.org ESMTP Sendmail 8.13.8/8.13.8; Wed, 26 Aug 2009 16:18:54 +0900
^] Ctrl + ] を入力
telnet> quit
shell> 
  

参考文献・サイト:

コンポーネントの場所

コンポーネント 場所 備考
sendmailのバイナリファイル /usr/sbin/sendmail 実体は/usr/sbin/sendmail.sendmail
起動スクリプト設定ファイル /etc/sysconfig/sendmail
コマンドnewaliases /usr/bin/newaliases 実体は/usr/sbin/sendmail
コマンドmailq /usr/bin/mailq 実体は/usr/sbin/sendmail
設定ファイルsendmail.cf /etc/mail/sendmail.cf
エイリアスファイル /etc/aliases sendmail.cf中に場所を記載。
設定ファイル構築場所 /usr/share/sendmail-cf/cf/ mcファイルからcfファイルをビルドする作業を行うディレクトリ。
Buildスクリプトのある場所。

設定

別名変換

受信人名を別の名前(エイリアス)に置き換えること。 一般的な名前(infoなど)を実際のユーザ名に変換したり、多数の名前に変換するメーリングリストのような用途に用いる。設定ファイルの場所・ファイル名はsendmail.cfOA行(またはO AliasFile)で規定される(例:OA/etc/aliasesO AliasFile=/etc/aliases)。

aliasesファイルは「検索名: 置換名」という形式で列挙される。大文字小文字は区別しない。#で始まる行はコメントとしてみなされる。この置換処理は置換先がなくなるまで繰り返し行われる。

【例】aliasesファイル
# Basic system aliases この2項目は必須
mailer-daemon: postmaster
postmaster:    root
    

メッセージキュー

メールの配信先サーバがダウンしているなど一時的にメール配信ができない場合、送信メールは一時的にキューディレクトリに保管される。そのキューディレクトリの設定はsendmail.cfOQ行(またはO QueueDirectory)で規定される(例:OQ/var/spool/mqueueO QueueDirectory=/var/spool/mqueue)。

キューディレクトリでは、ヘッダ部分と本文部分に分けて別々のファイルに保存される。名前がqfで始まるファイルはヘッダ情報、名前がdfで始まるファイルは本文。3文字目以降の部分は1つのメッセージで共通。

ローカル配信

sendmailは基本的に自身でメールを配信するのではなく、指定のプログラムに配信を依頼するという形をとる。その指定はsendmail.cfMlocal,Mprog行に記載される。Mlocalはメールボックスへの配信(ユーザのメールボックスファイルへの書き込み、/bin/mailが標準的)、Mprogは処理を渡すプログラム(シェル、/bin/shが標準的)に関する設定。

【例】sendmail.cf
Mlocal,  P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
         T=DNS/RFC822/X-Unix,
         A=procmail -t -Y -a $h -d $u
Mprog,   P=/usr/sbin/smrsh, F=lsDFMoqeu9, S=EnvFromL/HdrFromL, R=EnvToL/H
drToL, D=$z:/,
         T=X-Unix/X-Unix/X-Unix,
         A=smrsh -c $u
    

ネットワーク転送

受信先がローカルユーザではないとsendmailが判断した場合、メッセージは転送される。転送に関する設定はsendmail.cfファイルのMetherなどの行に記載される。

アクセス制御

(1)/etc/mail/access ファイルにアクセス制御情報を記載する。

accessファイルの書式は以下の通り。

送信元	処理内容
    

具体例は以下の通り。

spammer.com    550 Yaja!
hoge.spam.org  REJECT
www.safe.jp    OK
123.45         RELAY
    

1行目はエラーコード(550)をsendmailのエラー処理ルーチンに渡し、メッセージ(Yaja!)を送信元に送る。2行目は指定ホストからのメールを拒絶する。3行目は指定ホストからのメールを受け入れる。4行目は123.45で始まるIPアドレスからの電子メールの中継を許可する。

(2)accessファイルの記載内容を変更したら、/etc/mail/ディレクトリでmakeする。

設定ファイル(sendmail.cf)

毎回sendmail起動時に読み込まれる各種設定が/etc/mail/sendmail.cfに記載されている。設定は行単位で記述され、先頭1文字がコマンドの種類を表す。コマンドの種類は以下の通り(出展:文献3)。

コマンド 内容 備考
V 設定ファイルバージョン定義(V8のみ) V8での機能を有効にする際記述する。
M メール配信を行うエージェント(アプリケーション)を定義 sendmailは自分自身でメール送信は行わず、ここに定義したエージェントに送信を依頼する。
D マクロを定義 設定ファイル中何度も登場する値はマクロを定義しておくと記述や管理がしやすくなる。
R 変換規則を定義
S 変換規則の組(ルールセット)を定義
C クラスマクロを定義 複数の値を持つことができるマクロ。
F ファイルクラスマクロを定義 別ファイルに値のリストを持つことができるマクロ。
O オプションを定義
H ヘッダを定義
H 優先順位を定義
# コメント行

全体設定(mcファイルによる設定)

設定はsendmail.cfを直接編集せず、(1)mc(マクロ)ファイルを編集する(2)コンパイルしてsendmail.cfを生成、という方法も可能(sendmail.cf内コメントにはmcファイルを用いる方法を「使うこと」となっている)。マクロファイルの書式は以下の通り。なおマクロの各引数はバッククォート(`)とシングルクォート(')で囲む(例:`string')。

記述 内容
divert(-1)...divert(0) ...の部分は全てコメントとみなされる。
divert(-1)
####
If you modify this file, 
you will have to regenerate
/etc/mail/sendmail.cf
(run ./Build)
####
divert(0)
VERSIONID(`文字列') ソース制御システムを示す文字列。特に動作を左右するものではない。
VERSIONID(`setup for linux')
OSTYPE(`OSの種類') OSの種類を示す文字列。ostypeサブディレクトリ(/usr/share/sendmail-cf/ostype)に収められたOS固有のソースファイルが合わせて読み込まれる。 ostype/linux.m4 の内容を含めて設定を行う。
OSTYPE(`linux')
FEATURE(`文字列') 1つ目の設定でメール送信プログラムを、2つ目の設定でローカル配信プログラムを指定する。 送信にsmrshを、ローカル配信に/usr/bin/procmailを用いる。
FEATURE(`smrsh')
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')
FEATURE(`local_procmail')

sendmail.cfの構築を行う操作は以下の通り。

shell> cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak ←設定ファイルのバックアップをとる
shell> cd /usr/share/sendmail-cf/cf ←構築用ディレクトリに移動、/usr/share/sendmail-cf/cf は構築用ディレクトリ
shell> ./Build /usr/mail/sendmail.cf
shell> chmod 444 /etc/mail/sendmail.cf
    

転送

システムユーザ宛てに送られたメールは、ユーザホームに置かれた .forward に記された内容に従って転送される。転送先はコンマまたは改行で区切って記す。転送元にメールを残す場合は転送先の冒頭にバックスラッシュを付加して記す。転送先からメールが戻ってくる場合など、無限ループに陥る恐れのある場合はこの設定を追加する[4]

コマンド

【書式】
/usr/lib/sendmail オプション 宛先
  

入力された内容を本文として、指定の宛先へメールを送信する。 既定の入力元は標準入力。リダイレクトを用いてファイルなどから入力することもできる。 送信はmailコマンドでも可能。

【例】
/usr/lib/sendmail user@hoge.com < body.txt
  
-v
冗長モード。メールのやりとりに関するメッセージが表示される。
【例】
shell> /usr/lib/sendmail -v tom <mailbody
220 hoge.foo.org ESMTP Sendmail 8.13.8/8.13.8; Wed, 2 Sep 2009 10:53:50 +0900
>>> EHLO hoge.foo.org
250-hoge.foo.org Hello hoge.foo.org [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-DELIVERBY
250 HELP
>>> MAIL From:<jack@hoge.foo.org> SIZE=55
250 2.1.0 <jack@hoge.foo.org>... Sender ok
>>> RCPT To:<tom@pdbjs9.pdbj.org>
>>> DATA
250 2.1.5 <tom@pdbjs9.pdbj.org>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
250 2.0.0 n821roAo023377 Message accepted for delivery
tom... Sent (n821roAo023377 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 hoge.foo.org closing connection
  

メール本文の書式は以下の通り。

Subject: test 
              ←空行でヘッダ部分と本文を区切る
This is main part of mail.
  

READMEの訳

元文書はこちら


この文書はsendmailの設定ファイルについて記述したもので、sendmailを利用するためのファイル sendmail.cf をどのようにして作ればいいかについて説明しています。また、Sendmail インストール・操作ガイド(doc/op/op.me)で説明されているsendmailのオプション設定方法についても記述しています。

始めるに当たって、tcpproto.mc(TCPのみのサイト用)、clientproto.mc(単一のメールホストを使うクライアント群用)、あるいは generic-*.mc ファイルをOS別の事例として見たいかもしれません。

紹介と事例

設定は "cf" サブディレクトリに、拡張子 ".mc" を持つファイルに記載されています。この ".cf" ファイルは、"m4" プログラムで処理し ".cf" ファイルを作る必要があります。その際あらかじめ "cf.m4" をロードが必要です。

m4 cfディレクトリ/m4/cf.m4 mc設定ファイル > config.cf
    

あるいは、以下の様に単純に書くこともできます。

cd cfディレクトリ/cf
./Build config.cf
    

ここでcfディレクトリは cfディレクトリ のルート、mc設定ファイル は拡張子 ".mc" の設定ファイルの名前を指定します。もし __file__ または -I フラグ(ditto)

ドメイン

設定ファイルにはドメインマクロが参照するドメイン依存定義の集まりが必要になることでしょう。 例えば、Berkeley ドメインファイルにはいくつかの内部で区別されるホストの定義が含まれます。


参考文献・サイト