postfixでメールの送受信を可能にしたゾ

この記事はだいぶ前に書かれたものなので情報が古いかもしれません

僕はもう、DNSの設定をするときにゾーン設定でメールアドレスの設定さえやっておけばあとは勝手にメールが使えるようになるとか思ってたんですけど、やっぱりそんなことはないんですね。

というわけでですね、先日サーバーの構築をやった際、無事にサイトが動くのを確認した後にメールが使えるようにもしたので、今回はそのお話をば。

使用したモジュール、メール転送エージェント(MTA)とか言うんですか? は、postfixというやつです。



postfixを使った理由

ぶっちゃけそんなものは「サーバーに最初から入ってたから」でFA(ファイナルアンサー)です。それ以上でもそれ以下でもそれ以外でもそれ以内でもそれ以前でもそれ以後でもない。

以前、僕が今とは別の会社で受託開発をしていたとき、先方さんのサーバーでsendmailってやつの設定をしたことがありました。そんときのことはこのブログでも書いたんですけどね。

sendmailの設定

だからその単語は知ってたんで、たぶん設定するとなるとあのときと同じようなことするんだろうなぁと思っていたんですが、何と、僕が今回いじってるサーバーにはsendmailが入っておらんではないですか。いや、分からん。もしかしたらあったのかもしれない。ただ「sendmail」っていう単語が入ったファイルはいくつか見当たるんだけど、chkconfigでリスト表示したときに、あるはずのsendmailがなかった。

例によっていろんなサイトさんの情報を参考にさせてもらったんですが、たいていの人は、CentOSをインストールするとsendmailはデフォルトで入ってるよ的なことが書いてあるんですね。でもうちには入ってない。

何、俺、初期設定ミスったん? でもOSのインストールはクラウドサーバーの方でやってくれたし……。

そんな感じで、もう、正直焦りましてね。じっくり調べる時間があったんなら良かったんですが、すぐにでも使えるようにできないとまずかったので、知識ゼロの状態から短時間でそこまで持ってくとか俺にはムリ! お手上げ侍やーって感じで、ちょっと泣きそうでした。実際心の中では泣いてたかもしれない。だって女の子だもん。

嘘です。僕は男の子です。子ってか、この前30歳になったから、もはやただのおっさんです。

ってことで、途方に暮れようかどうしようか悩んでいたのですが、もう少し調べてみたら、sendmailじゃなくてpostfixっていう単語が目に入りまして、それでメールの送受信をやってるっていう情報が手に入りました。そして調べてみたら何と、うちのサーバーにも入ってるじゃないですか。途方に暮れなくて良かったー。

そんな経緯で、postfixを使うことになりましたとさ。おしまい。






あ、でも本題はここからだからね。まだ終わりじゃないぞよ。もうちょっとだけ続くんじゃ。

ちなみに、参考文献を読み漁ってみた限りでは、人によってファイルの置き場が違っていることがあったりして、だからここから先に記述するファイルのパスは、僕が使っているサーバーではここにありましたよってことで、よろしく頼みます。たぶん、ほとんどの場合は一緒だと思うんですけど、この記事を読んで「おい、そんなとこにファイルねーぞ。お前が瞬間移動させたのか? お前は引田天功なのか?」って場合は、わりっすけどちょっと頑張って探してみて。



main.cfの設定

じゃあ行きます。まずはmain.cfというファイルの設定です。viモードで編集して行きます。

//コマンド
# vi /etc/postfix/main.cf

//main.cfの編集部分
myhostname = ホスト名
mydomain = ドメイン名
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, $mydomain
mynetworks_style = host
relay_domains = $mydestination
home_mailbox = Maildir/
sendmail_path = /usr/sbin/sendmail

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
message_size_limit = 0
mailbox_size_limit = 0

はっきり言ってこれらが何を意味するかってのは、いつものごとくあまり理解していません。だからとりあえず、僕が書き換えたものだけを取り出してみました。

viモードでファイル開いて上から順番に見て行くと、そのうちこれらの記述されている行が見つかるから、順番に編集してってください。

まあ、一応分かる範囲でざっと説明していきますね。

「myhostname」は、ホスト名です。このサイトで言えば「norm-nois.com」ですかね。「mydomain」はドメイン名ですが、このサイトの場合、ホスト名とドメイン名は一緒なんで、やっぱり「norm-nois.com」になりますね。

