Archive for the ‘postfix’ Category

以前、「指定したドメインのメールを受け取る」という話で、
個別に指定したドメインは自分で受け取ってしまうということをやったが、

これの応用版として、「指定したドメイン以外はすべて自分で受け取る」

これは、よく大量メールの配信テストなどをしているときに、適当にメールアドレスを作って、
仮に、本当にそのドメインがあったとしても、外にメールが飛ばないということができる。
このような完全一致ではなく、あるパターンに一致したときには・・・となると、
設定に正規表現を使う方がよりスムーズだ。

そのために、Postfixで正規表現が使えるかを確認しよう。

確認方法

#postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
static
unix

のように、regexpやpcreが表示されれば問題ない。
(これからの例はregexpなので、pcreを使う場合の正規表現は別の形になるかもしれない。)

では、具体的に、あるメールアドレスがPostfixはどのように処理されるのだろうか?

http://www.postfix-jp.info/trans-2.2/jhtml/transport.5.html
を見ると、どのようにメールの配信方法が決定されるかがわかる。

以前は、このmydestinationを使ってしまったので、
非常に簡単にまた、直観的に設定できた。
今回は、virtual_mailbox_domainsを使って、
その設定に正規表現を使うようにする。

まず、正規表現を使う場所を決める。
つまり、どの処理から分岐をするか?ということだ。

そこには、そのまま、virtual_mailbox_domains に、 virtual_mailbox_mapsを使うことにした。
まず、以下のファイルを作成する。
/etc/postfix/virtual_mailbox_maps.regexp

/(.*)/!/(coltware.com)$/      /dummy/Maildir/

(ファイル名にルールはありません。)

これで、coltware.comというサーバ以外のサーバは、/dummy/Maildir/というディレクトリにMaildir形式で保存される。
自分サーバ向けは、mydestinationで指定されているので、このように、すべてに一致(.*)で、
かつ(coltware.com)以外ということにした。

本当に設定する前に、正しく正規表現が動くのかテストしましょう。

postmap -q "テストする文字列" regexp:/etc/postfix/virtual_mailbox_maps.regexp

で、結果(/dummy/Maildir/の文字列)が返ってきます。
もちろん、coltware.comのドメインの場合には、何も帰ってきません。

では実際の設定です。

virtual_mailbox_base = /
virtual_mailbox_maps = regexp:/etc/postfix/virtual_mailbox_maps.regexp
virtual_mailbox_domains = $virtual_mailbox_maps
virtual_uid_maps = static:89
virtual_gid_maps = static:89

ここで、virtual_mailbox_baseは、先ほど、/dummy/Maildir/と指定したときに前に、このパスがつくのだが、
私は設定時に今後も完全にパスを指定したかったので”/”としました。
また、

virtual_uid_maps = static:89
virtual_gid_maps = static:89

は、メールファイルが保存されるときの、uidとgidなので、好きなuid,gidを設定してください。

で、この後に、postfixを再起動してください。

とこのようにすることで、自宅内にたてたテストメール配信サーバも、間違っても自分のサーバにしか飛ばないというわけです。
また、いろいろと正規表現をカスタマイズしていくことで、いろいろと出来てきます。

また、今回は、virtual_mailbox_domainsを使いましたが、あるドメインの配信先をsmtpからlocalに変えるという概念のほうが、よりわかりやすいので、transport_mapsを使ってもいいのですが、自分宛にメールが送られてから、そのメールをどのようにするか?
という設定を含めると、自分的には面倒なので使いませんでした。

余談:
これは本文とはまったく関係がないのですが、クラウドなどでよりサーバの設計はアプリケーションエンジニアのほうに仕事が移ってくるでしょう。
それに、このような要件は、サーバ構築で発生するわけではなく、機能定義で出てきます。
したがって、アプリケーションエンジニアがミドルウェアがどの程度までできるか?ということを把握することは非常に大切です。

また、これらの要件がまっさらから作ろうとすると非常に多くのコストがかかってしまいます。
クラウド時代の到達とともに、アプリケーションエンジニアが、サーバ構成・システム構成から設計できることは、スピードとコストを最大限にするためにも、今後ますます重要になってくるのではないでしょうか?

