Sendmailの最近のブログ記事

メールのルーティング

|

メールルーティング用メールサーバーのSendmailの設定。

■あるドメイン宛のメールは全部、担当ホストにリレーしてしまう。(mailertable)
例:xxx@hogehoge.local宛のメールはすべてhogemail.hogehoge.localに中継する。

○/etc/mail/sendmail.mc
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
○/etc/mail/mailertable
sapporo.hogehoge.local	smtp:mail.sapporo.hogehoge.local


■ドメインにとどまらず、メールアドレスによって振る舞いを決める(virtusertable)

○/etc/mail/sendmail.mc
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl

○/etc/mail/virtusertable

# postmaster, admin宛てのメールは
# メールゲートウェイサーバーのrootが受け取るようにしている。
postmaster@hogehoge.local	root
admin@hogehoge.local		root

# imap.hogehoge.local 公用のアドレスはimapサーバーに届かせる。 info@hogehoge.local hoge-staff@imap.hogehoge.local sales@hogehoge.local sales@imap.hogehoge.local recruit@hogehoge.local recruit@imap.hogehoge.local

# 上から順番にマッピングしていき、 # 最後の行の@の前の部分は、すべて%1に代入される。 # 一般ユーザー用のメールはpopサーバーに配送されるイメージ。 @hogehoge.local %1@pop.hogehoge.local

# support.hogehoge.localというサブドメイン用のマッピングも # 同じくvirtusertableに記述できる。 postmaster@support.hogehoge.local root user01@support.hogehoge.local user01@imap.hogehoge.local user02@support.hogehoge.local user02@imap.hogehoge.local

# 「そんなユーザーは存在しない」というえらーメッセージを返信するなら # error:~~と書けばよい。「~~」の部分がえらーメールのbodyとなる。 @support.hogehoge.local error:nouser No such user here

# もちろん違うドメインのメールをリレーすることも可能である。 postmaster@example.local root @example.local %1@example.hogehoge.local

   

sendmail.mcからsendmail.cfを作成するには

|
最近のRedHat系(RHEL、FedoraCore、CentOSなど)は /etc/mail/の中にMakefileがあるので、
# make
とやるだけでいい。とても楽々。 しかも virtusertable access domaintable mailertable をhashdbにするのも
# make
でおわり。
しかし、基本的には、${CFDIR}/cf/にsendmail.mcを置き(おかなくてもいいけどさ)、
# m4 ../cf/m4/cf.m4 sendmail.mc > /etc/sendmail.cf
とする。 ※${CFDIR}はhttp://www.kuwazou.net/blog/tcpip/mail/sendmail/m4/を参照

