annotate app/models/.svn/text-base/mailer.rb.svn-base @ 922:ad295b270cd4 live

FIx #446: "non-utf8 paths in repositories blow up repo viewer and reposman" by ensuring the iconv conversion always happens even if source and dest are intended to be the same encoding
author Chris Cannam
date Tue, 13 Mar 2012 16:33:49 +0000
parents cbce1fd3b1b7
children
rev   line source
Chris@441 1 # Redmine - project management software
Chris@441 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@0 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@0 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
chris@22 18 require 'ar_condition'
chris@22 19
Chris@0 20 class Mailer < ActionMailer::Base
Chris@0 21 layout 'mailer'
Chris@0 22 helper :application
Chris@0 23 helper :issues
Chris@0 24 helper :custom_fields
Chris@0 25
Chris@0 26 include ActionController::UrlWriter
Chris@0 27 include Redmine::I18n
Chris@0 28
Chris@0 29 def self.default_url_options
Chris@0 30 h = Setting.host_name
Chris@0 31 h = h.to_s.gsub(%r{\/.*$}, '') unless Redmine::Utils.relative_url_root.blank?
Chris@0 32 { :host => h, :protocol => Setting.protocol }
Chris@0 33 end
Chris@441 34
Chris@0 35 # Builds a tmail object used to email recipients of the added issue.
Chris@0 36 #
Chris@0 37 # Example:
Chris@0 38 # issue_add(issue) => tmail object
Chris@0 39 # Mailer.deliver_issue_add(issue) => sends an email to issue recipients
Chris@0 40 def issue_add(issue)
Chris@0 41 redmine_headers 'Project' => issue.project.identifier,
Chris@0 42 'Issue-Id' => issue.id,
Chris@0 43 'Issue-Author' => issue.author.login
Chris@0 44 redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to
Chris@0 45 message_id issue
Chris@0 46 recipients issue.recipients
Chris@0 47 cc(issue.watcher_recipients - @recipients)
Chris@0 48 subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}"
Chris@0 49 body :issue => issue,
Chris@0 50 :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
Chris@0 51 render_multipart('issue_add', body)
Chris@0 52 end
Chris@0 53
Chris@0 54 # Builds a tmail object used to email recipients of the edited issue.
Chris@0 55 #
Chris@0 56 # Example:
Chris@0 57 # issue_edit(journal) => tmail object
Chris@0 58 # Mailer.deliver_issue_edit(journal) => sends an email to issue recipients
Chris@0 59 def issue_edit(journal)
Chris@0 60 issue = journal.journalized.reload
Chris@0 61 redmine_headers 'Project' => issue.project.identifier,
Chris@0 62 'Issue-Id' => issue.id,
Chris@0 63 'Issue-Author' => issue.author.login
Chris@0 64 redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to
Chris@0 65 message_id journal
Chris@0 66 references issue
Chris@0 67 @author = journal.user
Chris@0 68 recipients issue.recipients
Chris@0 69 # Watchers in cc
Chris@0 70 cc(issue.watcher_recipients - @recipients)
Chris@0 71 s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] "
Chris@0 72 s << "(#{issue.status.name}) " if journal.new_value_for('status_id')
Chris@0 73 s << issue.subject
Chris@0 74 subject s
Chris@0 75 body :issue => issue,
Chris@0 76 :journal => journal,
Chris@0 77 :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
Chris@0 78
Chris@0 79 render_multipart('issue_edit', body)
Chris@0 80 end
Chris@0 81
Chris@0 82 def reminder(user, issues, days)
Chris@0 83 set_language_if_valid user.language
Chris@0 84 recipients user.mail
Chris@14 85 subject l(:mail_subject_reminder, :count => issues.size, :days => days)
Chris@0 86 body :issues => issues,
Chris@0 87 :days => days,
Chris@441 88 :issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort => 'due_date:asc')
Chris@0 89 render_multipart('reminder', body)
Chris@0 90 end
Chris@0 91
Chris@0 92 # Builds a tmail object used to email users belonging to the added document's project.
Chris@0 93 #
Chris@0 94 # Example:
Chris@0 95 # document_added(document) => tmail object
Chris@0 96 # Mailer.deliver_document_added(document) => sends an email to the document's project recipients
Chris@0 97 def document_added(document)
Chris@0 98 redmine_headers 'Project' => document.project.identifier
Chris@0 99 recipients document.recipients
Chris@0 100 subject "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}"
Chris@0 101 body :document => document,
Chris@0 102 :document_url => url_for(:controller => 'documents', :action => 'show', :id => document)
Chris@0 103 render_multipart('document_added', body)
Chris@0 104 end
Chris@0 105
Chris@0 106 # Builds a tmail object used to email recipients of a project when an attachements are added.
Chris@0 107 #
Chris@0 108 # Example:
Chris@0 109 # attachments_added(attachments) => tmail object
Chris@0 110 # Mailer.deliver_attachments_added(attachments) => sends an email to the project's recipients
Chris@0 111 def attachments_added(attachments)
Chris@0 112 container = attachments.first.container
Chris@0 113 added_to = ''
Chris@0 114 added_to_url = ''
Chris@0 115 case container.class.name
Chris@0 116 when 'Project'
Chris@441 117 added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container)
Chris@0 118 added_to = "#{l(:label_project)}: #{container}"
Chris@0 119 recipients container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}.collect {|u| u.mail}
Chris@0 120 when 'Version'
Chris@441 121 added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container.project)
Chris@0 122 added_to = "#{l(:label_version)}: #{container.name}"
Chris@0 123 recipients container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}.collect {|u| u.mail}
Chris@0 124 when 'Document'
Chris@0 125 added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id)
Chris@0 126 added_to = "#{l(:label_document)}: #{container.title}"
Chris@0 127 recipients container.recipients
Chris@0 128 end
Chris@0 129 redmine_headers 'Project' => container.project.identifier
Chris@0 130 subject "[#{container.project.name}] #{l(:label_attachment_new)}"
Chris@0 131 body :attachments => attachments,
Chris@0 132 :added_to => added_to,
Chris@0 133 :added_to_url => added_to_url
Chris@0 134 render_multipart('attachments_added', body)
Chris@0 135 end
Chris@441 136
Chris@0 137 # Builds a tmail object used to email recipients of a news' project when a news item is added.
Chris@0 138 #
Chris@0 139 # Example:
Chris@0 140 # news_added(news) => tmail object
Chris@0 141 # Mailer.deliver_news_added(news) => sends an email to the news' project recipients
Chris@0 142 def news_added(news)
Chris@0 143 redmine_headers 'Project' => news.project.identifier
Chris@0 144 message_id news
Chris@0 145 recipients news.recipients
Chris@0 146 subject "[#{news.project.name}] #{l(:label_news)}: #{news.title}"
Chris@0 147 body :news => news,
Chris@0 148 :news_url => url_for(:controller => 'news', :action => 'show', :id => news)
Chris@0 149 render_multipart('news_added', body)
Chris@0 150 end
Chris@0 151
Chris@441 152 # Builds a tmail object used to email recipients of a news' project when a news comment is added.
Chris@441 153 #
Chris@441 154 # Example:
Chris@441 155 # news_comment_added(comment) => tmail object
Chris@441 156 # Mailer.news_comment_added(comment) => sends an email to the news' project recipients
Chris@441 157 def news_comment_added(comment)
Chris@441 158 news = comment.commented
Chris@441 159 redmine_headers 'Project' => news.project.identifier
Chris@441 160 message_id comment
Chris@441 161 recipients news.recipients
Chris@441 162 cc news.watcher_recipients
Chris@441 163 subject "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}"
Chris@441 164 body :news => news,
Chris@441 165 :comment => comment,
Chris@441 166 :news_url => url_for(:controller => 'news', :action => 'show', :id => news)
Chris@441 167 render_multipart('news_comment_added', body)
Chris@441 168 end
Chris@441 169
Chris@441 170 # Builds a tmail object used to email the recipients of the specified message that was posted.
Chris@0 171 #
Chris@0 172 # Example:
Chris@0 173 # message_posted(message) => tmail object
Chris@0 174 # Mailer.deliver_message_posted(message) => sends an email to the recipients
Chris@0 175 def message_posted(message)
Chris@0 176 redmine_headers 'Project' => message.project.identifier,
Chris@0 177 'Topic-Id' => (message.parent_id || message.id)
Chris@0 178 message_id message
Chris@0 179 references message.parent unless message.parent.nil?
Chris@0 180 recipients(message.recipients)
Chris@0 181 cc((message.root.watcher_recipients + message.board.watcher_recipients).uniq - @recipients)
Chris@0 182 subject "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}"
Chris@0 183 body :message => message,
Chris@0 184 :message_url => url_for(message.event_url)
Chris@0 185 render_multipart('message_posted', body)
Chris@0 186 end
Chris@441 187
Chris@441 188 # Builds a tmail object used to email the recipients of a project of the specified wiki content was added.
Chris@0 189 #
Chris@0 190 # Example:
Chris@0 191 # wiki_content_added(wiki_content) => tmail object
Chris@0 192 # Mailer.deliver_wiki_content_added(wiki_content) => sends an email to the project's recipients
Chris@0 193 def wiki_content_added(wiki_content)
Chris@0 194 redmine_headers 'Project' => wiki_content.project.identifier,
Chris@0 195 'Wiki-Page-Id' => wiki_content.page.id
Chris@0 196 message_id wiki_content
Chris@0 197 recipients wiki_content.recipients
Chris@0 198 cc(wiki_content.page.wiki.watcher_recipients - recipients)
chris@37 199 subject "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_added, :id => wiki_content.page.pretty_title)}"
Chris@0 200 body :wiki_content => wiki_content,
chris@37 201 :wiki_content_url => url_for(:controller => 'wiki', :action => 'show', :project_id => wiki_content.project, :id => wiki_content.page.title)
Chris@0 202 render_multipart('wiki_content_added', body)
Chris@0 203 end
Chris@441 204
Chris@441 205 # Builds a tmail object used to email the recipients of a project of the specified wiki content was updated.
Chris@0 206 #
Chris@0 207 # Example:
Chris@0 208 # wiki_content_updated(wiki_content) => tmail object
Chris@0 209 # Mailer.deliver_wiki_content_updated(wiki_content) => sends an email to the project's recipients
Chris@0 210 def wiki_content_updated(wiki_content)
Chris@0 211 redmine_headers 'Project' => wiki_content.project.identifier,
Chris@0 212 'Wiki-Page-Id' => wiki_content.page.id
Chris@0 213 message_id wiki_content
Chris@0 214 recipients wiki_content.recipients
Chris@0 215 cc(wiki_content.page.wiki.watcher_recipients + wiki_content.page.watcher_recipients - recipients)
chris@37 216 subject "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_updated, :id => wiki_content.page.pretty_title)}"
Chris@0 217 body :wiki_content => wiki_content,
chris@37 218 :wiki_content_url => url_for(:controller => 'wiki', :action => 'show', :project_id => wiki_content.project, :id => wiki_content.page.title),
chris@37 219 :wiki_diff_url => url_for(:controller => 'wiki', :action => 'diff', :project_id => wiki_content.project, :id => wiki_content.page.title, :version => wiki_content.version)
Chris@0 220 render_multipart('wiki_content_updated', body)
Chris@0 221 end
Chris@0 222
Chris@0 223 # Builds a tmail object used to email the specified user their account information.
Chris@0 224 #
Chris@0 225 # Example:
Chris@0 226 # account_information(user, password) => tmail object
Chris@0 227 # Mailer.deliver_account_information(user, password) => sends account information to the user
Chris@0 228 def account_information(user, password)
Chris@0 229 set_language_if_valid user.language
Chris@0 230 recipients user.mail
Chris@0 231 subject l(:mail_subject_register, Setting.app_title)
Chris@0 232 body :user => user,
Chris@0 233 :password => password,
Chris@0 234 :login_url => url_for(:controller => 'account', :action => 'login')
Chris@0 235 render_multipart('account_information', body)
Chris@0 236 end
Chris@0 237
Chris@0 238 # Builds a tmail object used to email all active administrators of an account activation request.
Chris@0 239 #
Chris@0 240 # Example:
Chris@0 241 # account_activation_request(user) => tmail object
Chris@0 242 # Mailer.deliver_account_activation_request(user)=> sends an email to all active administrators
Chris@0 243 def account_activation_request(user)
Chris@0 244 # Send the email to all active administrators
Chris@0 245 recipients User.active.find(:all, :conditions => {:admin => true}).collect { |u| u.mail }.compact
Chris@0 246 subject l(:mail_subject_account_activation_request, Setting.app_title)
Chris@0 247 body :user => user,
Chris@0 248 :url => url_for(:controller => 'users', :action => 'index', :status => User::STATUS_REGISTERED, :sort_key => 'created_on', :sort_order => 'desc')
Chris@0 249 render_multipart('account_activation_request', body)
Chris@0 250 end
Chris@0 251
Chris@0 252 # Builds a tmail object used to email the specified user that their account was activated by an administrator.
Chris@0 253 #
Chris@0 254 # Example:
Chris@0 255 # account_activated(user) => tmail object
Chris@0 256 # Mailer.deliver_account_activated(user) => sends an email to the registered user
Chris@0 257 def account_activated(user)
Chris@0 258 set_language_if_valid user.language
Chris@0 259 recipients user.mail
Chris@0 260 subject l(:mail_subject_register, Setting.app_title)
Chris@0 261 body :user => user,
Chris@0 262 :login_url => url_for(:controller => 'account', :action => 'login')
Chris@0 263 render_multipart('account_activated', body)
Chris@0 264 end
Chris@0 265
Chris@0 266 def lost_password(token)
Chris@0 267 set_language_if_valid(token.user.language)
Chris@0 268 recipients token.user.mail
Chris@0 269 subject l(:mail_subject_lost_password, Setting.app_title)
Chris@0 270 body :token => token,
Chris@0 271 :url => url_for(:controller => 'account', :action => 'lost_password', :token => token.value)
Chris@0 272 render_multipart('lost_password', body)
Chris@0 273 end
Chris@0 274
Chris@0 275 def register(token)
Chris@0 276 set_language_if_valid(token.user.language)
Chris@0 277 recipients token.user.mail
Chris@0 278 subject l(:mail_subject_register, Setting.app_title)
Chris@0 279 body :token => token,
Chris@0 280 :url => url_for(:controller => 'account', :action => 'activate', :token => token.value)
Chris@0 281 render_multipart('register', body)
Chris@0 282 end
Chris@0 283
Chris@0 284 def test(user)
Chris@0 285 set_language_if_valid(user.language)
Chris@0 286 recipients user.mail
Chris@0 287 subject 'Redmine test'
Chris@0 288 body :url => url_for(:controller => 'welcome')
Chris@0 289 render_multipart('test', body)
Chris@0 290 end
Chris@0 291
Chris@0 292 # Overrides default deliver! method to prevent from sending an email
Chris@0 293 # with no recipient, cc or bcc
Chris@0 294 def deliver!(mail = @mail)
Chris@0 295 set_language_if_valid @initial_language
Chris@0 296 return false if (recipients.nil? || recipients.empty?) &&
Chris@0 297 (cc.nil? || cc.empty?) &&
Chris@0 298 (bcc.nil? || bcc.empty?)
Chris@441 299
Chris@0 300 # Set Message-Id and References
Chris@0 301 if @message_id_object
Chris@0 302 mail.message_id = self.class.message_id_for(@message_id_object)
Chris@0 303 end
Chris@0 304 if @references_objects
Chris@0 305 mail.references = @references_objects.collect {|o| self.class.message_id_for(o)}
Chris@0 306 end
Chris@441 307
Chris@0 308 # Log errors when raise_delivery_errors is set to false, Rails does not
Chris@0 309 raise_errors = self.class.raise_delivery_errors
Chris@0 310 self.class.raise_delivery_errors = true
Chris@0 311 begin
Chris@0 312 return super(mail)
Chris@0 313 rescue Exception => e
Chris@0 314 if raise_errors
Chris@0 315 raise e
Chris@0 316 elsif mylogger
Chris@210 317 mylogger.error "The following error occured while sending email notification: \"#{e.message}\". Check your configuration in config/configuration.yml."
Chris@0 318 end
Chris@0 319 ensure
Chris@0 320 self.class.raise_delivery_errors = raise_errors
Chris@0 321 end
Chris@0 322 end
Chris@0 323
Chris@0 324 # Sends reminders to issue assignees
Chris@0 325 # Available options:
Chris@0 326 # * :days => how many days in the future to remind about (defaults to 7)
Chris@0 327 # * :tracker => id of tracker for filtering issues (defaults to all trackers)
Chris@0 328 # * :project => id or identifier of project to process (defaults to all projects)
chris@22 329 # * :users => array of user ids who should be reminded
Chris@0 330 def self.reminders(options={})
Chris@0 331 days = options[:days] || 7
Chris@0 332 project = options[:project] ? Project.find(options[:project]) : nil
Chris@0 333 tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil
chris@22 334 user_ids = options[:users]
Chris@0 335
Chris@0 336 s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date]
Chris@0 337 s << "#{Issue.table_name}.assigned_to_id IS NOT NULL"
chris@22 338 s << ["#{Issue.table_name}.assigned_to_id IN (?)", user_ids] if user_ids.present?
Chris@0 339 s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}"
Chris@0 340 s << "#{Issue.table_name}.project_id = #{project.id}" if project
Chris@0 341 s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker
Chris@0 342
Chris@0 343 issues_by_assignee = Issue.find(:all, :include => [:status, :assigned_to, :project, :tracker],
Chris@0 344 :conditions => s.conditions
Chris@0 345 ).group_by(&:assigned_to)
Chris@0 346 issues_by_assignee.each do |assignee, issues|
Chris@441 347 deliver_reminder(assignee, issues, days) if assignee && assignee.active?
Chris@0 348 end
Chris@0 349 end
Chris@441 350
Chris@0 351 # Activates/desactivates email deliveries during +block+
Chris@0 352 def self.with_deliveries(enabled = true, &block)
Chris@0 353 was_enabled = ActionMailer::Base.perform_deliveries
Chris@0 354 ActionMailer::Base.perform_deliveries = !!enabled
Chris@0 355 yield
Chris@0 356 ensure
Chris@0 357 ActionMailer::Base.perform_deliveries = was_enabled
Chris@0 358 end
Chris@0 359
Chris@0 360 private
Chris@0 361 def initialize_defaults(method_name)
Chris@0 362 super
Chris@0 363 @initial_language = current_language
Chris@0 364 set_language_if_valid Setting.default_language
Chris@0 365 from Setting.mail_from
Chris@441 366
Chris@0 367 # Common headers
Chris@0 368 headers 'X-Mailer' => 'Redmine',
Chris@0 369 'X-Redmine-Host' => Setting.host_name,
Chris@0 370 'X-Redmine-Site' => Setting.app_title,
Chris@0 371 'Precedence' => 'bulk',
Chris@0 372 'Auto-Submitted' => 'auto-generated'
Chris@0 373 end
Chris@0 374
Chris@0 375 # Appends a Redmine header field (name is prepended with 'X-Redmine-')
Chris@0 376 def redmine_headers(h)
Chris@0 377 h.each { |k,v| headers["X-Redmine-#{k}"] = v }
Chris@0 378 end
Chris@0 379
Chris@0 380 # Overrides the create_mail method
Chris@0 381 def create_mail
Chris@0 382 # Removes the current user from the recipients and cc
Chris@0 383 # if he doesn't want to receive notifications about what he does
Chris@0 384 @author ||= User.current
Chris@0 385 if @author.pref[:no_self_notified]
Chris@0 386 recipients.delete(@author.mail) if recipients
Chris@0 387 cc.delete(@author.mail) if cc
Chris@0 388 end
Chris@441 389
Chris@0 390 notified_users = [recipients, cc].flatten.compact.uniq
Chris@0 391 # Rails would log recipients only, not cc and bcc
Chris@0 392 mylogger.info "Sending email notification to: #{notified_users.join(', ')}" if mylogger
Chris@441 393
Chris@0 394 # Blind carbon copy recipients
Chris@0 395 if Setting.bcc_recipients?
Chris@0 396 bcc(notified_users)
Chris@0 397 recipients []
Chris@0 398 cc []
Chris@0 399 end
Chris@0 400 super
Chris@0 401 end
Chris@0 402
Chris@0 403 # Rails 2.3 has problems rendering implicit multipart messages with
Chris@0 404 # layouts so this method will wrap an multipart messages with
Chris@0 405 # explicit parts.
Chris@0 406 #
Chris@0 407 # https://rails.lighthouseapp.com/projects/8994/tickets/2338-actionmailer-mailer-views-and-content-type
Chris@0 408 # https://rails.lighthouseapp.com/projects/8994/tickets/1799-actionmailer-doesnt-set-template_format-when-rendering-layouts
Chris@441 409
Chris@0 410 def render_multipart(method_name, body)
Chris@0 411 if Setting.plain_text_mail?
Chris@0 412 content_type "text/plain"
Chris@0 413 body render(:file => "#{method_name}.text.plain.rhtml", :body => body, :layout => 'mailer.text.plain.erb')
Chris@0 414 else
Chris@0 415 content_type "multipart/alternative"
Chris@0 416 part :content_type => "text/plain", :body => render(:file => "#{method_name}.text.plain.rhtml", :body => body, :layout => 'mailer.text.plain.erb')
Chris@0 417 part :content_type => "text/html", :body => render_message("#{method_name}.text.html.rhtml", body)
Chris@0 418 end
Chris@0 419 end
Chris@0 420
Chris@0 421 # Makes partial rendering work with Rails 1.2 (retro-compatibility)
Chris@0 422 def self.controller_path
Chris@0 423 ''
Chris@0 424 end unless respond_to?('controller_path')
Chris@441 425
Chris@0 426 # Returns a predictable Message-Id for the given object
Chris@0 427 def self.message_id_for(object)
Chris@0 428 # id + timestamp should reduce the odds of a collision
Chris@0 429 # as far as we don't send multiple emails for the same object
Chris@441 430 timestamp = object.send(object.respond_to?(:created_on) ? :created_on : :updated_on)
Chris@0 431 hash = "redmine.#{object.class.name.demodulize.underscore}-#{object.id}.#{timestamp.strftime("%Y%m%d%H%M%S")}"
Chris@0 432 host = Setting.mail_from.to_s.gsub(%r{^.*@}, '')
Chris@0 433 host = "#{::Socket.gethostname}.redmine" if host.empty?
Chris@0 434 "<#{hash}@#{host}>"
Chris@0 435 end
Chris@441 436
Chris@0 437 private
Chris@441 438
Chris@0 439 def message_id(object)
Chris@0 440 @message_id_object = object
Chris@0 441 end
Chris@441 442
Chris@0 443 def references(object)
Chris@0 444 @references_objects ||= []
Chris@0 445 @references_objects << object
Chris@0 446 end
Chris@441 447
Chris@0 448 def mylogger
Chris@0 449 RAILS_DEFAULT_LOGGER
Chris@0 450 end
Chris@0 451 end
Chris@0 452
Chris@0 453 # Patch TMail so that message_id is not overwritten
Chris@0 454 module TMail
Chris@0 455 class Mail
Chris@0 456 def add_message_id( fqdn = nil )
Chris@0 457 self.message_id ||= ::TMail::new_message_id(fqdn)
Chris@0 458 end
Chris@0 459 end
Chris@0 460 end