ホスト名とドメイン名って、微妙に違うんですけど、でもその違いがあまり上手く説明できないんですよね、自分。

「myorigin」は、メールアドレスで@の後ろに来る文字を指定するやつみたいですね。上の例だとドメイン名と同じにしているので、例えば「akatsuki@norm-nois.com」みたいなメールアドレスが使えるようになるって感じです。ホスト名にしたいなら「$myhostname」と書けば良いようです。基本、main.cfのデフォルトはこっちになってるみたい。

「inet_interfaces」は……何だろ、受信設定みたいなもんでしょうか。これを設定しないと、外部からメールを受け取ることができないようです。上の例だと「all」にしてますから「来るものは拒まぬ! 我は誰のメールでも受信するぞ! さあ遠慮なく送って来るが良い、はっはっは! メリークリスマース!」っていう状態にしている……んですかね。これが「all」じゃなくて「localhost」ってなってると、同じサーバーの中でしかメールの送受信ができなくなってしまうんだと思います。

「mydestination」は、これも受信設定みたいなものなんですけど、僕の場合は「@ドメイン名」のメールアドレスだけ使えりゃ良かったんで、上のような書き方になってます。ホスト名とドメイン名が一緒だったら$myhostnameすら書かなくても良いかもね。

「mynetworks_style」はですね……どのネットワークを信頼するか、みたいな? ごめん、これはほんとによく分かってない。ただ「よく分からない場合はhostにするのが無難」って言ってる人を何人か見かけたので、そうしました。Gmailなんかを使っていると、どこを経由して来たメールかってのが分かるんですが、あれが関係しているのかな……?

これを、例えばIPアドレスなんかで指定したい場合は「mynetworks」というのがmain.cfの中にあるので、そっちで設定するみたいです。mynetworksの設定が有効になっていると、mynetworks_styleの方の設定は無視されるようです。

「relay_domains」は、リレーを許可するドメインです。リレーを許可するドメインって何だ? まあ、これを設定することで「@ドメイン名」宛のメールとかが無事に受け取れるなるってこと……ですかね。そういうことにしときましょう。

「home_mailbox」は、実際にサーバーで受信するメールの置き場所の指定ですね。これは後でまた出てくるので、後回しにしましょうか。

「sendmail_path」は、sendmail互換プログラムとかいうやつだそうです。何のこっちゃ。僕に言えることは、デフォルトだと「/usr/sbin/sendmail.postfix」となっているのですが、それだとプログラムが上手く動かないらしいので、「/usr/sbin/sendmail」に書き換える必要があるとのことです。



さて、今までのはmain.cfにデフォルトの記述があるものなので、それを書き換えて行く感じなのですが、ここから下は自分で書き加えているものです。

「smtpd_sasl_auth_enable」は、SASL認証ってやつを有効にするかどうかの設定です。yesにすることで有効になります。SASL認証っていうのは……うーんと……うーん……と、とにかく、有効にしておいた方がセキュリティ的には良いってことだっ。だから有効にしとこう。

「smtpd_sasl_security_options」は、これもSASL認証に関する設定ですね。「noanonymous」にすると、匿名での接続は許可されなくなります。得体の知れないやつには接続を許可してやらねーよってことですね。

「smtpd_recipient_restrictions」は、これも何を許可して何を拒否するかっていう設定なんですけど、「permit_〜」で書いたものは許可され、「reject_〜」で書かれたものは拒否されるようになります。上の場合だと、自分で設定したネットワークや認証をクリアしたものは許可するけど、そうじゃないものは拒否するよーって感じですね。これも詳しいことは分からん。説明は読んだんだけど、僕の頭じゃいまいち言ってることが咀嚼できないのよね。まあ、全体的に言えることなんですけど。

「message_size_limit」は、メールの容量に関する設定ですね。「0」に設定すると、容量が無制限、つまりどんなにサイズの大きいメールでも受け取るよっていう設定になります。本当は0じゃなくて、ちゃんと指定した方が良いのかな?

「mailbox_size_limit」は、メールボックスの容量ですね。これも「0」だと無制限になります。サーバーの容量とか気にして制限を設ける場合は、この設定が必要になりますね。



はい。ということで、これでmain.cfの設定は終わりです。保存を忘れずにね。



master.cfの設定

次はmaster.cfを編集します。

っつっても、こっちはコメントアウトされている行をいくつか解除するだけだから、そんなに難しいことはない。

