UNIX / SendMail


FrontPage > UNIX > Sendmail


FreeBSD に付いてくる Sendmail 向け設定です。(FreeBSD 5.4以降向け) 分かり次第、順次記入。

目次

メール配送時のデフォルト経路を指定 (SMART_HOST)

設定方法

ローカル配送以外のデフォルト経路を指定。(MX に依存しない)

===< hostname.mc >===
define(`SMART_HOST',`mail1')

SMART_HOST が複数有る場合「:」で繋ぎ

===< hostname.mc >===
define(`SMART_HOST', `mx1:mx2')

と書いておくと、先ず mx1 に接続を試し、失敗したら mx2 に繋ぎに行きます。 IPアドレスの場合は [] で囲んで書きます。(MX レコードでなく A レコードを引いて欲しいときも [] で囲みます)

===< hostname.mc >===
define(`SMART_HOST', `[192.168.0.2]:[192.168.0.3]')
  • user@other.host と、@ 以降が自分のホスト名でない場合の送り先
    define(`SMART_HOST', `hostname')
  • user@my.host と、@ 以降が自分のホスト名の時の送り先 (通常は local 配送)
    define(`MAIL_HUB', `hostname.')
  • ユーザ名のみで、ホスト名,ドメイン名が付いていない場合の送り先
    define(`LOCAL_RELAY', `hostname.')
  • どこ宛か気にせずに全て指定ホストへ送る (NIS 等でアカウントを共有している場合など)
    FEATURE(`nullclient', `hostname.')

テスト方法

mai.1yen.cx の上で define(`SMART_HOST', `mx1:mx2') を指定したときの確認方法。 *.mc ファイルから *.cf ファイルを作成。

make cf

できた hostname.cf を食わせてテスト(-bv)を行う。

% sendmail -bv -Chostname.cf mio
mio... deliverable: mailer local, user mio
% sendmail -bv -Chostname.cf mio@mai
mio@mai... deliverable: mailer local, user mio
% sendmail -bv -Chostname.cf mio@mai.1yen.cx
mio@mai.1yen.cx... deliverable: mailer local, user mio
% sendmail -bv -Chostname.cf mio@other.host
mio@other.host... deliverable: mailer relay, host mx1:mx2, user mio@other.host

上記より mio, mio@mai, mio@mai.1yen.cx は、ユーザー mio 宛に local 配送を行い、mio@other.host の場合は mio@other.host のままで mx1, mx2 へ転送されることが分かる。正しいことが確認できれば、*.cf のインストールと再起動を行って反映する。

make install ; make restart

送り先によって中継するメールサーバーを変えたい場合には (mailertable)

設定方法

mailertable は、MX を無視し送り先によってメールサーバーを変える事ができる。 ISP-1 と ISP-2 のマルチホームの時、@isp-1.net は、smtp.isp-1.net 宛に @isp-2.net は、smtp.isp-2.net 宛に送る場合 (指定がない場合には SMART_HOST, DNS の MX に従う)

===< hostname.mc >===
FEATURE(`mailertable')
===< mailertable >===
isp-1.net    smtp.isp-1.net
isp-2.org    smtp.isp-2.net

となる。テスト方法は上を参照。プロトコルを明示して以下のようにも書ける。

===< mailertable >===
isp-1.net    esmtp:smtp.isp-1.net
isp-2.org    esmtp:smtp.isp-2.net

SMART_HOST と同様に「:」で送り先を複数繋げて書くことも可能で、

===< mailertable >===
isp-1.net    [esmtp:smtp.isp-1.net]:[esmtp:smtp.isp-2.net]
isp-2.org    [esmtp:smtp.isp-2.net]:[esmtp:smtp.isp-1.net]

(「:」を区別するために [] で囲んでいます。)

また、ISP内で @A.isp.net, @B.isp.net, @C.isp.net とあり MX は 全て mail.isp.net の時、mail.isp.net のホスト上全てのメールを 受けた後に、それぞれのホストへメールを振り分ける必要がある場合、 mail.isp.net の設定を

===< mailertable >===
A.isp.net    A.isp.net
B.isp.net    B.isp.net
C.isp.net    C.isp.net

と書けば、DNS(MX) に関係なくそれぞれのホストへ振り分けることができる。


テスト方法

SMART_HOST の設定にあるテストの項と同様 sendmail -bv にて確認ができます。

Envelope From を書き換える。(ユーザ名も丸ごと)

設定方法

cf を直接書き換えるしか無いっぽい。現在調査中。

ヘッダーの From を書き換える。(ユーザ名も丸ごと) genericstable

設定方法

  1. 書き換え対象となるドメインを指定する(リストされていないものは書き換えの対象にならない)
    1. 外部ファイルで指定
      1. 書き換え対象のドメイン一覧が書いてあるファイルを指定 (sendmail|submit).mc に指定 (-o はファイルがなくてもエラーにならないため)
        ===<hostname.mc>===
        GENERICS_DOMAIN_FILE(`-o /etc/mail/generics-domains')
      2. /etc/mail/generics-domains に、書き換え対象のドメインを指定
        ===<generics-domains>===
        mai.int.1yen.cx
        bun.int.1yen.cx
        ten.int.1yen.cx
        ren.int.1yen.cx
    2. mc ファイルに書く方法
      1. GENERICS_DOMAIN に指定する。(スペースで区切って書くか、複数並べて書く)
        ===<hostname.mc>===
        GENERICS_DOMAIN(`mai.int.1yen.cx bun.int.1yen.cx')
        GENERICS_DOMAIN(`ten.int.1yen.cx')
        GENERICS_DOMAIN(`ren.int.1yen.cx')
  2. 書き換え対応表を指定 以下のようにファイル名を省略すると /etc/mail/genericstable.db を使用
    ===<hostname.mc>===
    FEATURE(`genericstable')
    ファイル名も指定するなら
    ===<hostname.mc>===
    FEATURE(`genericstable', `hash -o /etc/mail/genericstable')
  3. 書き換え対応表を作成
    ===< genericstable >===
    root       mio@mai.1yen.cx
    postmaster taiichirou@bun.1yen.cx
    abouse     shinichirou@ten.1yen.cx
    user1      risa@ren.1yen.cx
    user2      edamon@dokodemo.1yen.cx
    ...
  4. hash 化 / cf を作成する (インストール はしない)
    make maps ; make cf
    ls -ltr 等で、どのファイルが更新/作成されたか確認。 genericstable.db, hostname.cf, hostname.submit.cf 等ができている。(alias ファイルも更新されていれば aliases.db が更新される)

テスト方法

  1. テスト 先ずは、hostname.cf を食わせてテストする。
    # sendmail -bt -Chostname.cf
    ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
    Enter <ruleset> <address>
    > /map generics root
    map_lookup: generics (root) returns mio@mai.1yen.cx (0)
    root を与えてみたところ、genericstable 通り mio@mai.1yen.cx が 帰ってくることが確認できた。以下同様に、他のユーザーも書き換えられるか確認する。
  2. cf のインストール
    make install
  3. sendmail の再起動
    make restart

いじょ

外へ向けて Listen する

設定方法

===< /etc/rc.conf >===
sendmail_enable="YES"        # 外部からのメールを受ける
sendmail_submit_enable="YES"

sendmail_enable は、外向けのポートを開くかどうかを決定する。YES: 外部からのメールを受け取る。NO: 外部からのメールを受け取らない。 sendmail_submit_enable は sendmail_enable が NO であるときのみ意味を持ち sendmail_submit_enable が YES であれば localhost:25 のみ LISTEN し、外部へ配送を行う。 see rc.sendmail(8)

確認方法

netstat -na | grep 25

で、25番ポートが LISTEN しているか確認できる。また、telnet で 25 番ポートをたたいて確認することも可能。

中継を許すホスト


設定方法

===< hostname.mc >===
FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')

/etc/mail/access.sample があるのでそれを参考に。

===< /etc/mail/access >===
192.168      RELAY

書き換えたら「make maps」を実行して access.db をアップデートしてください。場合によってはパケットフィルタ ipfw(4)/ipf(4)/pf(4) や、/etc/hosts.allow の設定も確認する必要があるかもしれません。

trusted user を指定する。

設定方法

ユーザ「ossan」が

sendmail -f <from@1yen.cx> <to@1yen.cx>

とコマンドを実行すると、Env From が from@1yen.cx に偽装できますが、代わりに

X-Authentication-Warning: mai.1yen.cx: ossan set sender to from@1yen.cx using -f

という警告が出ます。これを消すには、「チェックしなくする方法(薦められません。confPRIVACY_FLAGS の authwarnings あたりかな?)」と、「信頼できるユーザの場合警告を表示させない方法」というがあります。信頼できるユーザが trusted user で、以下のように指定します。

直接 cf に書く場合 (書き換え時に、sendmail の再起動が必要)

===< hostname.mc >===
define(`confTRUSTED_USERS', `majordom postmaster ossan')

外部ファイルに書く場合 (書き換え時に、sendmail の再起動不要だと思う...)

===< hostname.mc >===
define(`confCT_FILE', `-o /etc/mail/trusted-users')
===< trusted-users >===
majordom
root
postmaster
mai
...

ファイル名について

hostname.mc
freebsd.mc をコピーして書き換える。そのホスト固有の設定を書くファイル。
hostname.submit.mc
freebsd.submit.mc をコピーして書き換える。そのホスト固有の設定を書くファイル。

hostname は、そのホストのホスト名で、/etc/make.conf 中の SENDMAIL_MC で任意の名前に定義可能。 例えば以下のように定義を追加する。

===< make.conf >===
.if ${.CURDIR} == /etc/mail
HOSTNAME!=      uname -n | sed -e 's/^\([^\.]*\).*/\1/'
SENDMAIL_MC=    $(HOSTNAME).mc
SENDMAIL_SUBMIT_MC=     $(HOSTNAME).submit.mc
.endif

この場合の動作は、ホスト名からドメイン名部分が削除される。

% uname -n
hinako.1yen.cx
% cd /etc/mail ; make -VSENDMAIL_SUBMIT_MC -VSENDMAIL_SUBMIT_MC
hinako
hinako

hostname.mc, hostname.submit.mc が無い場合は freebsd.mc, freebsd.submit.mc が使われるので、これを直接書き換えることも可能だが、mergemaster(8) がかなり大変になるのでお勧めしない。(自分では絶対やりたくない)