« moblog | メイン | なべ?水炊き? »

mail2entry

 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 についてはほとんど知らないのですが、一応これでおしまいです。

トラックバック

このエントリーのトラックバックURL:
http://www.f-bell.net/cgi-bin/MT/mt-tb.cgi/496

この一覧は、次のエントリーを参照しています: mail2entry:

» mail2entryインストール 送信元 Funky Life
ちょっと前にmoblog.uva.ne.jpさんの設定を変えたらmoblogできなくなってしまった。もとの設定に戻したつもりがうまくいかないので、自前でインストールすることにしてみた。 bell's diaryさんにわりと詳しく、しかもPostfix使ってるバージョンの記録があったので、だいた... [詳しくはこちら]

» moblog? 送信元 PC日記
携帯から(と言うかメールからですな)blogを登録するのを、moblogとか言うらしい。 Bell's Diary: mail2entry Moblog とは、モバイル環境から Weblog することです。最近はカメラ付き携帯が普及しいつでもどこでも記録ができます。 ここのサイトが大変参考になったので、... [詳しくはこちら]

» mail2entryインストール成功! 送信元 はーめるんの日々の記録 MT版
結構苦労しましたが、無事に、mail2entryをインストールすることに成功しました!(^^) メールからエントリーを投稿できるようになり、携帯電話から画像も投稿できるようになりました。 以下の情報を参考にさせて頂きました。感謝、感謝です。 Funky Life: mail2entryイン... [詳しくはこちら]

» mail2entry 送信元 OSX
MOVABLETYPE モブログ mail2entry 携帯電話 [詳しくはこちら]

» Moblog設定メモ 送信元 そらろぐ(仮)
Moblog(モバイルでblogすることらしい)がやってみたくて、mail2entry というものを 入れてみたので、その際のメモ。 MOVABLE TYPEの日本での第一人者であるヒラタさんのサイトが行っている moblog.uva.ne.jp のサービスを使えば、自分のサイトで設定しなくてもできるらし... [詳しくはこちら]

» Debian(woody)へのmoblog導入 送信元 はぐれ日誌
こちらをお借りしてmoblog機能をつけるのが普通らしいのですが、 折角自分で鯖立ててるのでその仕組みごと実装してやろうでないの奮闘記です。 こちらよると 必要なのは mail2entry Python(>=2.2.2) Python Unicode codecs for Japanese charsets 無道鯖のPythonのバージ... [詳しくはこちら]

» Moblog 送信元 Funkalogic
Joi Ito’s Web: mail2entry moblog code update matsubokkuri: mail2entry Bell’s Memorandum: mail2entry... [詳しくはこちら]

» モブログ::mail2entry導入 送信元 林檎のある生活
モブログを導入しました。意外と簡単にできたので驚いています。 [詳しくはこちら]

» mail2entryを実装するには 送信元 msmc::LABO
Bell's Memorandum: MovableType Archives ... [詳しくはこちら]

» 携帯からPOST 送信元 kamata-net.com
暇に任せて日記を携帯から更新できるようにした。いわゆるmoblogですね。 画像つきの投稿にはMail2Entryを使用します。Bell's Memorandumさんのところに、qmailとの組み合わせはMATSUBOKKURIさんに詳しくあります。 携帯からの細かな編集には、mt4iをtonkeyさんが独自拡張... [詳しくはこちら]

» モブログにしました 送信元 Tony2Chopper Weblog
ほとんどBell's Memorandum: mail2entryを参考にしました。 ほとんどというのは、文字化けしてしまったからです。 文字化け以外は上記参考サイトに非常に詳しく説明されているので、結構簡単に出来ました。 この文字化けは、「XML::Parser モジュールを入れていると、 Mov... [詳しくはこちら]

» 「Movable Type」設置奮闘記(ぉぃ) 送信元 TSJ付゛録゛
 昨日より自サイトに、Weblogプログラムである「Movable Type」(日本語版)の設置をおこなっておりましたが、本日ようやくできました。 ●設置したブログ → うちログ @ 内房線向上委員会 (携帯電話対応)  「Movable Type」(以下MT)は敷居が高いとよく言われる... [詳しくはこちら]

