買っちまったな!

2008年12月25日 | Weblog
あっ、iPhone買いましたよ。9月末に(笑)。今頃書くなって?

ポイントねらいでヨドで一括購入。デビットカードなら10%だと思い、わざわざ本体のみ分けて買ったのに、VISAデビットって違うんだってね。知らずにポイント2%損こいたよ。払う前に言ってよ・・・知らない人、気をつけてね。

今のところ、最低料金で維持してます。あんま出歩かないしね。
そのうち機会があれば上限になる月もあるでしょう。

でも、この間2時間くらい出先で待ち時間があったんでパケット通信しようと思ったら・・・圏外でした(笑)。まぁ、滅多なことでは行かないような場所ではありましたが。

仮想メールサーバ4

2008年12月23日 | サーバ管理
仮想メールサーバの巻(?)、最後のネタになります。一服しようかとも思いましたが、そうすると二度と書かないような・・・(笑)。まぁ、こういうネタだと変なトラックバック残しそうな人が寄ってこなさそうなので、それはそれでいいかなと・・・?

メールの到着をトリガーにしてスクリプトを起動したいことってありますよね。今回は仮想メールサーバでそういうことするのはどうしたらいいの、ってお話です。っていうか、webプログラマが自分でメールサーバ用意しないとならないなんて理由があるとしたら、それしかないです。本来ならスクリプトを起動した後の動作からが守備範囲なわけですが、スクリプトを呼び出せるようになってるサーバ、そして希望の動作が仕組めるサーバって少ないですよね。そうなると、対応してるサーバから選ぶか、管理会社に対応するようお願いして済むものならそれで済みますが、そうでなければ自前で用意するしかないわけです。

今までもUNIXアカウントでは出来てましたよ。この場合は、

(1)まずはエイリアスの定義です。test@zonch.netにメールが来たら/・・・/script.phpというスクリプトを呼び出したい場合(・・・は適当なパス)、/etc/aliasesに

test: "|/・・・/script.php"

などと書きます、適当なエイリアス名と呼ばれるスクリプトをペアにして指定してやればいいわけです(newaliasesの実行を忘れずに)。ただ、testというのはUNIXアカウントですので、複数ドメインで運用している場合は、ドメインと一対一、つまりユーザーtest=test@zonch.netとは限らないわけです。そういう場合は、

(2)Postfixのバーチャルドメイン機能を使用して、etc/postfix/virtualにこう書きます。

zonch.net anything
test@zonch.net test

zonch.net anythingは必要らしいので、とりあえず入れます。次の行が、test@zonch.netに来たメールは、UNIXユーザーのtestに配信するという指定です。例えば、test以外の全てのzonch.net宛メールをtest2で受けたいなら、

zonch.net anything
test@zonch.net test
@zonch.net test2

なんて書きます。上から順に評価されてマッチするとそれ以上先には行かないので、test@zonch.netにマッチしなければ全て@zonch.netにマッチしてtest2に配送されます(postmap /etc/postfix/virtualとmain.cfのバーチャルドメイン設定を忘れずに)。

さて、仮想メールサーバでも同様な配送が出来るのかが、今回の最大のテーマだったわけですが、まずは参考ページの設定そのままで試してみます。前回までの設定で仮想アドレスには送受信できていたわけですが、まずはその設定のままでうまく行ったらラッキーなどという甘い考えで(笑)チャレンジ!・・・大方の予想通り、玉砕です。User Unknownだそうな。うむ、実にまっとうな動作。

どうしてよいかわからずしばらく検索&悩む日々。バーチャル設定にする前はうまく行っていたわけだから、変更前後で何が違うかログを眺めていると・・・

変更前は
relay=local

変更後は
relay=virtual

になってます。なるほど、そこで試しに他の設定は変えずに

local_transport = virtual  →  local_transport = local

にしてみると・・・relay=localとなってスクリプトが実行されました!!

virtual設定でもlocal配送になってくれさえすれば、スクリプトは呼び出せるわけですか。あっ、でもこの状態で仮想アドレス宛のメールを試してみると・・・メールが届きません。virtualにしたらlocalが、localにしたらvirtualが届かない・・これまたまっとうな動作で・・・いや、聞けば当たり前のようですが、これは何にもわからずやっている人間にとっては実に重要な作業です。動作がまっとうに思えるというのは、少しは理解が進んでるってことですから。

いろいろ調べてみると結局のところ、virtualなメールサーバにしようと思ったら、全てvirtualな配送になるってことらしいです。それじゃぁlocal配送しなければならないスクリプト起動はvirtualでは無理なのかってことになりますが、その場合は、virtualからlocalに流すことが出来るらしい。で、そのためのファイルが/etc/transportであることを発見。これには、配送がvirtualかlocalかの指定が出来るんです。中身はこんな感じ。