//コマンド
# vi /etc/postfix/master.cf

//以下の三行をコメントアウト
submission inet n       -       n       -       -       smtpd
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

これだけです。これもコメントアウトが終わったら保存しましょう。



SASL認証を使用できる状態にする

SASL認証を使用できる状態にするっていう言い方が的確なのかはちょっと怪しいですが……とにかく行きます。

まずは、saslauthdというのを起動します。もしかしたらこの行程は必要ないかもしんないんですけど、僕はこのタイミングで起動してしまったので、一応やった通りに書いときますね。

# service saslauthd start

apacheとかと一緒ですね。

そしたら次は、smtpd.confというファイルの中身をちょこっと書き換える。

//コマンド
# vi /etc/sasl2/smtpd.conf

//以下のように変更
pwcheck_method: saslauthd
→pwcheck_method: auxprop

これはまあ、何でしょうね。認証に使うパスワードを、サーバーにログインするときのパスワードなんかとは別のものを使うための設定でしょうか。んで、そのパスワードを管理しているファイルがsasldb2って言うんですけど、それを使えるようにするための変更ってことで良いのかな。

これでメールを受信するユーザーのための設定ができました。「akatsuki@norm-nois.com」でいう「akatsuki」とかですね。そのユーザーは後で作成するので、今はここまで。



ちょっと一息つきましょうか。小休止を挟もう。またこっからながーい文章が続くから、目とか揉んどくと良いよ。



ユーザーを作成する前に

一つだけやっておきたい設定があるので、やっておきましょう。

さっき、main.cfの設定のところで「home_mailbox」というのを設定しましたよね。これを「Mailbox/」にすると、メールを格納するためのディレクトリ構成はこのようになります。例としてユーザーは「akatsuki」にしますね。

/home
  └ /akatsuki
     └ /Mailbox
        ├ /cur
        ├ /new
        └ /tmp

こんなん。ユーザーの下に「Mailbox」っていうフォルダがあって、更にその下に「cur」「new」「tmp」っていう三つのフォルダがある。ここにメールが届くんですね。新着メールだったらnewのフォルダとか、そういう感じでね。

で、これからその為のユーザーを作るわけなんですけど、ユーザー作成時に、自動的にこれらのフォルダも作成するための設定を、今から行います。

結論から行くと、やることはこの二行。

# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/

skelっていうディレクトリの下にフォルダを作成しておくと、ユーザーを作成したときに自動的にユーザーフォルダの下にそれらのフォルダをコピーしてくれるらしいです。



ここまでできたら、ひとまずpostfixを起動してみましょうか。ユーザーの作成はその後でもオッケーだ。

# service postfix start

無事に起動できたら、25番ポートにアクセス出来るか確認してみてください。以下のサイトで確認できます。

ポートチェック

もしアクセスできなければ、上の設定の「inet_interfaces」のところを書き間違えたか、ファイアウォールの設定で25番が閉じている可能性があるので、確認してみましょう。



ユーザーの作成

それじゃ、ユーザーの作成です。試しに「akatsuki」というユーザーを作ります。

# useradd akatsuki
# passwd akatsuki

そしたらさっきのあれ、sasl認証用の設定をこのakatsukiというユーザーに適用します。

# saslpasswd2 -u ドメイン名 akatsuki

パスワードの入力を求められるので、パスワードを設定してください。ドメイン名のとこはドメイン名を入れてください。norm-nois.comみたいなね。

無事に作成されていれば、以下のコマンドで登録されているユーザーをチェックすることができます。

# sasldblistusers2

//出力結果
akatsuki@norm-nois.com: userPassword

あとは一応、sasldb2をpostfixというユーザーが利用できるように、ディレクトリの権限やらパーミッションやらを変更します。

# chgrp postfix /etc/sasldb2
# chmod 640 /etc/sasldb2






設定は以上になります。お疲れさまっす。

実際にメールを送信してみて、無事に送れているか確認してみましょう。無事に送信できていれば、さっき設定した「Mailbox/new」のディレクトリにメールが届いてるはずです。僕は届きました。

本当はもうちょっといろいろ設定しなきゃいけないことがあるみたいなんですけど、それはおいおいですね。僕もまだやってないとこなので。

あ、でも一つだけ。おまけです。



転送設定

サーバーにメールが届くようになったは良いんですけど、まさかメールが来るたびにサーバーにアクセスして見に行くのもあれですし、どうせなら普段使ってるメールアドレスに転送してしまいましょう。

