Moblog とは、モバイル環境から Weblog することです。最近はカメラ付き携帯が普及しいつでもどこでも記録ができます。
私は mail2entry を使用して moblog を実現してみました。もちろんドキュメントもありますが、必要かつ最低限の内容 (かつ英語) ですので、不慣れな方にはちょっと難しいかもしれません。私のサイトで実現した方法を説明してみます。 私のベースシステムは FreeBSD 5 branch です。
まず、Mail2Entry からソースをダウンロードします。一番日付の新しいものをダウンロードするとよいでしょう。
$ fetch http://www.gweep.net/~aron/mail2entry/mail2entry20030506.tar.gz
つぎに、お使いの計算機に python がインストールされているか確認します。バージョンは 2.2.2 以上である必要があります。
$ which python
/usr/local/bin/python
こんな風に出力された場合、python はインストールされています。
FreeBSD の場合、 python はベースシステムに含まれていませんので、ports などからインストールします。
$ cd /usr/ports/lang/python
$ su
# make install
英語圏の場合これだけで python のインストールはおしまいなのですが、私たちのように日本語のメールを扱う場合を考えて、iso-2022-jp 文字コードを Unicode に変換するコードが mail2entry 内で使用されています。python をインストールしただけではこのコードが上手く動きませんので、Python Unicode codecs for Japanese charsets をインストールしなくてはなりません。これは JapaneseCodecs からダウンロードできます。FreeBSD では ports からも以下のようにインストールできます。
# cd /usr/ports/japanese/pycodec
# make install
これで python の準備はOKです。
つづいて mail2entry 本体のインストールと設定です。ダウンロードしておいたファイルを展開します。
$ tar xvzf mail2entry20030506.tar.gz
mail2entry20030506/
mail2entry20030506/parsemsg.py
mail2entry20030506/COPYING
mail2entry20030506/INSTALL
mail2entry20030506/README
mail2entry20030506/mail2entry.py
mail2entry20030506/postentry.py
mail2entry20030506/postimage.py
mail2entry20030506/saveimage.py
mail2entry20030506/settings.py
このディレクトリはどこに置いてもよいのですが、私は MT 下においています。
$ mv mail2entry20030506 /$MT/plugins/mail2entry
/$MT/ は mt.cgi のあるディレクトリです。次に settings.py を書き換えます。説明書きを読めばほとんど自明です。
$ vi settings.py
username:moblog として書き込む MT のユーザ名を指定します。通常書き込むユーザとは別のユーザを作成した方がよいでしょう(理由は以下)。
password:上記のユーザのパスワードです。悲しいことに平文で書き込まなければなりません。これが別のユーザを作成することを推奨する理由です。
blogid:moblog として書き込む blog の blogid です。blogid がわからない場合、MT の blog 管理画面に入り、ブラウザのアドレスバーを見てみてください。
http://www.example.com/$MT/mt.cgi?__mode=menu&blog_id=3
こんな記述があると思います。ここにある blog_id の番号を(もちろん半角英数で)指定します。
publish:moblog のエントリが投稿されたときに、同時に公開状態(publish)するかどうかを指定します。
savelocal:ローカルに保存するか、新しい XML-RPC API を使用して weblog にアップロードするかどうか指定します。
uri:上記の XML-RPC API の URI を指定します。"http://www.example.com/$MT/mt-xmlrpc.cgi" のような指定になると思います。
imagesdirpath:イメージが保存されるパスです。 savelocal に True が指定されている場合、絶対パスで、False が指定されている場合、Weblog からの相対パスで指定します。私は savelocal は True なので、"/usr/local/.../moblog/archives/images" のようにルートディレクトリからの絶対パスで指定しています(パスの途中は省略しています)。
imageurldir:上記の imagesdirpath に対する URL を指定します。
template:作成されるエントリの本文のテンプレートです。わからなければ変更しなくてOKです。
imgtemplate:作製される image タグのテンプレートです。わからなければ変更しなくてOKです。
logfilepath:エラーが起きたときのログのパスです。そのままでOKでしょう。
テストします。
$ cat file | python /path/to/mail2entry.py ./
file には適当な短いファイルを指定します。このファイルの内容が新しいエントリとしてテストに使われます。/path/to の部分は適宜読み替えてください。私の場合は /$MT/plugins/mail2entry/mail2entry.py になりますね。mail2entry.py の引数は mail2entry の置かれているディレクトリを指定します。私の場合は /$MT/plugins/mail2entry/ になりますが、今はこのディレクトリ内にいるということを仮定しているので、./ としています。
これでうまくいっていれば新しい blog に新しいエントリが作製されているはずです。何かうまくいっていない場合、logfilepath に指定したところにログができているのでそれを見て対処してください。
最後の大仕事、メールからデータを受け取り、スクリプトを起動してエントリを書き込む設定です。これは使用している MTA の設定ですから、ここですべての設定を書き込むことはできません。私の使用しているのは postfix なのでそれに関する設定を紹介します。おそらく sendmailでも同様にできると思います。qmail は最近使っていないのでわかりません。
aliases に :include: を使用して実現しています。:include: を使用せずに、直接 aliases 内にパイプでmail2entryに渡してもよいのですが、そうすると作製されるログなどの Owner がpostfixの実行ユーザになったりするので(設定によって異なります)、:include:をたたいています。
まず、実行するファイルを用意します。引き続き、/$MT/plugins/mail2entry/ 内にいるとして、
$ vi include
"| /usr/local/bin/python /$MT/plugins/mail2entry/mail2entry.py /$MT/plugins/mail2entry/"
とします。最初と最後の " (ダブルクオーテーション) および | (パイプ) も必要です。
次に、ファイルの所有者とモードを変えておきます。引き続き、/$MT/plugins/mail2entry/ 内にいるとして、私は www ユーザにしておきたいので、
$ su
# chown www *
# chmod 600 *
# chown www /tmp/log-tracebacks.log
とします。chmod はお守りの様なものです。
postfix のデフォルトの設定では、aliases 内に :include: を含むことを禁止しているので、 $postfix/main.cf 内に
allow_mail_to_commands = alias,forward,include
を追加して postfix を再起動します。
さあ、aliases を有効にしますよ。
# cd /etc/mail
# vi aliases
mail2entry: :include:/$MT/plugins/mail2entry/include
以上の行を追加します。一番最初の mail2entry というのはメールアドレスになるので好きなものを指定してください。この場合 mail2entry@example.com というアドレスが追加されたことになります。編集後は必ず newaliases を実行します。
# newaliases
これで終了です。何かおかしい場合、ファイルのパーミッションや、/tmp/log-trackbacks.log /var/log/maillog の内容などを調べてみてください。/$MT/ はあなたのサイトにあわせて設定してくださいね。
moblog のレイアウトについては dh さんが言及していますので、そちらを参考にしてください。
Enjoy!
追記の追記です。mail2entry のデフォルトでは たとえば携帯からのメールの題名に何がしかを入れて、本文には何も文章をいれずに(署名もなし)画像だけ添付した場合、BodyEmpty としてエントリが追加されません。これを回避するには mail2entry に手を入れるしかないと思います。
mail2entry のディレクトリ内に parsemsg.py というファイルがあります。これをお好みのエディタで開きます。
def check(this) :
if not this.__description :
raise BodyEmpty
if type(this.__description) is not types.UnicodeType :
raise BodyNotUTF8
という部分がありますので、BodyEmply にかかわる部分を以下のようにコメントアウトします。
def check(this) :
"""if not this.__description :
raise BodyEmpty"""
if type(this.__description) is not types.UnicodeType :
raise BodyNotUTF8
これで OK です。
さらに、mail2entry が自動的に作成する now.time (最新 moblog のタイムスタンプ)はそのシステムのタイムゾーンの識別子(JST)などをつけてくれるのにもかかわらず、GMTタイムで出力されてしまっています。
saveimage.py というファイルを開いて、
fileTimeString = time.strftime("%b %d %H:%M", time.gmtime())
というところを
fileTimeString = time.strftime("%b %d %H:%M", time.localtime())
に書き換えます。
python についてはほとんど知らないのですが、一応これでおしまいです。
コメント (13)
逆にメールから画像なしでエントリーを追加したいのですが・・・
これは無理でしょうか??
投稿者: araka | 2004年01月26日 13:49
日時: 2004年01月26日 13:49
上記の状態で、
Subject:test
Body: これはテスト。
というメール(もちろん画像なし)を投げてみると、
http://www.f-bell.net/blog/moblog/index.html
のように追加されました。あとはレイアウトとエントリを追加するblog_idを適切に設定すればよいのではないでしょうか?
投稿者: bell | 2004年01月26日 14:00
日時: 2004年01月26日 14:00
返事ありがとうございます!!
画像なしでメールを送信した場合
/tmp/log-tracebacks.logに
File "parsemsg.py", line 79, in handle_image_portion
raise SecondMIMEPartNotImage
SecondMIMEPartNotImage
というエラーがでます・・・
エントリは投稿されず、メール自体はmailqとしてたまります。
投稿者: araka | 2004年01月26日 16:23
日時: 2004年01月26日 16:23
なるほど、pythonはほとんど知らないのですが調べてみました。僕の結論は「最新のmail2entryを使用していないのではないか」です。
現在の最新はmail2entry20030506.tar.gzですが、これに含まれているparsemsg.pyに"SecondMIMEPartNotImage"というエラー定義はありません。
一方、一つ昔のソースはmail2entry-2003-03-10b.tgzです。これに添付されているparsemsg.py内にはhandle_image_portion(msg_part)という関数内に、
if not(re.match("^image$", msg_part.get_content_maintype(), re.IGNORECASE)):
raise SecondMIMEPartNotImage
という定義がされています。
よって解決策は、
1.現在つかっておられるparsemsg.pyの当該部分を適当に書き換える。
あるいは、
2.最新のソースを使う。
ではないでしょうか2.が簡単なのではないかと思います。
投稿者: bell | 2004年01月27日 18:37
日時: 2004年01月27日 18:37
ありがとうございます。
まさにバージョンの問題でした。
mail2entry-2002-12-25を使用していました・・・
バージョン変更後無事動いております。
動作するまでに2点程苦戦した部分がありましたのでメモさせて頂きます。
・/tmp/log-tracebacks.logにConnection error: could not connect to server: No such file or directoryとエラーがでる。
これはMovableTypeとデータベースの連携がうまくとれていない
場合に表示されるようです。私の場合はPostgreSQLがDOWNしていました。盲点でした・・・
・バーミッションの問題で画像が表示されない場合。
savelocalをFalseに変更することで対応できました。
という感じです。いろいろお世話になりました。
今は本文の改行が反映されない問題と格闘中です。
投稿者: araka | 2004年01月28日 14:22
日時: 2004年01月28日 14:22
すいません。問題が発生しておりまして、
アドバイスお願いできませんでしょうか?解決方法がわからないのです。
cat file | python /path/to/mail2entry.py ./
のところなのですが、
これを実行した後、ログにこのようなエラーが吐かれるのです。
2005-01-28 12:23
Traceback (most recent call last):
File "./mail2entry.py", line 35, in main
result = postentry.post(content)
File "/usr/local/www/cgi-bin-dist/mt/plugins/mail2entry/postentry.py", line 22, in post
weblogContent, publish)
File "/usr/local/lib/python2.4/xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "/usr/local/lib/python2.4/xmlrpclib.py", line 1383, in __request
verbose=self.__verbose
File "/usr/local/lib/python2.4/xmlrpclib.py", line 1129, in request
self.send_content(h, request_body)
File "/usr/local/lib/python2.4/xmlrpclib.py", line 1243, in send_content
connection.endheaders()
File "/usr/local/lib/python2.4/httplib.py", line 794, in endheaders
self._send_output()
File "/usr/local/lib/python2.4/httplib.py", line 675, in _send_output
self.send(msg)
File "/usr/local/lib/python2.4/httplib.py", line 642, in send
self.connect()
File "/usr/local/lib/python2.4/httplib.py", line 1068, in connect
sock.connect((self.host, self.port))
File "", line 1, in connect
gaierror: (7, 'No address associated with hostname')
--------------------------------------------------------
投稿者: boxfish | 2005年01月28日 12:29
日時: 2005年01月28日 12:29
今会社で確認できないのですが、トレースログの一番最後にgaierror: (7, 'No address associated with hostname')というエラーが表示されています。
ホスト名をIPに変換できていないようなのですが、名前解決はできていますか?
投稿者: bell | 2005年01月28日 12:58
日時: 2005年01月28日 12:58
同じエラーは再現しませんでしたが、settings.pyのuriは適切に設定されているでしょうか?
デフォルトではどうもhttps://〜/とSSL通信のhttpが指定されているようです。
uri = "http://サーバ名/hogehoge/mt-xmlrpc.cgi
のように外部からmt-xmlrpc.cgiを参照できるURIを適切に設定してみてください。
投稿者: bell | 2005年01月28日 22:22
日時: 2005年01月28日 22:22
お返事有難うございます。
メールを遅らせていただいたのですが、届いておりませんでしたでしょうか?
上記問題の件ですが、私勘違いしておりました。
savelocal=Trueにしていれば、
uriは設定する必要がないと思っていたために起こっておりました。
ただ、FreeBSD4.10のportsよりmovabletypeをインストールしたのですが、mt-xmlrpc.cgiは存在していませんでした。
同じくportsよりMT-PMをmake installすると、同ファイルが作成されました。(余談ですが、なぜportsのmovableは2.661とバージョンがふるいままなのでしょう?)
そして正しくuriを設定しなおして、
cat message | python ./mail2entry.py ./
してみたのですが、
今度は下記のエラーがでて悩み中です。
またアドバイスございましたら、お願いいたします。
Traceback (most recent call last):
File "./mail2entry.py", line 35, in main
result = postentry.post(content)
File "/usr/local/www/cgi-bin-dist/mt/plugins/mail2entry/postentry.py", line 22, in post
weblogContent, publish)
File "/usr/local/lib/python2.4/xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "/usr/local/lib/python2.4/xmlrpclib.py", line 1383, in __request
verbose=self.__verbose
File "/usr/local/lib/python2.4/xmlrpclib.py", line 1137, in request
headers
ProtocolError: <ProtocolError for next-vision.net/cgi-bin/mt/mt-xmlrpc.cgi: 401 Unauthorized>
--------------------------------------------------------
投稿者: boxfish | 2005年01月29日 08:39
日時: 2005年01月29日 08:39
追伸です。
エラーログは出ているのですが、所定の場所に画像ファイルは
転送されておりました。
でも、BLOGのエントリーには追加されていない状態です。
以上宜しくお願いいたします。
投稿者: boxfish | 2005年01月29日 09:02
日時: 2005年01月29日 09:02
401 Unauthorized
のエラーですので、Basic認証(ダイアログがでてユーザ名とパスワード)が要求される位置にmt-xmlrpc.cgiがあるのではないでしょうか?これはMTではなくWebサーバ側の問題となります。試しにBasic認証を必要とする設定にして見たところ、私も再現しました。
対応としては、
1 httpd.confや.htaccessを変更してBasic認証なしにmt-xmlrpc.cgiにアクセスできるようにする。
または
2 mt-xmlrpc.cgiだけBasic認証の必要なディレクトリの外に出す。
の二つが考えられますが、2の場合はおそらくInternal Server Errorかなんかで動かないと思います。$MT/にスクリプトがあることを想定していると思います。
FreeBSDのportsが最新でない理由はライセンスの問題でしょう。3以降でMTが有償となったことからも想像できます。License agreementなしにソース媒体の再配布を禁じているのではないでしょうか?
投稿者: bell | 2005年01月29日 11:50
日時: 2005年01月29日 11:50
うーん。色々調べているのですが、原因がわかりません。
解せないのは、mt-xmlrpc.cgiとmt.cgiが同じ階層に存在していることです。
mt.cgiはBasic認証なしに直接起動しているように思います。
同じ階層にあるmt-xmlrpc.cgiだけが、Basic認証を要求されることってあるのでしょうか?
また、現在、apacheの設定では、Basic認証に関しての設定は一切手を加えておらず、おそらくどのディレクトリに関してもBasic認証は発動しないと考えております。
なにかよいアドバイスありましたら宜しくお願いいたします。
投稿者: boxfish | 2005年01月30日 21:03
日時: 2005年01月30日 21:03
問題解決いたしました!
mt-xmlrpc.cgiとmt.cgiが同階層に存在しているので、
Basic認証がそのディレクトリに対して掛かっているわけではありませんでした。
HOSTSの問題でした。
指定したドメインでアクセスすると、グローバルIPが取得され、
ADSLモデムの管理画面が呼ばれていたのです。
その画面がBasic認証を要求していたと言う訳です。
なので、HOSTSにドメイン名=ローカルIPを振ってやり、cat 〜
を行うと、見事エントリーに追加されていました。
アドバイスどうもありがとうございました。
(もっと早く気づくべきでした。情けない・・・・)
投稿者: boxfish | 2005年02月01日 09:17
日時: 2005年02月01日 09:17