ページ更新: 2006-12-10 (日) (5641日前)
(2006-11-04 新規作成) MailArchiveプラグインをインストールし、quickmlと連動させる。未完 環境は Debian GNU/Linux Sarge + backports + testing, Trac-0.10 (trac-0.10-ja-1.zip)。 目次 [編集]情報源 #WeekbuildのHack倉庫 - メールをTracに蓄積 - MailArchiveプラグイン tracとquickMLの連携 @ 2006年05月 @ ratio - rational - irrational @ IDM インストール #メールをTracに蓄積 - MailArchiveプラグイン#3. セットアップ の手順に従うので、ここでは特に記さない。 mailarchive-admin.py は /usr/local/bin/ にコピーする。 ついでに tr -d '\r' して改行コードを変換し、 さらに 1行目を 「#!/usr/bin/python」に書き換えておく。 (今回は、これやらなくても動くだろうけど……) [編集]trac.ini の設定 #trac.iniの[mailarchive]セクションのcodecaliases (MailArchiveプラグイン#4.2 設定) を設定しておく。 trac.iniへの追加: [mailarchive] codecaliases = iso-2022-jp:iso-2022-jp-2004 今回は quickml と連動させる。 よってPOPは使わないので設定しない。 [編集]quickml への投稿を MailArchiveにimportする #[編集]「tracとquickMLの連携」のプログラムを使う場合 (未完) #2006-11-05 quickmlのプログラムを確認。(dpkg --listfiles quickml で当たりを付けてから) $ ls /usr/lib/ruby/1.8/quickml config.rb gettext.rb mail.rb sweeper.rb version.rb core.rb logger.rb server.rb utils.rb で、tracとquickMLの連携 のプログラムは こうなってる。 Rubyはまったく知らないが字面で推測してコメントを付けてみる。信じないように: require 'tempfile' QuickML::Group.class_eval do クラスのevalに割り込む? def _submit_with_trac_posting(mail) メソッド名だと思う _submit_without_trac_posting(mail) 既存の_submitを呼んで Tempfile.open('quickml-to-trac') { |f| 作業ファイル'quickml-to-trac'を作成、fに結びつける now = Time.now.strftime('%a %b %d %H:%M:%S %Y') f.puts "From #{mail.mail_from} #{now}" mailboxの1行目「From XXXX 時間」 mail.each_field do |name, value| メールヘッダを出力 f.puts "#{name}: #{value}" end f.puts 空行を出力 f.puts mail.body メールのボディを出力 f.flush フラッシュする command = [ コマンドラインを作成 "python", "python /path/to/mail-archives.py", かな? "/var/trac/projects/#{self.name}", TracEnvのディレクトリ " import", コマンド self.name, ML名 f.path これが作業ファイル ].join(' ') 半角空白1個で繋ぐ @logger.log command ログにコマンドを記録 @logger.log `#{command}` コマンドを実行、表示をログに記録 } rescue => err @logger.log "error: #{err.message}" end alias_method :_submit_without_trac_posting, :_submit メソッド付け替え? alias_method :_submit, :_submit_with_trac_posting メソッド付け替え? end '_submit' メソッドが含まれるスクリプトを探すと: $ grep _submit *.rb core.rb: def _submit (mail) core.rb: _submit(mail) (以後、未着手) [編集]メールエージェントを作ってMailArchiveに送る場合 (未完) #2006-11-05 よくよく考えてみると、今回やりたいことは
Ruby知らないから、改造するのは面倒ではある。 ……Trac用のメールアドレス(alias)作って、常にMLメンバーに入れても良いかも。 メンバーが全員になくなってもMLが残っちゃうけど、実用上問題なさそうだ。 横着プログラミング 第5回: QuickML: 超お手軽なメーリングリスト#エージェントとの連携 を見る限り、このアプローチでもよいだろう 効率はちと悪いだろうけど (Postfixでlocal配信される)、そんなにたくさんメール流れないだろうし。 例えば TracEnv 'hoge' 用には /etc/aliases にこんなの作って…… hoge: "|/path/to/trac-mailagent TracEnvパス ML名" hoge-announce: "|/path/to/trac-mailagent TracEnvパス ML名" hoge-document: "|/path/to/trac-mailagent TracEnvパス ML名" でも、TracEnv/db/trac.db への書き込み権限が必要だから、 ユーザを新たに作って、Tracと同じグループにして、.forward に書いた方が楽そうだ。 /path/to/trac-mailagentは
trac-mailagentはこんな感じ。 エラー処理やってない。 Perl/Python/Ruby(書けないけど)で書き直して、エラー処理(syslogにでも投げる)したほうがよさそう。 #!/bin/sh # configuration ... /path/to/mailarchive-admin.py mailarchiveadmin='/usr/local/bin/mailarchive-admin.py' # check args if [ $# -ne 2 ] ; then echo "Usage: $0 path/to/tracenv mlname" exit 1 fi tracenv=$1 mlname=$2 [ -d $tracenv ] || echo "not exist ${tracenv}"; exit 0 [ -x $mailarchiveadmin ] || "not exist ${mailarchiveadmin}"; exit 0 # tmpfile="/tmp/mailagent.$$" /bin/cat > $tmpfile $mailarchiveadmin $tracenv import $mlname $tmpfile /bin/rm $tmpfile (これより後は考え中) [編集]メモ #[編集]Windows上で作成した egg の内容が不十分 (2006-12-07) #Eggを作ったとき、EGG-INFOディレクトリの中身がEggに反映されないため、Tracから認識されない。 [編集]この不具合が起こる環境 #
この不具合が起こらない環境 #
$ unzip -l MailArchive-0.1-py2.3.egg Archive: MailArchive-0.1-py2.3.egg Length Date Time Name -------- ---- ---- ---- 2569 05-20-06 21:57 mailarchive/wikisyntax.py 23859 10-08-06 19:16 mailarchive/mailarchive.py 75 04-16-06 11:30 mailarchive/__init__.py 5298 12-08-06 13:54 mailarchive/wikisyntax.pyc 24075 12-08-06 13:54 mailarchive/mailarchive.pyc 188 12-08-06 13:54 mailarchive/__init__.pyc 421 04-16-06 17:47 mailarchive/htdocs/css/mailarchive.css 2361 07-09-06 15:09 mailarchive/templates/mailarchive.cs 3689 04-16-06 17:47 mailarchive/templates/maildetail.cs 183 12-08-06 13:54 EGG-INFO/PKG-INFO 12 12-08-06 13:54 EGG-INFO/top_level.txt 42 12-08-06 13:54 EGG-INFO/entry_points.txt 189 12-08-06 13:54 EGG-INFO/SOURCES.txt 0 12-08-06 13:54 EGG-INFO/zip-safe -------- ------- 62961 14 files[編集] 再現手順 #mailarchiveplugin-r74.zipを展開し、cd 0.10\src して、 python setup.py bdist_eggでEggを作成し、中身を確認すると: このEggをTracEnv\pluginにコピーして、Apacheを再起動してもTracから認識されない。tracdでも認識しない。trac.iniの[component]に書いても認識されない。 trac.ini [logging] でDEBUG出力を指定したときのtrac.logにも、MailArchive-0.1-py2.4.egg が見あたらない。 しかし、他のプラグインは「Trac[loader] DEBUG: Loading egg plugin webadmin.logging from c:\trac\sandbox\plugins\tracwebadmin-0.1.2dev_r3772-py2.4.egg」のようにログに残っている。 [編集]回避方法 #原因はわからないが、EGG-INFO自体は生成されているので、次の手順で回避できた。 1. 作業ファイルを消さないようにして(--keep-temp)、setup.py bdist_eggを1回実行する。 python setup.py bdist_egg --keep-temp 2. mailarchive.egg-infoディレクトリにEGG-INFOのファイルが生成されているので、 このファイルを build\bdist.win32\egg\EGG-INFOディレクトリにコピーする。 3. 再度、setup.py bdist_eggを実行する。(--keep-tempはあってもなくてもよい) python setup.py bdist_egg Eggの中身を確認すると、EGG-INFOディレクトリに必要なファイルが存在する。 このEggをTracEnv\pluginにコピーして、Apacheを再起動すると……Tracから認識された。 [編集]メモ: パッケージ名とEggの名前が同じ時に起こるようだ (2006-12-10) #WebAdminやAccountManagerのEggの名前がTracWebAdminやTracAccountManagerなので、 ふと、nameを'TracMailArchive'にすると発生しなくなった。 > diff -u setup.py.org setup.py --- setup.py.org 2006-04-23 01:33:12.000000000 +0900 +++ setup.py 2006-12-10 01:42:59.750000000 +0900 @@ -1,6 +1,6 @@ from setuptools import setup -PACKAGE = 'MailArchive' +PACKAGE = 'TracMailArchive' VERSION = '0.1' setup(name=PACKAGE, まだ調査していないが、たぶん次の条件で起こると思われる: * Windows上でEggを作成し、 * かつ、setup.py の name と packages と entry_points が同一で * かつ、これらの識別子のアルファベットの大文字・小文字が一致していないとき[編集] 改造 #[編集]メールアドレスのドメインを消す #2006-11-07 メールアドレスのドメイン表示を抑制したい。 たとえば、「givenname.familyname@subdomain.example.jp」は「givenname.familyname@...」と表示したい。 置き換え処理のみ、試作してみる: >>> import re >>> supress_domain = re.compile('@([a-zA-Z][a-z\d-]+\.)+([a-zA-Z][a-z\d-]+)') >>> supress_domain.sub('@...', 'givenname-familyname@subdomain.example.jp') 'givenname-familyname@...' >>> supress_domain.sub('@...', 'givenname.familyname@subdomain.example.jp') 'givenname.familyname@...' >>> supress_domain.sub('@...', 'hoge givenname.familyname@subdomain.example.jp poyo') 'hoge givenname.familyname@... poyo' >>> |