Postfix から Gmail 経由でメールを送る

はて、そんなワケで昨日書いたとおり Gmail さんをメインなメール環境として使いはじめたワケです。

んが、それはそれでちょいと困ることがあります。
クライアントなりサーバーなりとして UNIX (Linux) なホストが LAN の中で動いているとしましょう。
そいつらは、いろんな監視機能で root (管理ユーザー) にメールを送りつけてくるワケです。
たとえば UPS がバッテリー駆動モードになったとか、RAID が異常だとか、redhat 由来ディストリだと1日1回 logWatch なメールが飛んできますね。

root アカウント宛のメールは root でスプールしていて、1日1回ログインして mutt (テキストインターフェースなメールリーダー) なりでちゃんと読むというのでも良いですが、面倒臭いので自分の一般権限アカウントに転送していることでしょう。

で、その一般権限アカウント宛メールはどうやって読むのか?やっぱしこれは Gmail に転送してくれれば面倒がなくて良いワケです。
というわけで、UNIX (Linux) で動いている MTA (Mail Transfer Agent:メールサーバーだと思って下せぇ) から外部にメールを送らなければならない曲面というのはやはり免れないようです。メンド臭いね。

というわけで、以下では RHEL、CentOS、Fedora で、Postfix を MTA として使っている場合に Gmail を経由して外部宛にメールを送るための設定を説明してみましょう。

OB25P 対策として submission ポート&SMTP AUTH の組み合わせを有効にする ISP が増えてるけんども、実は SMTP AUTH が CRAM-MD5 というパスワード暗号化 (符号化) 作戦を採るところが多く、そのせいで結構複雑な設定が必要になるところが多いのだけれども、Gmail の場合は SSL/TLS で通信レイヤーそのものを暗号化しているため、パスワードだけをわざわざ暗号化 (符号化) していないので、とっても簡単に対応できるのでありまする。
ただし、Gmail 特有の問題点もあるのだけれどもね。

はい、まずあなたの管理している Linux ホストの FQDN は何でしょう?
LAN の中では、特に Windows ホスト中心に構成されていて ActiveDirectory ドメインを形成していない LAN だとドメイン名 (NT ドメインに非ず) は意識していないカモしれません。

例えばあなた個人もしくはあなたの所属組織がインターネット上に「www.example.net」という FQDN で Web サイトを持っているとしたら、LAN のドメインは「private.example.net」のようなサブドメインにすると良いでしょう。

独自ドメインなんぞ持ってねェよ!という場合は、多くの書籍やら技術系サイトでは「何でも良い」と書いてありますが、これをテキトーに「hogehoge.co.jp」などと決めてしまうと、たまたまそのドメインが実際にインターネット上に存在してたりなんかして、そのドメイン宛にメールを送ったりする必要が発生するとワケのわかんないことになります。
その場合は「hogehoge」のように、ピリオドがないドメイン名 (TLD:トップレベルドメイン名のみ) として、実際に存在する TLD と重複しないモノにしましょう。

以下ではこういう FQDN であると仮定します。

FQDNlinux.private.example.net
ホスト名linux
ドメイン名private.example.net

はい、それでは Postfix を設定します。
/etc/postfix/main.cf をテキストエディタで以下の要領で編集します。これは RHEL / CentOS / Fedora の rpm パッケージをインストールしたときの標準状態の main.cf から、該当個所だけ変更するものと考えて下さい。

まずホスト名とドメイン名を以下のようにします。

myhostname = linux.private.example.net
mydomain = private.example.net

次に、例えば mail コマンド等でメールを送った場合 (cron の実行結果や監視系ツールが該当します) など、ドメイン部を指定しない、「@」の左側のみのメールアドレスにメールを送った場合にドメイン部をどのように修飾するかを指定します。今回の想定ではプライベートな LAN 内のホストなので、以下のようにします。

myorigin = $myhostname

ほん次。以下の記述は必ずそのままにしてください。このホストは別に他のホスト用にメール送信サーバーになるわけではないので、余計なことをしないに限ります。他のホストのメール送信サーバーはもちろん Gmail の SMTP サーバーを指定して下さい。

inet_interfaces = localhost

はい、お次。自ホスト内のユーザーに宛てたメールは基本的には自ホスト内で配送したいので、以下のように設定してくだせぇ。

mydestination = $myhostname,
                localhost.localdomain, localhost.$mydomain, localhost

Postfix の基本設定はこんなモンです。これはあくまでプライベート LAN 内の Linux ホスト用の設定であって、決してインターネットで公開するための設定ではないのでそこんとこはよろしく。

さて、いよいよ Gmail 用の設定です。上記 mydestination 以外のドメインに宛てたメールは Gmail さんに処理してもらうように、以下の用に設定します。