Postfix とdovecotを使ってSMTP AUTHを使えるようにする必要性が出てきた。
というのも、gmailではSMTP AUTHが必須になっているので、このテストのためにもこの設定が必要だ。

このSMTP AUTHの問題さえ解決できれば私が作っているAdobe AIR版SMTPライブラリでメールがGmailを使って送れるようになる。
すでに、POP3版もできているので、これがそろえば送受信が行える。

幸いにも認証方法はLOGIN PLAINになっているので、dovecotで十分だ。
ちなみに、Postfixとdovecotのインストールがされていることが前提なので注意。

さて、PostfixでSMTP AUTHを使えるようにするにはというのをさがしてみるとPostfixの再インストールがされているものばかり。
しかし、最近インストールしたものなので、再インストールは必要ないだろうということで、それを確認する。

#postconf -a
cyrus
dovecot

SMTPの認証にcyrusというのとdovecotが使えると出力されているので、問題なくdovecotが使えるのが確認できた。
このあたりの確認方法は

man postconf

と打てば使いかたは出てくる。

-a List the available SASL server plug-in types. The SASL plug-in type is selected
with the smtpd_sasl_type configuration parameter by specifying one of the names
listed below.
cyrus This server plug-in is available when Postfix is built with Cyrus SASL sup-
port.
dovecot
This server plug-in requires the Dovecot authentication server.
This feature is available with Postfix 2.3 and later.

と出てきたので、Version が2.3より新しければだいたい大丈夫なのかもしれない。

また、postconfはこれから設定ファイルを変更するのだが、その設定がきちんと設定されているかなどを確認するのにも使う。
(私自身、スペルを間違ってしまってはまってしまったなんて時に、これを使って再確認する。)

さて、Postfixとdovecotの設定を行う。

詳しい設定は、http://www.postfix.org/SASL_README.html#build_dovecotにあるので、こちらを見てほしい。

しかし、ここではプログラム確認のためのサーバなのでセキュリティやら何やらの設定はいらない。
できるだけ、何の制約もなく使えるようにしたいので、必要最低限の設定を行う。
なので、実際の運用に使うものの設定ではないので、ご注意頂きたい。

/etc/postfix/main.cf 以下を追加

smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

/<どこかのパス>/dovecot.conf
以下のような記述が既にあるので、下記を参考に変更、もしくは頭の#を取って設定を有効にする。

auth default {
mechanisms = plain login
:
途中省略
:
socket listen {
  client {
  path = /var/spool/postfix/private/auth
  mode = 0660
  user = postfix
  group = postfix
  }
 }
}

これで、postfixとdovecotを再起動すれば問題ない。
ちなみに、テストで

$telnet localhsot 25 <-- (入力)
220 localhost ESMTP Postfix
EHLO localhost <-- (入力)
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN <-- (入力)
334 VXNlcm5hbWU6
xxxxxxxxxx <-- (入力)ここにLogin Userをbase64した形で入力
334 UGFzc3dvcmQ6
yyyyyyyyyy <-- (入力)ここにPasswordをbase64した形で入力
235 2.0.0 Authentication successful
QUIT <-- (入力)
221 2.0.0 Bye

ちなみに、
334 VXNlcm5hbWU6
などのように出力されるが、

これは、
334 Username:
と出力されている。VX..の部分がBASE64でエンコードされているだけだ。
また、UGFzc3dvcmQ6は「Password:」と出力されている。

このあたりが、BASE64でどうせセキュリティがほとんどないのに、このようになっている意味はよくわからない。

今回はFlexとか関係なくちょっとメールについてのお話です。

Postfixとなっていますが、基本的なネタはPostfixとは関係がありませんし、電子メールを知らない人には「へー」そんなふうにしてメルマガとかっておくられているんだー。ということを知っていただければと思います。

ただ、私はそんな手法に1つに名前がついているとは知りませんでした。
それがVERPというらしいです。

ちなみに、PostfixのVERP Howtoはこちらです。

さて、皆さんが受信しているメルマガとかのメールヘッダを見たことをがありますか?

今回はメールヘッダの部分で、Return-Pathという項目についてです。こちら、メールを配信して、エラーとなった場合などにそのメールアドレスに返事を返すためのメールアドレスです。ではメールを書くときにFromなどでもエラーが帰ってくるのですが、これはFromとこのReturn-Pathが同じようにしているだけなのです。基本的にエラーはこのReturn-Pathに帰るのです。