test@zonch.net local

こう書いておけばtest@zonch.net宛のメールはlocalとして配送されるので、virtual設定で今まで通りスクリプト起動が可能になります。ただし、このファイル、上から順に評価してマッチしたとこでストップするようなものではないので、例えば上で指定したような「それ以外全て」という様な処理は書けないことになります。希望の条件ごとにドメインを分けて、

@test.zonch.net local

などとし、test.zonch.netドメイン宛に送られたものはlocal配送などとして動作を分けるしかないと思います。

仮想メールサーバ3

2008年12月19日 | サーバ管理
さて、続いての問題は・・・メールボックスが読めません!test@zonch.net宛にメールを送ると、エラーメールも返ってきませんし、/usr/local/virtual/test@zonch.net/newを見ると、ちゃんとメールが届いています。なのに、メールを読みに行ってもメールがないって言われます。なんですか~、これ?

メール受信はDovecotのお仕事だから、そちらの設定の問題ですかね。参照したのは、こちら

設定したときに気になったのは、基本的な設定のところで

default_mail_env = maildir:~/Maildir

としておいて、バーチャルドメイン対応の設定のところで、

default_mail_env = maildir:/usr/local/virtual/%u

と設定しているところ。どう見ても・・・同じ変数ですよねぇ・・・どっちか、というかバーチャルドメイン対応の方だけじゃダメなん?

でもまぁ、そう書いてあるんだから両方入れておくかぁ・・・まぁ、後から書いた方で上書きされるんじゃないのかなと勝手に思い、入れておくことに。ただ、どこに書いていいのやらわからなかったんで、バーチャルドメイン対応の方はファイルの最後に付け足したのでした。今思えばこれが敗因・・・。

default_mail_envっていうのは、要するにメールデータがおいてある場所を指す。ただし、defaultって付いてるんで、特に明示的に指定されなければここを読むよ、ってこと。メールは正しく届いているはずなのにメールソフトで読みに行ったらないと言われる → Dovecotが全然違うメールフォルダを読みに行っている、と考えればつじつまが合う。

まぁ、今は結論わかってから書いてるからわかったような口ぶりだけど(笑)、全く見当が付かないときは、それはそれはどうしようかと頭抱えてましたよ。コンピュータといえども、専門外や知らないことになるとそんなもんです。

でまぁ、いろいろ試してようやく得た結論から書きますと・・・default_mail_envを書く位置がダメでした。default_mail_envの書く位置として用意されているところに書かないとダメなんですね。その位置には

default_mail_env = maildir:~/Maildir

を書いたんで、並べて2つ書くのもアホらしいかと最後の方に

default_mail_env = maildir:/usr/local/virtual/%u

を足したら、上書きどころか反映されなかったというわけでした。結局その設定ではどこを読みに行ってしまうかというと、

user_query = SELECT concat('/usr/local/virtual/', maildir) as home, 10000 as uid, 10000 as gid FROM mailbox WHERE username = '%u' AND active = '1'

でhomeを/usr/local/virtual/test@zonch.netと指定してるので、

default_mail_env = maildir:~/Maildir

が効いた状態だと/usr/local/virtual/test@zonch.net/Maildirを読みに行ってしまいます。メールが見つからないわけです。

で、結局どういう設定が有効かというと、私が試した範囲では、

1,default_mail_envを書く位置として用意されているところに、default_mail_env = maildir:/usr/local/virtual/%uのみ書く。同じ位置にdefault_mail_env = maildir:~/Maildirを並べて書いてもOKですが、意味なさそうなので。

2,あえてdefault_mail_envを指定しないってのでも読めました。homeをMySQLのクエリーで

user_query = SELECT concat('/usr/local/virtual/', maildir) as home, 10000 as uid, 10000 as gid FROM mailbox WHERE username = '%u' AND active = '1'

と指定してるんで、それは

default_mail_env = maildir:/usr/local/virtual/%u

とすることと同等ということだと思います。

3,homeをMySQLのクエリーで指定してるので、

default_mail_env = maildir:%h

なんてしても読めます。default_mail_envなしでもOKなら意味のある設定ではないかも知れませんが、試行錯誤してうまくいった設定の中にはこんなものもあったということで。

まぁ、どれがどの動作にどう影響してるかがわかると、設定のパターンは色々あるってことですね。大事なのはどれが正解かではなくて、こうして何かを変えることで変化を見る → その様子からソフトウェアがどういう仕組みになってるのかわかってくるということだと思います。
 
