Category: base
ユーザごとにAUTH先のSMTPサーバを切替えてメール送信
February 16th, 2008前置き
今まで頻繁に来ていたトラックバックがあったことを知らせる通知メールが最近は来ていないな、と思っていたら、どうやら、現在利用しているISP*1でも本格的にOB25Bの制限が始まっていたらしい…。
メールのログに、
stat=Deferred: Operation timed out with XXX.XXX.XXX
と延々と記録されている。
といっても、OB25Bの初期の何年か前、こちらのサーバから携帯電話のメールサーバに宛ててメールが送信できなくなってしまったので、その頃、開始したGoogleのホスティングサービスを利用して、独自ドメインのメールはGMail上で送受信するように切替えていたので、通常使用の分には問題なかったんだけど。
ただ例外として、ブログのトラックバックやコメント等があった時の通知メールは、こちらのサーバから外部に出すようにしていた(大抵、海外からのトラックバックスパムやコメントスパムが発生原因で、あまり好ましいものとは言えないんだけど、一応…)。
しかし、放っておいても問題の解決にはならないので、調べてみたところ、
に、SMTP-AUTHの設定を解説されているサイトがあった。
ただ、プロバイダの制約上、一つのアカウントに登録できるメールアドレスは、5つまでだそうなので、プロバイダ固有のものを除くと、独自ドメインのものは最大で4つまでとなってしまう(全部、それに割り当てても良ければの話。しかも、どのメールも同一ユーザでの認証が必要)。
ちょっと、これでは都合が悪いので、あれこれ模索してみていたところ、上記GMailのメールサーバでも、独自ドメインのアドレスで送受信できる事が判明*2。Googleの解説の
では、Gmail のユーザー名 (@gmail.com を含む)
と記述されていたから、今まで、メールアドレスは、gmail.comのドメインのものじゃないと駄目だと思っていたけど。
以下、Googleのサービスを利用して、ユーザごとに認証を切替えて、メールを送信する方法について書いてみました。
- *1 現在、Yahoo!BBの回線を使用しています。
- *2 Googleでは、一つのドメインに対し、25個までのアカウントを作成することができる(無料版の場合)
SMTP AUTH対応のSendmailの構築
というわけで、外部に向けて送信するため、SMTP-AUTH対応のsendmailを構築。
まず、portsからsecurity/cyrus-sasl2をインストールして、/etc/make.confに、
SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2
を記述し、
# cd /usr/src/lib/libsm # make obj && make depend && make # cd /usr/src/lib/libsmutil # make obj && make depend && make # cd /usr/src/usr.sbin/sendmail # make obj && make depend && make && make install
でsendmailを再構築。
設定
次に、/etc/mail/以下の設定ファイルの記述。
通常、SMART_HOSTを使うと思うけど、そうすると送信サーバが固定されてしまうので、複数のアカウントを使い分けている場合には不便。
smarttabe.m4の利用
そこで、ここでは、ユーザごとに送信先を選べるように、smarttableを使うことにする。
まず、SorceForge.netから、open-sendmailのソースファイルを取ってきて、
# tar zxf open-sendmail-2007-09-25.tar.gz # cp -p ./cf/feature/anfi/smarttable.m4 /usr/share/sendmail/cf/feature/
と展開し、smarttable.m4をコピー。
FQDN.mcの作成
/etc/mail/内で、makeを実行して作成される/etc/mail/[FQDN].mcに、
FEATURE(`smarttable')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl FEATURE(`authinfo', DATABASE_MAP_TYPE MAIL_SETTINGS_DIR`authinfo')dnl MASQUERADE_AS(`_domain_name')dnl FEATURE(masquerade_envelope)dnl
を記述する(GMailの場合、587番ポートはSTARTTSLでTSL接続、465番ポートを使用した場合は最初からSSL接続。後段は、FromとReturn-Pathの記述)。
認証ファイルの作成
次にSMTP AUTHを行うための設定。/etc/mail/authinfoを作成し、
AuthInfo:user1.smtp-gmail "U:Acount1@example.com" "P:Password1" "M:LOGIN PLAIN" AuthInfo:user2.smtp-gmail "U:Acount2@example.com" "P:Password2" "M:LOGIN PLAIN"
等と各SMTPサーバ*3に対応するユーザ名とパスワード等を記述*4した後、
# cd /etc/mail # makemap hash authinfo.db < authinfo # chmod 640 authinfo* # chgrp smmsp authinfo.db
を実行して、ハッシュのデータベースを作成し、パーミッション等を適切なものに変える。
- *3 同一の送信先に、複数のアカウントを割り当てて認証データベースを作成できないので、ここではアカウントごとに架空の送信サーバを指定して、ローカルのDNSで名前解決させることにしています。
- *4 Sendmail cf/README - SMTP AUTH参照。
ユーザごとの送信先
/etc/mail/smarttableを作成し、
localuser1@host.local.domain user1.smtp-gmail localuser2@host.local.domain user2.smtp-gmail
等と記述し、ローカルのユーザと送信先を対応させて、
# makemap hash /etc/mail/smarttable.db < /etc/mail/smarttable
とデータベースファイルを作成。
DNSの設定
ローカルのDNSのzoneファイルには、
*.smtp-gmail IN CNAME smtp.gmail.com.
を追加して、名前解決できるようにし、namedを再起動。
設定の終了、sendmailの再起動
ローカル宛てのメールは、上記の設定を反映させる必要もないので、[FQDN].submit.mcに、
dnl If you use IPv6 only, change [127.0.0.1] to [IPv6:::1]
DAEMON_OPTIONS(`Name=NoMTA, Addr=127.0.0.1, M=EA')dnl
FEATURE(`msp', `[127.0.0.1]')dnl
を追加。
# make install restart
で、/etc/mail/sendmail*.cfを構築して、sendmailを再起動。
備考
以上の設定で、目的は果たせたようです。
なお、上記の設定は、ほとんど、
を参考にしたものです。
更新履歴 2008/02/14
February 14th, 2008FreeBSD 6.3-RELEASEに更新
January 18th, 2008FreeBSD 6.3-RELEASEが出てきたようなので、今まで使っていたFreeBSD 6.2Rから更新してみました。
行った手順は、
の時とほぼ同じ。
こちらの環境では、特に問題もなく、移行できたようです。
終了後、make check-oldを実行してみたら、
>>> Checking for old files /usr/share/info/bzip2.info.gz /etc/namedb/PROTO.localhost-v6.rev /etc/namedb/PROTO.localhost.rev /etc/namedb/make-localhost /usr/share/examples/netgraph/bluetooth/rc.bluetooth /usr/share/man/man4/kame.4.gz /usr/share/man/man3/archive_write_prepare.3.gz >>> Checking for old libraries >>> Checking for old directories To remove old files and directories run 'make delete-old'. To remove old libraries run 'make delete-old-libs'.
と表示されたので、不要ファイルを削除。
更新履歴 2008/01/15
January 15th, 2008更新履歴 2007/11/30
November 30th, 2007の更新が来ていたので、ソースを同期して、カーネルを構築しなおした。
結果、
# uname -r 6.2-RELEASE-p9
に。
RELENG_6_3のタグもうたれていたので、これで更新しようかとも思ってはみたものの、今回は保留。
更新履歴 2007/02/10
February 10th, 2007ソースをcsup(1)したら、
の更新が来ていたのでアップデート。
上記に書いてある通り、
# cd /usr/src/lib/bind # make obj && make depend && make && make install # cd /usr/src/usr.sbin/named # make obj && make depend && make && make install
としてから、
# /etc/rc.d/named restart
とbindを再起動した。
FreeBSD 6.2-RELEASEにアップグレード
January 13th, 2007FreeBSD 6.2-RELEASEが出てきたようなので、今まで使っていたFreeBSD 6.1Rからアップグレードしてみた。
ソースの同期
6.2Rからは、csup(1)なるコマンドがベースシステムに組み込まれたけど、6.1Rではまだ導入されていないので、従来から導入しているcvsupのportを使ってソースを同期することにする。
/usr/share/examples/cvsup/standard-supfile
のファイル内
*default host=CHANGE_THIS.FreeBSD.org
の行を手近なホストに書き換え、
*default release=cvs tag=RELENG_6_1*default release=cvs tag=RELENG_6_2
とRELENG_6_2のタグを選択。
この後、
# cvsup -g -L 2 /usr/share/examples/cvsup/standard-supfile
を実行すると、上記で指定したホストに接続し、ソースの同期が行われる。
ビルド前の準備
実際にビルドを行う前に、
# mergemaster -p
を行って、ビルドに必要な環境が整っているか確認。
また、RELENG_6では、標準のCFLAGSが
CFLAGS = -O2 -fno-strict-aliasing -pipe
のように設定されているので、もし、独自に/etc/make.confに設定してあるものがある場合*1、見直した方が良いかも知れない(コメントアウトする)。
- *1 古い時期の情報では、
CFLAGS = -O -pipeを推奨しているものが多かった。
必要なファイルのバックアップ等
この間に、/etcの内容などは、万が一に備えてバックアップしておいた方が安全だと思う。
# cd /var/tmp # touch backup-etc.tar.gz # chmod 600 backup-etc.tar.gz # tar zcf ./backup-etc.tar.gz /etc
カーネルのコンフィギュレーション ファイルの変更点も何かと参考になる。
ビルド
同期したソースは、通常、/usr/srcのディレクトリ以下に置かれる。
その中に入り、
# cd /usr/src # make buildworld # make buildkernel
を実行。
インストール
ビルド終了後、同じディレクトリ内で、
# make installkernel
を実行し、新しいカーネルで起動するかどうかのテストを兼ねて再起動。
# shutdown -r now
再起動時のブートメニューで、single user mode
を選択。
シェル(/bin/sh)選択後、定型の
# fsck -p # mount -u / # mount -a -t ufs # swapon -a # adjkerntz -i
を実行した後、ソースディレクトリに戻り、残りの部分をインストール。
# cd /usr/src # make installworld
/etcの内容を更新
上記だけでは、/etcの内容は更新されないので、mergemaster(8)を実行。
# mergemaster
もし、マージする場合、その画面では、古いファイルの内容は左(l)、新しいのは右(r)に表示される。hのキーを押せばヘルプが表示される。
jail環境等の更新
jail環境等があれば、次のようにしてホスト側から更新できる。
# make installworld DESTDIR=${JAIL_ROOT}
# mergemaster -D ${JAIL_ROOT}
ただし、jail環境には、installkernelは不要。
インストール後の処理
FreeBSD 6.1Rからは、ソースディレクトリ内で
# make check-old
を実行することにより、古いファイルやディレクトリ、そして、古いライブラリの存在の確認が行えるようになった。
6.2Rに更新した環境で、おこなって見たところ、
# make check-old >>> Checking for old files /usr/share/man/man4/uhidev.4.gz /etc/periodic/weekly/120.clean-kvmdb /usr/include/c++/3.4/ext/demangle.h >>> Checking for old libraries >>> Checking for old directories To remove old files and directories run 'make delete-old'. To remove old libraries run 'make delete-old-libs'.
のように表示された。
それぞれ、make delete-old、もしくは、make delete-old-libsを使用して削除できる(古いライブラリは見付からなかったが)。
ただし、古いライブラリを削除した場合、それに依存していたports等が起動できなくなる場合もあるかも知れない。
その他
以上の結果、
# uname -r 6.2-RELEASE
となった。
前回、FreeBSD 6.0RからFreeBSD 6.1-RELEASEにアップグレードした場合に比べて、移行自体はスムーズに行ったと思う。
後は、必要に応じて微調整して行く程度。
更新履歴 2007/01/12
January 12th, 2007RELENG_6_1に、
の修正が入っていたので、ソースを同期し、/usr/src/内で、
# install -o root -g wheel -m 555 etc/rc.d/jail /etc/rc.d
した。
更新履歴 2006/12/07
December 7th, 2006RELENG_6_1に、
の修正が入っていたので、ソースを同期し、
# make buildkernel && make installkernel # reboot
した。
結果、
# uname -r 6.1-RELEASE-p11
に。
更新履歴 2006/10/01
October 1st, 2006が来ていたので、指示通りソースを更新し、
# cd /usr/src/secure/lib/libssh # make obj && make depend && make && make install # cd /usr/src/secure/usr.sbin/sshd # make obj && make depend && make && make install
と関連する部分をビルドし直して、sshd(8)を使用している環境においては、
# /etc/rc.d/sshd restart
とデーモンの再起動を行った。
更新履歴 2006/09/29
September 29th, 2006更新履歴 2006/09/20
September 20th, 2006が来ていたので、指示通りソースを更新して、
# cd /usr/src/gnu/usr.bin/gzip # make obj && make depend && make && make install
を行った。
ついでに、各jail環境も、同様に、
# make install DESTDIR=${JAIL_ROOT}
した。
更新履歴 2006/09/07
September 7th, 2006の2つが来てたので、buildworldした。
更新履歴 2006/08/29
August 29th, 2006更新履歴 2006/08/24
August 24th, 2006ppp(4)は、使用してなかったけど、
が来ていたので、念のため、
# make buildkernel && make installkernel
した。
結果、
# uname -r 6.1-RELEASE-p4
に。