» mail2entryも入れました。 送信元 たかむらさん自前のblog
携帯電話からの画像ポストもOKになりました。 qmail関係は http://c... [詳しくはこちら]

» mail2entry導入。 送信元 loungelabel.com
先日のHyper Estraier導入にヒントを得たので、いまさらながら(笑)m... [詳しくはこちら]

コメント (13)

araka:

逆にメールから画像なしでエントリーを追加したいのですが・・・
これは無理でしょうか??

bell:

上記の状態で、

Subject:test
Body: これはテスト。

というメール(もちろん画像なし)を投げてみると、
http://www.f-bell.net/blog/moblog/index.html
のように追加されました。あとはレイアウトとエントリを追加するblog_idを適切に設定すればよいのではないでしょうか?

araka:

返事ありがとうございます!!
画像なしでメールを送信した場合
/tmp/log-tracebacks.logに
File "parsemsg.py", line 79, in handle_image_portion
raise SecondMIMEPartNotImage
SecondMIMEPartNotImage
というエラーがでます・・・
エントリは投稿されず、メール自体はmailqとしてたまります。

bell:

なるほど、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.が簡単なのではないかと思います。

araka:

ありがとうございます。
まさにバージョンの問題でした。
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に変更することで対応できました。

という感じです。いろいろお世話になりました。
今は本文の改行が反映されない問題と格闘中です。

すいません。問題が発生しておりまして、
アドバイスお願いできませんでしょうか?解決方法がわからないのです。

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')
--------------------------------------------------------

bell:

今会社で確認できないのですが、トレースログの一番最後にgaierror: (7, 'No address associated with hostname')というエラーが表示されています。

ホスト名をIPに変換できていないようなのですが、名前解決はできていますか?

bell:

同じエラーは再現しませんでしたが、settings.pyのuriは適切に設定されているでしょうか?

デフォルトではどうもhttps://〜/とSSL通信のhttpが指定されているようです。

uri = "http://サーバ名/hogehoge/mt-xmlrpc.cgi

のように外部からmt-xmlrpc.cgiを参照できるURIを適切に設定してみてください。

お返事有難うございます。
メールを遅らせていただいたのですが、届いておりませんでしたでしょうか?

上記問題の件ですが、私勘違いしておりました。
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>
--------------------------------------------------------

追伸です。

エラーログは出ているのですが、所定の場所に画像ファイルは
転送されておりました。
でも、BLOGのエントリーには追加されていない状態です。

以上宜しくお願いいたします。

bell:

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なしにソース媒体の再配布を禁じているのではないでしょうか?

うーん。色々調べているのですが、原因がわかりません。
解せないのは、mt-xmlrpc.cgiとmt.cgiが同じ階層に存在していることです。
mt.cgiはBasic認証なしに直接起動しているように思います。
同じ階層にあるmt-xmlrpc.cgiだけが、Basic認証を要求されることってあるのでしょうか?
また、現在、apacheの設定では、Basic認証に関しての設定は一切手を加えておらず、おそらくどのディレクトリに関してもBasic認証は発動しないと考えております。

なにかよいアドバイスありましたら宜しくお願いいたします。

問題解決いたしました!

mt-xmlrpc.cgiとmt.cgiが同階層に存在しているので、
Basic認証がそのディレクトリに対して掛かっているわけではありませんでした。

HOSTSの問題でした。
指定したドメインでアクセスすると、グローバルIPが取得され、
ADSLモデムの管理画面が呼ばれていたのです。
その画面がBasic認証を要求していたと言う訳です。
なので、HOSTSにドメイン名=ローカルIPを振ってやり、cat 〜
を行うと、見事エントリーに追加されていました。

アドバイスどうもありがとうございました。
(もっと早く気づくべきでした。情けない・・・・)

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2004年01月09日 08:19に投稿されたエントリーのページです。

ひとつ前の投稿は「moblog」です。

次の投稿は「なべ?水炊き?」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.