Add support for processing incoming mail messages in reply to message

notifications and diary comment notifications, turning the maill messages
into reply messages through the site messaging system.
This commit is contained in:
Tom Hughes 2009-11-05 23:16:20 +00:00
parent 33dc83a470
commit 23b8672bc9
5 changed files with 62 additions and 1 deletions

View file

@ -4,4 +4,13 @@ class DiaryComment < ActiveRecord::Base
validates_presence_of :body validates_presence_of :body
validates_associated :diary_entry 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 end

View file

@ -9,4 +9,14 @@ class Message < ActiveRecord::Base
validates_inclusion_of :message_read, :in => [ true, false ] validates_inclusion_of :message_read, :in => [ true, false ]
validates_associated :sender, :recipient validates_associated :sender, :recipient
validates_as_utf8 :title 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 end

View file

@ -47,6 +47,7 @@ class Notifier < ActionMailer::Base
def message_notification(message) def message_notification(message)
common_headers message.recipient 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) subject I18n.t('notifier.message_notification.subject', :user => message.sender.display_name, :locale => locale)
body :to_user => message.recipient.display_name, body :to_user => message.recipient.display_name,
:from_user => message.sender.display_name, :from_user => message.sender.display_name,
@ -62,6 +63,7 @@ class Notifier < ActionMailer::Base
def diary_comment_notification(comment) def diary_comment_notification(comment)
common_headers comment.diary_entry.user 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) subject I18n.t('notifier.diary_comment_notification.subject', :user => comment.user.display_name, :locale => locale)
body :to_user => comment.diary_entry.user.display_name, body :to_user => comment.diary_entry.user.display_name,
:from_user => comment.user.display_name, :from_user => comment.user.display_name,
@ -103,8 +105,14 @@ private
def common_headers(recipient) def common_headers(recipient)
recipients recipient.email recipients recipient.email
locale recipient.preferred_language_from(I18n.available_locales) locale recipient.preferred_language_from(I18n.available_locales)
from "webmaster@openstreetmap.org" from "OpenStreetMap <webmaster@openstreetmap.org>"
headers "return-path" => "bounces@openstreetmap.org", headers "return-path" => "bounces@openstreetmap.org",
"Auto-Submitted" => "auto-generated" "Auto-Submitted" => "auto-generated"
end 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 end

View file

@ -19,6 +19,8 @@ standard_settings: &standard_settings
user_block_periods: [0, 1, 3, 6, 12, 24, 48, 96] user_block_periods: [0, 1, 3, 6, 12, 24, 48, 96]
# Rate limit for message sending # Rate limit for message sending
max_messages_per_hour: 60 max_messages_per_hour: 60
# Domain for handling message replies
#messages_domain: "messages.openstreetmap.org"
development: development:
<<: *standard_settings <<: *standard_settings

32
script/deliver-message Executable file
View file

@ -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