別の所に書いていた日記なんですが、エライ苦戦したので、Blogにアップしておきます。 レシピはOpenPNEへ携帯から日記投稿機能の設定です。 以前会社でSNSを構築した際に、 SNSにOpenPNE,メールサーバーにPostfix + Dovecot + Procmailで構築したんですが、携帯からの投稿機能を最後の最後に回していて、すっかりわすれていたんですね。 実際に投稿しようとしてエラーになって、初めて思い出したんです。迂闊。 「こんなのちょろいだろ〜」とか思っていたのですが・・・        大 苦 戦 ヽ(´Д`;)ノアゥア... 誰かが二の鉄を踏まないようにアップします。 まず構成を書いておきましょうか メールサーバはPostfixを使っていて、受信用にDovecot。メール振り分けにProcmailを使っています。

受信メールをユーザーのメールボックスへ送信設定

SNSを立てた時に、送信側は設定していたんですけど受信側が手付かずだったので、まずこのマシンのユーザーにメールが届くように設定しました。 早速此処からトラブルです。/etc/log/mail.logを見ると、
 
(expanded from ): can't create user output file. Command output: procmail: Renaming bogus mailbox
"/var/mail/snsadmin" info "/var/mail/BOGUS.snsadmin.Xj0y" procmail:
Couldn't create "/var/mail/snsadmin" procmail: Couldn't chdir to
"/home/snsadmin/Maildir" procmail: Couldn't create or rename temp file
"./tmp/1162346941.5352_0.sns.example.com"
なんて事をおっしゃる。 要するに書き込み権限が無いよって言われているんだが・・・ Procmailって何の権限で動いているんだ!? rootではないな・・・と思い。手当たり次第Mailboxをpostfix : postdropに設定して回るもダメ・。 仕方ないので、秘奥義" chmod 777 *" を発動。・・・全然ダメ。 行き詰まったので、google先生に質問すると、procmailrcが怪しい。 メーリングリストとか漁っていたら、書くユーザーのホームディレクトリに.procmailrcを書くと各ユーザーごとに反映されるらしい。 というわけで、実際に
SHELL=/bin/bash
PATH=/usr/bin:/bin
DROPPRIVS=yes
MAILDIR=$HOME/Maildir
LOGFILE=$HOME/procmail.log
というファイルをホームディレクトリに置いてみたら、あっさりOK。デーモンがユーザー単位でrc読んでいるって感覚がよくつかめてないけど、とりあえず解決。 各ユーザー宛のメールは、ユーザの権限で書き込みされるようだ。具体的に言えば、hogeユーザーのMaildirにはhoge:hoge権限でOK

OpenPNEの携帯投稿スクリプトに受け取ったメールを転送

次に実際に携帯メールでsnsに投稿してみると・・・ あて先が[b2-1f.....386397@sns.example.com]のように乱数がユーザー名になっている・・・ これは参った。しかも全員違うらしい。 メール投稿の仕組みはメールの内容を "/OpenPneルート/bin/mail.php"に渡してあげればよいのだが・・・ メールアドレスのユーザー名と、システムのユーザー名をマッピングしているのがエイリアス (/etc/aliases または /etc/postfix/aliases)なのだけど、まさか此処に全ユーザー入れて、システムに全ユーザー登録するのも現実的でないし、毎回ユーザー名変わったらそれだけでアウト。 なんとかユーザー名以外で取りたい。 始めは正規表現でいけないかと思ったのだけれど、上手く行かない。regexpテーブルって有るんだけどなぁ・・・(´・ω・`)ショボーン 今度はvirtualドメインを使ってみるコレはいけそう! と思いきや今度はvirtualドメインだとコマンドが投げられない。 ・・・(,,゚Д゚)† (この辺りで悶絶) この後あれこれ試して、ようやく見つけた解決法が、 これ
/etc/postfix/main.cf
virtual_alias_maps = hash:/etc/postfix/virtual
alias_maps = hash:/etc/aliases

/etc/postfix/virtual
@sns.example.com sns_mailphp

/etc/aliases
sns_mailphp: "|/usr/bin/php /var/www/sns/bin/mail.php"
要するに何をしているかというと、 virtual_host_mapsで/etc/postfix/virtualを読み込んで、此処で@sns.example.comドメイン宛に飛んできたメールをsns_mailphpという架空のユーザーに割り当て。 そのあとaliasesをlookupして、sns_mailphpがマッピングしている"|/usr/bin/php /var/www/sns/bin/mail.php"コマンドを呼び出す・・と。 (補足:ちなみにsns_mailphpというユーザーをOSに作成する必要はない) こうしてみると結構単純なんだけど、知らなかったからえらい時間食った。 ・・・やれやれ。