何かを修得しようと思ったら、もがかないとダメじゃないですかね。もがけば一つの問題からでも実にたくさんのことが学べると思います。「うまく行かない」のは苦しいことかも知れませんが、「(理解を深める)チャンス」じゃないですかね。私にはそう思えます。

仮想メールサーバ2

2008年12月18日 | サーバ管理
参照ページを参考にしながら・・・いや、ぶっちゃけそっくりそのまま設定したわけですが・・・動きません(笑)!

何ですか、これは、世の中そんなに甘くないってことなのですか(笑)?
人様の苦労した結果をそっくりいただくなんて許しませんよってことなのですか(爆)??

う~んまぁ、どっか設定ミスってるか、環境依存のどちらかでしょうけど。

で、まず何がダメだったかというと、PostfixAdminでユーザーの追加をするもののメールボックスが出来ません。そもそも使えないじゃないのこれじゃぁ。

PostfixAdmin自体はエラーも何にも返しません。何の問題もなくメールボックスが作成されてるように見えてデータもちゃんと入ってます。

Postfixのmain.cfで

virtual_mailbox_base = /usr/local/virtual

と設定した場合、PostfixAdminで、例えばtest@zonch.netってアドレスを新規に追加したとすると、

/usr/local/virtual/test@zonch.net

ってフォルダが出来て、その中に「ようこそ」メールが配送されるとありますが、test@zonch.netフォルダそのものが出来てません。これでは、送受信共に出来る状況にないことは明らか。こういう時はまずはログってわけで、etc/maillogを調べてみると、

NOQUEUE: reject: RCPT from localhost.localdomain[127.0.0.1]: 554 <test@zonch.net>: Relay access denied
warning: localhost.localdomain[127.0.0.1] sent non-SMTP command: To: test@zonch.net

てな感じのエラー発見。で・・・何ですかこれ(笑)?サーバ管理は本業ではないので、すぐには何だかわかりませんでした。

でもまぁ、内容と状況から察するに、localhost.localdomainってのが、ローカルサーバ内で「ようこそ」メール送ろうと試みたけど出来ませんでした、ってことでないの?つまり、自分で自分とこにメールが送れない(送るのが許可されてない)と。

となると、smtpの許可をしてるのは、main.cfのsmtpd_recipient_restrictions。調べてみると、

smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination

になってました。

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

にしたら、無事メールボックスが作成され、メールも配送されるようになりました(もちろん、mynetworksが正しく設定されている必要があるでしょう)。

参照ページには、赤字でpermit_sasl_authenticatedを足すようにという書き方をしていたのですが、私の設定には元から入っていたので、ここには何も足さなくていいものとスルーしてしまったのが原因でした。

で、この件に関しては結局のところ私の設定ミスということになりましたが、こういう現象が起きたらこういうミスを疑えって例にもなると思うので、載せておくことにしました。実際私も同じような現象がないかと探したんですが、見つかりませんでしたから。

仮想メールサーバ

2008年12月17日 | サーバ管理
たまには開発者らしいことも書こうかな~(って、いつも書けって?)。まぁ、ネタになりそうなこともあったりするんですが、そういうのが出てくる時ってたいていクソ忙しいときなので、暇になったらと思ってるとタイミングを逃したり・・・。

先週からメールサーバをいじってました。まぁ、これは開発ではないですし本業でもないわけですが、時にはそういうことが必要になったりもするわけです。

CentOS4にPostfix+Dovecotという構成。用途的に大したユーザー数もいないので、いままではUNIXユーザーを設定して実ユーザーで使ってました。これのどこがイヤかって、UNIXユーザーってパスワードを自由に設定できないのよね。単純なものや推測できそうなものだと「ダメっす!」って言われるので、自分でも全く覚えられないパスワードを設定することになります。
で、今回ちょっとユーザーというか別ドメインが増えそうということもあって、PostfixAdminを入れて仮想ユーザー管理にしようかなと目論んだわけでした。

おそらく有名なページだと思いますが、こちらなんかを参照しながらセットアップすることに。

PostfixAdminは、MySQLにデータを保持するらしい。MySQLはっていうと・・・4.1.20が入ってますね。4.1使うくらいなら、5入れたいところですが、う~ん・・・とりあえずまぁいいか。面倒だし(笑)。

でも、PostfixだけはデフォルトのインストールだとMySQL対応になってないらしいので入れ直すことに(2.2.10)。

一方。DovecotはMySQL対応になってるらしいのでそのまま利用することに(0.99.11)。

つづく・・・