RedHatの場合はsendmail.mcの1行目に
include(`/usr/share/sendmail-cf/m4/cf.m4')
という文があるためにcf.m4を指定しなくてよいのだ。

もしくは、
# cd ${CFDIR}/cf
# ./Build sendmail.cf
とする。実はこのスクリプト、非常に簡単であり、
#!/bin/sh

SMROOT=${SMROOT-../..}
BUILDTOOLS=${BUILDTOOLS-$SMROOT/devtools}

M4=/usr/bin/m4
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
echo "Using M4=$M4"

eval exec ${MAKE-make} M4=$M4 $*


これだけである。
しかし、Solaris8には存在しない。

   

sendmail コマンドヘルプ

|
■Sendmail 起動オプション
-b		動作モードを設定
-v		冗長メッセージ出力モードで実行
-d		デバッグモードで実行
-q		直ちにキューを処理する
-f $from	メール送信時にエンベロープFromを指定する
-t		メール送信時にメール本体のFromやToを参照する
-i		メッセージの終了を表す「.」を無効にする

■-bスイッチ

-bd		デーモンとして動作する
-q1h	1時間おきにキューにたまったメールを処理する
-bi		newaliaseに等しい
-bp		mailqに等しい
-bh		hoststatに等しい
-bH		purgestatに等しい

-bv べりファイモード あるアドレスに送られたメールが最終的にどこに送られるか確認できる # sendmail -bv hogehoge@hogehoge.local hogehoge@hogehoge.local... deliverable: mailer local, user hogehoge hogehoge@xxx.ne.jp... deliverable: mailer relay, host smtp.xxx.jp, user hogehoge@xxx.ne.jp

■-vスイッチ メールを配信した際の全手順をコンソールに出力できる。
# sendmail -v hogeo@hogehoge.local < mail.txt
hogeo@hogehoge.local... Connecting to [127.0.0.1] via relay...
220 example.local ESMTP Sendmail 8.12.8/8.12.8; Fri, 5 Dec 2003 12:19:36 +0900
>>> EHLO mail.example.local
250-example.local Hello localhost [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 10485760 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-DELIVERBY 250 HELP
>>> MAIL From: SIZE=9 AUTH=hoge@mail.example.local
250 2.1.0 ... Sender ok
>>> RCPT To:
>>> DATA
250 2.1.5 ... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
250 2.0.0 hB53JZKn006587 Message accepted for delivery hogeo@hogehoge.local... Sent (hB53JZKn006587 Message accepted for delivery) Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 example.local closing connection
■-dスイッチ
-d[カテゴリ].[レベル],[カテゴリ].[レベル],.... 宛先 < メール本文
例えば、下のようにすると、sendmailの基本設定を確認できる
# sendmail -d0.1 -bv hoge
Version 8.12.8
 Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
                MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
                NETUNIX NEWDB NIS PIPELINING SASL SCANF STARTTLS TCPWRAPPERS
                USERDB USE_LDAP_INIT

============ SYSTEM IDENTITY (after readcf) ============
(short domain name) $w = mail1
(canonical domain name) $j = example.local
(subdomain name) $m = example.local
(node name) $k = mail1
========================================================

hoge... deliverable: mailer local, user hoge

■キュー
すぐに配信ができないメールはキューにいったん格納される
sendmail -bd -q1h とすると1時間おきにキューの処理がされる。
sendmail -q とするとキューの直ちに処理がされる。
キューの状態を見るにはmailq -v もしくは sendmail -bp -v
別のディレクトリに格納してあるキューを処理するには
# sendmail -QueueDirectory=/var/spool/newqueue -OTimeout.queuereturn=10d -q -v
などとする。

   

m4の使用方法

|

■cfディレクトリ
RedHat /usr/share/sendmail-cf/
Solaris8 /usr/lib/mail/

cf ここに基本的なmcファイルがある。
m4 ここは変更しない
ostype 各OS用の設定がある
domain DOMAINマクロで読み込まれる
feature マクロで読み込まれる
hack マクロで読み込まれる
mailer マクロで読み込まれる
sh mcファイルからcfファイルを作るためのスクリプトがある


   

sendmail.mc

|

最近のRedHat系のsendmailなんかの場合、
動かすだけならpostfixなんかよりもよっぽど設定は簡単で、

○/etc/mail/sendmail.mcを編集して
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
にdnlをつけて、
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
にして、必要に応じスマートホストを設定し、
define(`SMART_HOST',`mx.hogehoge.local')
○/etc/mail/accessファイルを
localhost.localdomain           RELAY
localhost                       RELAY
127.0.0.1                       RELAY
192.168.0                       RELAY   # LANのセグメント
hogehoge.local                  RELAY   # LANのドメイン
とかして、 ○/etc/mail/local-host-names
mail.hogehoge.local  #自ホスト
hogehoge.local  # 自ドメイン
とか書いて、あとは、
# make
# make restart
service sendmail restart
sendmail を停止中:                                         [  OK  ]
sm-client を停止中:                                        [  OK  ]
sendmail を起動中:                                         [  OK  ]
sm-client を起動中:                                        [  OK  ]
#
で、動いちゃうんですが、 一応、sendmail.mcの意味を掘り下げてみようかと思います。

○/etc/mail/sendmail.mc

