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
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,
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,
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
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
--- /dev/null
+#!/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