From 23b8672bc9a8449f6a89d94b25ea036f4815e4bc Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 5 Nov 2009 23:16:20 +0000 Subject: [PATCH] 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. --- app/models/diary_comment.rb | 9 +++++++++ app/models/message.rb | 10 ++++++++++ app/models/notifier.rb | 10 +++++++++- config/application.yml | 2 ++ script/deliver-message | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100755 script/deliver-message diff --git a/app/models/diary_comment.rb b/app/models/diary_comment.rb index aaf48be4f..0013606d0 100644 --- a/app/models/diary_comment.rb +++ b/app/models/diary_comment.rb @@ -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 diff --git a/app/models/message.rb b/app/models/message.rb index 464c55028..98346d7c7 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -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 diff --git a/app/models/notifier.rb b/app/models/notifier.rb index 35b521e1f..6ba90ce58 100644 --- a/app/models/notifier.rb +++ b/app/models/notifier.rb @@ -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 " 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 diff --git a/config/application.yml b/config/application.yml index a478217a4..4983d3627 100644 --- a/config/application.yml +++ b/config/application.yml @@ -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 index 000000000..d3af5ffba --- /dev/null +++ b/script/deliver-message @@ -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 -- 2.43.2