divert(-1)dnl
include(`/usr/share/sendmail-cf/m4/cf.m4')dnl
VERSIONID(`setup for Red Hat Linux')dnl

#m4の必須項目と推奨項目 # mcファイルはOSTYPE()を最初に宣言し、MAILERを最後に宣言します。 # # OSTYPE()  必須  使用するOSの指定 # DOMAIN()  推奨  ドメイン全体に共通の情報 # FEATURE()  推奨  特殊な必要性の解決 # MAILER()  必須  必要な配信エージェント # OSTYPE(`linux')dnl

####################### # DEFINE #######################

# ちなみにsendmail.mcのコメント行は「dnl」で始まる行であって、 # 「#」で始まる行ではありません。 # このページは見やすいから「#」を使ってるだけです。 # また、末尾のdnlはm4でsendmail.cfを作成する際、 # 改行のような役割をするので、つけておいてください。

# 出力ログレベルの設定 # 9はだいたいsyslogのinfoに相当します。これくらいでちょうどでしょう。 # 0(少ない)~98(多い)まで設定できるが、 # 16以上はdebugレベルです。 # 15ですべてのSMTPコマンドが見れます。 dnl define(`confLOG_LEVEL', `9')dnl

# スマートホストの設定 # # このサーバーが、インターネット側から見て、 # 「DNS名の正引き結果とIPアドレスの逆引き結果が一致」 # しているならスマートホストの設定をしなくても送信は可能です。 # (厳密にはその必要はないのですが、 #  そうでないサーバーからのSMTP接続が拒否されてしまう設定が最近非常に増えてます。) # # スマートホストを設定する必要性としては、 # # ・固定IP1個のプロバイダ契約で、正引きは設定できるが、逆引きの設定はできず、 #  そのIPアドレスを逆引きするとプロバイダの名前が引ける。 # # ・メールサーバーがNAPTの内側(つまりLAN内)にあり、 # WAN側からLAN内のメールサーバーの名前引きはまったくできないが、 # DMZセグメントにメールゲートウェイ(メールリレー)サーバーがある # # ・キャンペーンサイトのメール送信などで、一度にたくさんのメールを送信するため、 # メール送信専用サーバーがある(名前引きなどで負荷がかかりますからね。) # # などの場合はスマートホスト、DMZなどにあるメールリレーサーバーを設定します。 # (IPアドレスじゃだめです。) # プロバイダのメールサーバーなんかを指定してもいいのかもしれません。 define(`SMART_HOST',`mx.hogehoge.local')

define(`confDEF_USER_ID',``8:12'')dnl

# trusted-userを設定する define(`confTRUSTED_USER', `smmsp')dnl

# trusted-usersファイルを設定する dnl define(`confCT_FILE', `/etc/mail/trusted-users')

dnl define(`confAUTO_REBUILD')dnl define(`confTO_CONNECT', `1m')dnl define(`confTRY_NULL_MX_LIST',true)dnl define(`confDONT_PROBE_INTERFACES',true)dnl define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl define(`ALIAS_FILE', `/etc/aliases')dnl dnl define(`STATUS_FILE', `/etc/mail/statistics')dnl define(`UUCP_MAILER_MAX', `2000000')dnl define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl

# VRFY・EXPNコマンドの禁止 # このSMTPコマンドを打たれると # メールアドレスやエイリアスの情報を盗まれてしまうのです。

define(`confPRIVACY_FLAGS', `goaway')dnl

# メッセージサイズ上限の設定 # これで約10MBです。(本文と添付ファイルの合計サイズ) define(`confMAX_MESSAGE_SIZE', `10485760')dnl

# あて先数上限の設定 # たくさんばら撒かれるのも困るので。 define(`confMAX_RCPTS_PER_MESSAGE', `128')dnl

# 通過MTA数上限を24HOPまでにする # これはメールピンポン(ループ)を防止するための措置です。 define(`confMAX_HOP', `24')dnl

# 送信保留メールの再送信間隔を5分に define(`confMIN_QUEUE_AGE', `300m')dnl

# 送信保留メールを保持するのを5日(これは長い) define(`confTO_QUEUERETURN', `5d')dnl

# 送信失敗の通知タイミングを4時間に define(`confTO_QUEUEWARN', `4h')dnl

# SMTP-AUTHの設定 必要なければdnlをつけたままにする define(`confAUTH_OPTIONS', `A')dnl # これは必要ないです。 dnl define(`confAUTH_OPTIONS', `A p')dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

# STARTTLSを使うときの証明書置き場の設定 # 使うときはdnlをはずす dnl define(`confCACERT_PATH',`/usr/share/ssl/certs') dnl define(`confCACERT',`/usr/share/ssl/certs/ca-bundle.crt') dnl define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.pem') dnl define(`confSERVER_KEY',`/usr/share/ssl/certs/sendmail.pem') dnl define(`confDONT_BLAME_SENDMAIL',`groupreadablekeyfile')dnl

# Load Averageが値まで上昇したとき、 # Sendmailの送信をいったんキューにためます dnl define(`confQUEUE_LA', `12')dnl

# Load Averageが値まで上昇したとき、 # Sendmailは接続受付を拒否する dnl define(`confREFUSE_LA', `18')dnl

IDENTのクエリの待ち時間を設定。0がよい。 define(`confTO_IDENT', `0')dnl

dnl define(`confMAX_DAEMON_CHILDREN', 12)dnl dnl define(`confCONNECTION_RATE_THROTTLE', 3)dnl

####################### # FEATURE ####################### dnl FEATURE(delay_checks)dnl FEATURE(`no_default_msa',`dnl')dnl FEATURE(`smrsh',`/usr/sbin/smrsh')dnl

# mailertableとvirtusertableのファイルを設定する FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl

FEATURE(redirect)dnl

# すべての発信者アドレスにサーバーのホスト名が追加されます。 # ホスト名というのはFQDNです。 #「xxx@mail.hogehoge.local」みたいな感じになります。 # ※そうじゃなくて「xxx@hogehoge.local」にしたいというひとは #  下のほうのマスカレードを設定してください。 # /etc/hostsか、hostnameコマンドの文字列のどちらかで、 # FQDNとなっているものが@の後ろにくっつきます。 # # むしろ、/etc/hostsかhostnameのどちらにもFQDNが設定されていないと # (というか、自分の名前解決が正常にできなくなってしまうと) # Sendmailの動作がおかしくなってしまうことに問題がありますので、 # サーバーにFQDNと、このalways_add_domainは必ず設定しておきます。 FEATURE(always_add_domain)dnl

# /etc/mail/local-host_namesを使用するために必要です。 FEATURE(use_cw_file)dnl

# /etc/mail/trusted-usersから信頼するユーザーを読み込みます。 FEATURE(use_ct_file)dnl

FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl

# /etc/mail/access を使用する FEATURE(`access_db',`hash -T -o /etc/mail/access.db')dnl

FEATURE(`blacklist_recipients')dnl

# なにはともあれ、Sendmailの設定はここから始まります。 # # 初期状態では、 # DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl # と、なっており、SMTP接続を受け付けるアドレスを127.0.0.1からに限定してます。 # # このままでは外部からのSMTP接続を受け付けられないので、 # dnl を先頭につけて、無効化するか、 # DAEMON_OPTIONS(`Port=smtp,Addr=192.168.0.1, Name=MTA')dnl # などと、接続をListenするインターフェースを指定します。 # # ただし、そのままではオープンリレー(誰でもかまわずリレーしてしまう)サーバーとなって # spamメール送信のための踏み台となってしまうので、 # /etc/mail/accessで適切にリレー制限を行う必要があります。 dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl dnl DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl dnl DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')dnl dnl DAEMON_OPTIONS(`Name=MTA-v4, Family=inet, Name=MTA-v6, Family=inet6')

# 名前解決できないドメインからのメールも受け付けます FEATURE(`accept_unresolvable_domains')dnl

# このサーバーをMXレコードにしているドメインからの中継を許可します。 # あまりよいものではないので、dnlにしておくほうがよいでしょう。 dnl FEATURE(`relay_based_on_MX')dnl

LOCAL_DOMAIN(`localhost.localdomain')dnl

# ここに書かれたドメインが送信メールに必ずつくようになります。 # 「マスカレード」といいます。 # 自分の好きなドメインがつけられるか、 # いやおうなしにサーバーのFQDNがつくかが、 # 上のalways_add_domainとの違いです。 MASQUERADE_AS(`hogehoge.local')dnl

# エンベロープアドレス # (SMTPコマンド中で「MAIL FROM:」で入力するとこです)で # マスカレードするらしいです。普通は必要ないです。 dnl FEATURE(masquerade_envelope)dnl dnl FEATURE(`.hogehoge.local')dnl

# rootからのメールの場合だけはマスカレードしないようにします。 EXPOSED_USER(`root')dnl

dnl MASQUERADE_DOMAIN(localhost)dnl dnl MASQUERADE_DOMAIN(localhost.localdomain)dnl dnl MASQUERADE_DOMAIN(mydomainalias.com)dnl dnl MASQUERADE_DOMAIN(mydomain.lan)dnl

# # MAILER()マクロ # # 配信エージェントにsmtpとprocmailを使っているという宣言です。 # 必ず一番最後に書かなくてはなりません。 # Cyrus-IMAPを使う場合などは # MAILER(`cyrusv2')dnl # MAILER(smtp)dnl # などとしますが、普段は特別変更する必要もないでしょう。 # MAILER(smtp)dnl MAILER(procmail)dnl

   

このアーカイブについて

このページには、過去に書かれたブログ記事のうちSendmailカテゴリに属しているものが含まれています。

前のカテゴリはCourier-imapdです。

次のカテゴリはSquirrelmailです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Sendmail: 月別アーカイブ

Powered by Movable Type 4.1