最近は BTS としてだけでなく、様々なプロジェクトの管理に Redmine を使っています。10月までは Basecamp と Trac の組み合わせでしたが、いま Redmine への移行を検討しているところです。Basecamp も特定の用途には引き続き利用しますが、BTS としてもコラボレーションツールとしても使える Redmine に統一する方が管理コストが削減できます。
Basecamp と比較した時の Redmine に対する一番の不満は、フォーラムをメールで操作できないこと。いちいち Web UI を使わなくても気軽にメールから更新できることは非常に重要です。メールによるディスカッションを活用している messaliberty にとっては特に。
というわけで、メールによるフォーラムの作成・更新(返信)ができるように Redmine 0.8.5 を修正しました。
最初に見つけたのはこのパッチです。
Redmine – Patch #1616: Allow email to create and reply to forum messages – Redmine
しかし、その後のバージョンアップに伴ってこれだけでは動かなくなっています。パッチの適用後は手動で変更する必要があります。
パッチの適用
cd REDMINE_ROOT wget http://www.redmine.org/attachments/download/753/feature_277_mailing_list_forum_integration_with_test_fixtures.diff sudo patch -p0 -d . < feature_277_mailing_list_forum_integration_with_test_fixtures.diff
'config/settings.yml.rej' を確認して 'config/settings.yml' の変更を手動で反映。
***************
*** 44,49 ****
default: '25,50,100'
mail_from:
default: redmine@somenet.foo
bcc_recipients:
default: 1
text_formatting:
--- 44,51 ----
default: '25,50,100'
mail_from:
default: redmine@somenet.foo
+ forum_mail_from:
+ default: ""
bcc_recipients:
default: 1
text_formatting:
コードの修正
'app/models/mail_handler.rb' を変更。
--- mail_handler.rb.orig (original file)
+++ mail_handler.rb (working copy)
@@ -119,12 +119,12 @@
# Creates a new forum message
def receive_forum_message
project = target_project
- board = target_board
+ board = target_board(project)
# check permission
raise UnauthorizedAction unless user.allowed_to?(:edit_messages, project)
message = Message.new(:author => user, :board => board)
message.subject = email.subject.split(FORUM_MESSAGE_SUBJECT_SPLIT)[6].strip
- message.content = email.plain_text_body.chomp
+ message.content = plain_text_body.chomp
message.save!
logger.info "MailHandler: message ##{message.id} - #{message.subject} created by #{user}" if logger && logger.info
#Mailer.deliver_message_posted(message) if Setting.notified_events.include?('message_posted')
@@ -134,7 +134,7 @@
# Creates a reply to an existing forum message
def receive_forum_message_reply
project = target_project
- board = target_board
+ board = target_board(project)
# check permission
raise UnauthorizedAction unless user.allowed_to?(:edit_messages, project)
message = Message.new(:author => user, :board => board)
@@ -144,7 +144,8 @@
board, subject ],
:order => "created_on DESC").id
message.subject = "Re: " + subject
- message.content = email.plain_text_body.chomp
+ # message.content = email.plain_text_body.chomp
+ message.content = plain_text_body.chomp
message.save!
logger.info "MailHandler: message ##{message.id} - #{message.subject} created by #{user} in reply to message ##{message.parent_id}" if logger && logger.info
#Mailer.deliver_message_posted(message) if Setting.notified_events.include?('message_posted')
@@ -162,8 +163,10 @@
target
end
- def target_board
- target = Board.find_by_name(email.subject.split(FORUM_MESSAGE_SUBJECT_SPLIT)[4].strip)
+ def target_board(project)
+ target = Board.find(:first,
+ :conditions => [ "project_id = ? AND name = ?",
+ project.id, email.subject.split(FORUM_MESSAGE_SUBJECT_SPLIT)[4].strip ])
raise MissingInformation.new('Unable to determine target board/forum') if target.nil?
target
end
後は公式ドキュメントや上記パッチの解説ページを参照して、メールを Redmine から拾いに行く設定をすれば OK。我々の環境では IMAP へのアクセスを cron で実行して実現しています。
これで動作は問題無いのですが、次は外観です。Basecamp 風のテーマを入れます。
これだけだとフォーラムを活用する人には reply が見づらいです。そこで上記テーマの CSS に1行追記。
h4 {background-color: #EDF3FE;}