relayhost = [smtp.gmail.com]:587

smtp.gmail.com は TLS によって暗号化する必要があるので、以下の記述を追加してください。

smtp_use_tls = yes

さらに、plain 方式 (暗号化・符号化されていない) SMTP AUTH 認証が必要になるので、以下の記述も追加してください。

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

RHEL-4 / CentOS-4 の postfix-2.2.x の場合は、次の記述も必要です。

smtp_sasl_security_options =

さらにさらに、メール送信のトキに Gmail さんの TLS 証明書の妥当性が確認できぬ!と postfix が /var/log/maillog でぶーたれてくれやがるので、ルート証明書も指定しておきましょう。

smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt

RHEL-4 / CentOS-4 及びそれに相当する Fedora (バージョン忘れた) の場合はルート証明書ファイルのありかが異なります。以下のようにしてください。それより前のバージョンは知らない。

smtp_tls_CApath = /usr/share/ssl/certs/ca-bundle.crt

main.cf はこんなモンです。

次に、/etc/postfix/sasl_passwd というファイルを新規に作って、以下のように記述しておくんなさい。

[smtp.gmail.com]:587 [email protected]:パスワード

[email protected]」はあなたの Gmail のメールアドレス。「パスワード」はそのアカウントのパスワードです。Google Apps で独自ドメイン名で運用されている場合は、「[email protected]」に独自ドメインのメールアドレスを書けば良いです。

これはつまり、smtp.gmail.com のポート 587 番にメールを送り出すトキに、「[email protected]」というアカウントで指定のパスワードで認証してから送出することになります。

このファイルはおもいっきしパスワードが書いてあるので、以下のようにして root 以外は読めないようにしておくべきでしょう。

# chown root:root /etc/postfix/sasl_passwd
# chmod 600 /etc/postfix/sasl_passwd

はい、そしたらこのファイルを Postfix が認識できる hash 形式に変換します。

# postmap /etc/postfix/sasl_passwd

/etc/postfix/sasl_passwd.db というファイルができているのを確認しましょう。

ほしたら

# /etc/init.d/postfix restart

なんつって Postfix を再起動しましょう。そうそう、デフォルトで入ってる sendmail は yum とか rpm とかであらかじめ消しといてくださいねっと。

で、root 宛のメールは自分の Gmail アカウントに転送するようにしましょう。/etc/aliases を以下のように編集してください。

root: [email protected]

もちろん「[email protected]」は自分の Gmail アドレスもしくは Google Apps で運用している独自ドメインメールアドレス。
newaliases コマンドを実行しておくのも忘れないように。

# newaliases

では動作確認をしてみましょう。

以下のように実行してみて下さい。

$ mail root
Subject: THIS IS TEST < - Subject を入力
Sorry, THIS IS TEST <- 本文を入力
. <- ピリオドを入力
Cc: <- 単に Enter

ほんだら自分の Gmail のアカウントに Web ブラウザでログインして、「送信済みメール」に上記のメールが届いていることを確認してください。

ここでいくつか気がついたカモしれません。
まず、Gmail のローカルルールとして、自分 (SMTP AUTH で認証した本人) が送ったメールは「送信済みメール」に入ってしまうんです。なんか変な感じだけれども、そういうモンだっつーことで。

次に、メールの「差出人」のメールアドレスが、自分の Gmail アカウントのモノに上書きされてしまっています。
これも Gmail の場合はそういうモンです。
Gmail のアカウント設定で自分のメールアドレスとしていくつか設定できるワケですが、これにマッチしないモノは強制的に Gmail アカウントのメールアドレスに書き換えられてしまうのです。

つまりここに差し出し元として想定されるメールアドレスを全部登録しておけば良いのですが、例えば「[email protected]」なんつーメールアドレスは上で書いたように、インターネットには公開していないプライベート LAN 内でのみ有効なメールアドレスなので、Gmail からの「ホントにこのアドレス追加して良いのかい?」な確認メールを受け取れず、結局追加できないのです。まあすっぱりあきらめましょう。

はい、そんな感じで Gmail 特有の問題はいくつかあるものの、Postfix が送出するメールも Gmail 経由で送られるようになりました。Gmail 以外のドメインに宛てたメールもちゃんとリレーされますよん。

追記 (2008/11/7)

RHEL-4 / CentOS-4 の postfix-2.2.x の場合、「smtp_sasl_security_options =」が必要であることが判明したので追記。

コメント

  1. 黒さん より:

    御苦労様でした。参考にさせて頂きます。

  2. reread より:

    Hi, I think your website might be having browser compatibility issues. When I look at your blog site in Opera, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, superb blog!

  3. royal より:

    Hi Matchy, this is really interesting tutorial to send via postfix. Really appreciate that