Category: mail
ユーザごとに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を再起動。
備考
以上の設定で、目的は果たせたようです。
なお、上記の設定は、ほとんど、
を参考にしたものです。
