Add support for processing incoming mail messages in reply to message
authorTom Hughes <tom@compton.nu>
Thu, 5 Nov 2009 23:16:20 +0000 (23:16 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 5 Nov 2009 23:16:20 +0000 (23:16 +0000)
notifications and diary comment notifications, turning the maill messages
into reply messages through the site messaging system.

app/models/diary_comment.rb
app/models/message.rb
app/models/notifier.rb
config/application.yml
script/deliver-message [new file with mode: 0755]

index aaf48be..0013606 100644 (file)
@@ -4,4 +4,13 @@ class DiaryComment < ActiveRecord::Base
 
   validates_presence_of :body
   validates_associated :diary_entry
+
+  def digest
+    md5 = Digest::MD5.new
+    md5 << diary_entry_id.to_s
+    md5 << user_id.to_s
+    md5 << created_at.xmlschema
+    md5 << body
+    md5.hexdigest
+  end
 end
index 464c550..98346d7 100644 (file)
@@ -9,4 +9,14 @@ class Message < ActiveRecord::Base
   validates_inclusion_of :message_read, :in => [ true, false ]
   validates_associated :sender, :recipient
   validates_as_utf8 :title
+
+  def digest
+    md5 = Digest::MD5.new
+    md5 << from_user_id.to_s
+    md5 << to_user_id.to_s
+    md5 << sent_on.xmlschema
+    md5 << title
+    md5 << body
+    md5.hexdigest
+  end
 end
index 35b521e..6ba90ce 100644 (file)
@@ -47,6 +47,7 @@ class Notifier < ActionMailer::Base
   
   def message_notification(message)
     common_headers message.recipient
+    from_header message.sender.display_name, "m", message.id, message.digest
     subject I18n.t('notifier.message_notification.subject', :user => message.sender.display_name, :locale => locale)
     body :to_user => message.recipient.display_name,
          :from_user => message.sender.display_name,
@@ -62,6 +63,7 @@ class Notifier < ActionMailer::Base
 
   def diary_comment_notification(comment)
     common_headers comment.diary_entry.user
+    from_header comment.user.display_name, "c", comment.id, comment.digest
     subject I18n.t('notifier.diary_comment_notification.subject', :user => comment.user.display_name, :locale => locale)
     body :to_user => comment.diary_entry.user.display_name,
          :from_user => comment.user.display_name,
@@ -103,8 +105,14 @@ private
   def common_headers(recipient)
     recipients recipient.email
     locale recipient.preferred_language_from(I18n.available_locales)
-    from "webmaster@openstreetmap.org"
+    from "OpenStreetMap <webmaster@openstreetmap.org>"
     headers "return-path" => "bounces@openstreetmap.org",
             "Auto-Submitted" => "auto-generated"
   end
+
+  def from_header(name, type, id, digest)
+    if domain = APP_CONFIG['messages_domain']
+      from "#{name} <#{type}-#{id}-#{digest[0,6]}@#{domain}>"
+    end
+  end
 end
index a478217..4983d36 100644 (file)
@@ -19,6 +19,8 @@ standard_settings: &standard_settings
   user_block_periods: [0, 1, 3, 6, 12, 24, 48, 96]
   # Rate limit for message sending
   max_messages_per_hour: 60
+  # Domain for handling message replies
+  #messages_domain: "messages.openstreetmap.org"
  
 development:
   <<: *standard_settings
diff --git a/script/deliver-message b/script/deliver-message
new file mode 100755 (executable)
index 0000000..d3af5ff
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../config/environment'
+require 'mailread'
+
+exit 0 unless recipient = ARGV[0].match(/^([cm])-(\d+)-(.*)$/)
+
+if recipient[1] == "c"
+  comment = DiaryComment.find(recipient[2])
+  digest = comment.digest
+  from = comment.diary_entry.user
+  to = comment.user
+else
+  message = Message.find(recipient[2])
+  digest = message.digest
+  from = message.recipient
+  to = message.sender
+end
+
+exit 0 unless recipient[3] == digest[0,6]
+
+mail = Mail.new(STDIN)
+
+message = Message.new(:sender => from, :recipient => to,
+                      :sent_on => Time.now.getutc,
+                      :title => mail["Subject"],
+                      :body => mail.body.join("\n"))
+message.save!
+
+Notifier::deliver_message_notification(message)
+
+exit 0