メルマガなどでメールを送るときには、このReturn-PathのメールアドレスとFromのメールアドレスを違ったものにします。

つまり、機械的なエラーはReturn-Pathに帰り、返事はFromというようにするのです。
こうするのは、機械的なエラーを自動的に処理したいからなのです。

このPostfixのVERPの機能で説明すれば、

user@domain へメールを送りたいときに、このReturn-Pathには owner-listname+user=domain@origin のようなメールアドレスにすると説明には書いてあります。
そう、Return-Pathに送り先の情報が隠れているのです。

これで、user@domainにメールが届かない場合には、owner-listname+user=domain@origin がメールを受け取るので、そのメールアドレスを見れば、だれ宛のメールがエラーなのかわかるというわけです。

ちなみに、通常のメルマガではこんな簡単なふうにはしないでしょう。
たいてい、何やら暗号らしきアルファベットやら、数字やらがあるとおもいますが、これが送り主のみ知っている内部のユーザ識別IDというわけです。

ただ、こういった機能がPostfixにはデフォルトであるのですね。びっくりです。

ただし、この機能は使わないほうがいいですよ。
携帯とかのメールアドレスで最大までつける人がいるんですよ。
そしたら、そのメールアドレスにほかの情報をつけるんで、最大をこえますよね。
そのせいでメールが送れなくなることがあるんです。

エラーを追跡するための情報が原因でエラーになるなんてしゃれにならないですからね。

今から書くことは決して、メールサーバ(Postfix)を運用するためのノウハウではないのであしからず。
ただし、開発者がメール関係の開発をするときにテストとして知っておいたほうがいいとは思います。

また、サーバ系のミドルウェアに全くタッチしない人も、このような内容をしっているとちょっとはいいかもと思うこともあるかも知れません。

さて、今回のお題は「社外にメールを配信しても、実際には飛ばないようにしたい」という話です。
メールアドレスを適当に作ってしまい、それをもとにテスト配信したいのですが、実際飛んでしまっても困りますし、
でも、そのメール捨てられても困るんですよね。
さらに、贅沢なことに、一部のメールはほんとに飛んでほしいですよ。

ってことで、Postfixを使って、docomo.ne.jpとかにメールを出しても、そのサーバで受取る。ということをしたいと思います。

余談ですが・・・
その前に、あなたのLinuxにはPostfixはもしかしたら入っていないかもしれません。
でも、Redhat系ならばRPMで入っているでしょうから、sendmail を削除し、postfixをインストールしてください。
あなたが既にsendmail使いならいいのですが、postfixのほうがプログラマには向いていると思いますよ。
また、高速配信ならqmailだー!って人もいますが、あなたの高速配信ってどのレベルですか?
秒間数百通送りたい!!って人ならいいのですが、通常、日本でそんな需要はないですよ。
ちなみに高速配信するには、サーバの並列稼働が必要なのでアプリケーションレベルのみで解決はほぼできません。
だって、受け取り側が受け取ってくれないのですから・・・・
したがって、使いやすいMTAが一番。

さて、話をもどして、postfixで指定したドメインの受信をするには、

/etc/postfix/main.cf

のファイルを修正します。

mydestination The mydestination parameter specifies the list of domains that this
machine considers itself the final destination for.
  

って、設定ファイルには書いてあります。
要するに、このパラメータで指定したドメインは、このマシンが受け取るよ。ってことです。

なので、ここの設定に、

mydestination = $myhostname, localhost.$mydomain, localhost,
      ezweb.ne.jp, softbank.ne.jp, docomo.ne.jp

こんな感じに記述してしまえば、このサーバからのezwebや、docomo、softbank向けのメールはぜーーーんぶ、このサーバが受け取ってしまうということ。

あとは、

/etc/init.d/postfix restart

を忘れないでください。

じゃないと、ほんとに飛んでしまいますよ。
念のために、自分の携帯アドレスで確認してから実行してくださいね。失敗しても責任は負えませんので・・・

RSS
Add to Google

カスタム検索
ソフトウェア&ライブラリ


ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2010年3月
« 2月    
1234567
891011121314
15161718192021
22232425262728
293031  
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