Skip to content

NP_Moblogを即時反映させる別の方法[マイサーバ向け]

メールで投稿した記事を即時反映させるには、NP_Moblogの設定「メール取得の間隔」を0秒にしておけばいいのだけど、さすがにサイトアクセスの度にメール受信させるのには気が引ける。標準設定の10分にしておけばほとんどの場合十分なんだけど、今構築しているサイト(当ブログじゃないです)は出来る限り速く反映させたいので、メールサーバが受信したときのみ即時にNP_Moblog(<%Moblog%>)を動かす、方法を考えた。

要約すれば簡単な話で、メールサーバ自身がブログ記事メール受信時に<%Moblog%>のあるページを読み込むようにしただけ。肝心なのはメールサーバを運用していて好き勝手にエイリアス設定できる人でないと無理なこと。フリーなメールサービスでメール受信時にあるサイトへアクセスしてくれる、もしくは任意のコマンドを実行できる機能を提供しているような物ってまだ無いですよね。モブログが流行れば専用アドレスを提供してくれるようなところが出てくるかもしれないけど...。でも、.forwardでコマンドを叩かせてくれる所はありそう。

一応私の環境はWebサーバもMailサーバも同じPCで動いているが、それは必須じゃないです。メールサーバにはPostfixを使ってます。が、他の物でもやり方はほとんど同じだと思う。

ブログURL
http://blog.example.com/
Moblog用メールアドレス
bloguser@example.com
メール受信専用スキン名
itemmailget
メール受信専用URL
http://blog.example.com/itemmailget.php
  • まず、「メインの目次ページ」に<%Moblog%>とだけ書いたメール受信専用スキン(itemmailget)を作る。それ以外の一般クライアントがアクセスするようなスキンから<%Moblog%>は全て削除しておく。
  • NP_Moblogの設定 「メール取得の間隔」を0秒に設定する。
  • メール受信用スクリプト(itemmailget.php)を用意する。
    <?php
    $CONF = array();
    $CONF['Self'] = '';
    include('./config.php');
    selectSkin('itemmailget');
    selector();
    ?>
  • エイリアスファイルもしくは.forwardにコマンドを追加する。
    エイリアス設定の場合
    bloguser:   /path/to/Maildir/ , "|cat > /dev/null;/usr/bin/wget http://blog.example.com/itemmailget.php -O /dev/null > /home/blogusers/bloguser/moblog.log 2>&1"
    .forwardの場合
    \bloguser,"|cat > /dev/null;/usr/bin/wget http://blog.example.com/itemmailget.php -O /dev/null > /path/to/moblog.log 2>&1"

私の場合、Moblog用アドレスは仮想アドレスで、仮想アドレス用エイリアスファイルを用意してPostfixに読み込ませています。Maildir形式で/path/to/Maildir/へローカル配送してます。と同時にwgetでメール受信用ページを読むように追加しました。wgetコマンドだけだと「パイプが切断されました」と痛そうな(^^;エラーが返ってくるので、一旦 "cat > /dev/null" としてパイプ経由で送られてくるメール内容を受け取って /dev/nullへ破棄してます。wgetが取得した内容も/dev/nullへ破棄してますが、wget自身の出力はエラーも含めてログとしてmoblog.logに保存してます。

.htaccessなどで、itemmailget.phpにはメールサーバからのみアクセス許可しておく方が安全かな。無理なら推測されにくいファイル名にしておくとか。まぁ、ナニも返ってこないし、わざわざいたずらするような人もいないと思うけど。それよりも、メールを標準入力から取得してNucleusに追加してくれるスクリプトを誰か書かないかなぁ。既にどこかにあるような気もするが...。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)