ページ更新: 2006-12-10 (日) (4389日前)

関連: Linux/Debian/quickml

(2006-11-04 新規作成)

MailArchiveプラグインをインストールし、quickmlと連動させる。未完

環境は Debian GNU/Linux Sarge + backports + testing, Trac-0.10 (trac-0.10-ja-1.zip)。

目次

[編集]

情報源 #

WeekbuildのHack倉庫 - メールをTracに蓄積 - MailArchiveプラグイン
http://weekbuild.sakura.ne.jp/trac/wiki/TracDoc/MailArchivePlugin

tracとquickMLの連携 @ 2006年05月 @ ratio - rational - irrational @ IDM
http://idm.s9.xrea.com/ratio/2006/05/24/000439.html

Linux/Debian/quickml

[編集]

インストール #

メールを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

よくよく考えてみると、今回やりたいことは

  • 特定のMLだけ、MailArchiveプラグインの方に投げる。
    • MailArchiveに投げないMLもいくつかある。
  • TracEnvが存在しないものは、MailArchiveプラグインの方には投げたくない。
  • 1つのTracEnvにつき1個のMLを使いたい
  • MLに対応するTracEnvがあるとは限らない。
  • できれば、1つのTracEnvにつき0〜3個のMLを使いたい。この場合ML名→TracEnvのマッピングが必要。
    • ML名とTracEnv名に簡単な規則を決めればマップを維持しなくて良い。 例えば ML名:hoge, hoge-announce, hoge-document はすべてTracEnv:hogeに投げる、とか。

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は

  • 標準入力からメールを受け取って、作業ファイルに保存。(/tmp/poyo.pid)
  • MailArchiveプラグインの mail-archive.py を起動。このときTracEnv/db/trac.dbへの書き込み権限が必要
  • 作業ファイルを消す。

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から認識されない。

[編集]

この不具合が起こる環境 #

  1. Windows XP Professional SP2/メモリ:2048MB/CPU:Intel E6600, Python 2.4.3, setuptools 0.6c3 (C:\Python24\Lib\site-packages\setuptools-0.6c3-py2.4.egg), mailarchiveplugin-r74.zip
  2. Windows XP Professional SP2/メモリ:2048MB/CPU:Intel E6700, Python 2.4.3, setuptools 0.6c3 (C:\Python24\Lib\site-packages\setuptools-0.6c3-py2.4.egg), mailarchiveplugin-r74.zip
[編集]

この不具合が起こらない環境 #

  1. Debian GNU/Linux 3.1r4/メモリ:1024MB/CPU:Intel Pentinum3 833MHz×2, Python 2.3.5 (python2.3-2.3.5-3sarge2), setuptools 0.6a9 (python2.3-setuptools-0.6a9-0bpo1, /usr/lib/python2.3/site-packages/setuptools-0.6a9-py2.3.egg/), mailarchiveplugin-r74.zip
  2. Debian GNU/Linux 3.1r4/メモリ:1024MB/CPU:Intel Pentinum3 850MHz, setuptools X.X, mailarchiveplugin-rXX.zip
$ 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を作成し、中身を確認すると:

mailarchive-win-eggtrouble-01.png

この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ディレクトリにコピーする。

mailarchive-win-eggtrouble-02.png

3. 再度、setup.py bdist_eggを実行する。(--keep-tempはあってもなくてもよい)

python setup.py bdist_egg

Eggの中身を確認すると、EGG-INFOディレクトリに必要なファイルが存在する。

mailarchive-win-eggtrouble-03.png

この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'
>>>