メールを別のアドレスに転送する場合は、まず先ほども出て来たmain.cfに以下の項目を追加します。

virtual_alias_domains = ドメイン名
virtual_alias_maps = hash:/etc/postfix/virtual

このvirtual_alias_domainsと、さっき設定したmydestinationが全く一緒の場合。今回がまさにそうですね。どちらにもドメイン名である「norm-nois.com」しか設定していないような場合、mydestinationの方は空の設定でも大丈夫みたいです。ってか、空にしないと「設定が被ってんぞ〜」っていうWarningエラーが出ます。

warning: do not list domain ドメイン名 in BOTH mydestination and virtual_alias_domains

こんなエラー。まあ、送受信自体はエラーが出てても問題なく動作するっぽいですけどね。

mydestination = 
virtual_alias_domains = ドメイン名

こんな感じで、コメントアウトするんじゃなくて、空の状態にしておけば、エラーは出なくなります。



次に、今出てきた「hash:〜」ってところのファイルを編集する。

//コマンド
# vi /etc/postfix/virtual

//以下の項目を追加
ドメイン名 anything
転送元アドレス 転送先アドレス

例えば、「akatsuki@norm-nois.com」っていうアドレスに来たメールを自分のGmailに転送したいと思ったら、こんな風になる。

norm-nois.com anything
akatsuki@norm-nois.com sample@gmail.com

転送先のアドレスは、コンマで区切ることで複数指定できるようです。

akatsuki@norm-nois.com sample@gmail.com, sample2@gmail.com

編集できたら、以下のコマンドで設定を反映させましょう。

//設定の反映
# /usr/sbin/postmap /etc/postfix/virtual

//postfixの再起動
# service postfix restart

これで、サーバーに届いたメールはgmailの方に転送されるようになります。

ああ、ただし、この書き方だと、サーバーの方にはメールが残りません。Gmailの方にしかメールが送信されなくなります。

もしサーバーにもメールを残したいって場合は、転送先のメールアドレスに自身も含むように書く必要があるっぽいです。

akatsuki@norm-nois.com akatsuki@norm-nois.com,sample@gmail.com



おっと、そうだ、ごめん。あと一つだけとか言っておきながら、もう一つおまけがあったわ。



infoを使う場合

これは別にinfoだけの話ではないんですけど、メールのユーザーにinfoを使いたい場合。「info@norm-nois.com」みたいな。

デフォルトの設定のままだと、infoにメールは届かないと思います。転送設定とかやっても上手くメールが届かない。僕はそうだった。

じゃあどうすんのかってことですが、以下のファイルを編集します。

//コマンド
# vi /etc/aliases

//以下の行をコメントアウト
info:postmaster
→#info:postmaster

編集したら、以下のコマンドで設定を反映させます。

# newaliases

どうやら、デフォルトだとinfoっていうユーザーに届くメールは、postmasterというユーザーが受信するような設定になってるみたいなんですね。僕はpostmasterっていうユーザーのメールボックス作ってないですから、そりゃどこにもメールが届かんって話なんですわ。

この「/etc/aliases」っていうファイルの中を見ると、info以外にもデフォルトの設定がpostmasterになっているのがあるので、それらのユーザーでメールを受信する場合には、同じような設定が必要になりますね。






さてさて。これで本当に以上ですね。

もうちょっとだけ続くんじゃと言っておきながらかなーり長くなりましたが、でもドラゴンボールだって17巻でそう言っておきながら、結局40巻超えたもんね。おんなじおんなじ。

まあ、たぶんこの設定でメールの送受信は可能になると思うんだけど、もしダメだったら一言ください。

あ、でもコメントの方に頼むね。「akatsuki@norm-nois.com」っていうメールアドレスは実在しませんから。送っても届きませんから。






追記(2013/07/04)

もし諸々設定してみて、それでもメールが上手く飛んで来ないみたいなことがあれば、こっちの記事で君の助けになれるかもしれない。

postfixはメールを受信しようとした。しかしパッケージが足りない!

忙しい人のためのサーバー構築手順 | 日記の間 | あかつきのお宿 2013年03月05日 16:13:52
[...] いずれ記事を書くことがあるかも? ・postfixの設定 ・バーチャルホストの設定 ・SSLの設定 [...]
もしかしたら何か関連しているかも?