Redmine のフォーラムをメールで更新する方法

» Posted by on 11月 12, 2009 in Blog | 0 comments

最近は 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.diff

--- 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 風のテーマを入れます。

Basecamp theme for Redmine

これだけだとフォーラムを活用する人には reply が見づらいです。そこで上記テーマの CSS に1行追記。

h4 {background-color: #EDF3FE;}