Class: Mailer

Inherits:
ActionMailer::Base
  • Object
show all
Includes:
Redmine::I18n
Defined in:
app/models/mailer.rb

Overview

Redmine - project management software Copyright (C) 2006-2014 Jean-Philippe Lang

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Redmine::I18n

#current_language, #day_letter, #day_name, #find_language, #format_date, #format_time, included, #l, #l_hours, #l_or_humanize, #languages_options, #ll, #month_name, #set_language_if_valid, #valid_languages

Constructor Details

#initialize(*args) ⇒ Mailer

Returns a new instance of Mailer.


420
421
422
423
424
# File 'app/models/mailer.rb', line 420

def initialize(*args)
  @initial_language = current_language
  set_language_if_valid Setting.default_language
  super
end

Class Method Details

.default_url_optionsObject


26
27
28
# File 'app/models/mailer.rb', line 26

def self.default_url_options
  { :host => Setting.host_name, :protocol => Setting.protocol }
end

.deliver_issue_add(issue) ⇒ Object

Notifies users about a new issue


48
49
50
51
52
53
54
# File 'app/models/mailer.rb', line 48

def self.deliver_issue_add(issue)
  to = issue.notified_users
  cc = issue.notified_watchers - to
  issue.each_notification(to + cc) do |users|
    Mailer.issue_add(issue, to & users, cc & users).deliver
  end
end

.deliver_issue_edit(journal) ⇒ Object

Notifies users about an issue update


80
81
82
83
84
85
86
87
88
89
# File 'app/models/mailer.rb', line 80

def self.deliver_issue_edit(journal)
  issue = journal.journalized.reload
  to = journal.notified_users
  cc = journal.notified_watchers - to
  journal.each_notification(to + cc) do |users|
    issue.each_notification(users) do |users2|
      Mailer.issue_edit(journal, to & users2, cc & users2).deliver
    end
  end
end

.deliver_mail(mail) ⇒ Object


426
427
428
429
430
431
432
433
434
435
436
437
438
439
# File 'app/models/mailer.rb', line 426

def self.deliver_mail(mail)
  return false if mail.to.blank? && mail.cc.blank? && mail.bcc.blank?
  begin
    # Log errors when raise_delivery_errors is set to false, Rails does not
    mail.raise_delivery_errors = true
    super
  rescue Exception => e
    if ActionMailer::Base.raise_delivery_errors
      raise e
    else
      Rails.logger.error "Email delivery error: #{e.message}"
    end
  end
end

.method_missing(method, *args, &block) ⇒ Object


441
442
443
444
445
446
447
448
# File 'app/models/mailer.rb', line 441

def self.method_missing(method, *args, &block)
  if m = method.to_s.match(%r{^deliver_(.+)$})
    ActiveSupport::Deprecation.warn "Mailer.deliver_#{m[1]}(*args) is deprecated. Use Mailer.#{m[1]}(*args).deliver instead."
    send(m[1], *args).deliver
  else
    super
  end
end

.reminders(options = {}) ⇒ Object

Sends reminders to issue assignees Available options:

  • :days => how many days in the future to remind about (defaults to 7)

  • :tracker => id of tracker for filtering issues (defaults to all trackers)

  • :project => id or identifier of project to process (defaults to all projects)

  • :users => array of user/group ids who should be reminded


321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
# File 'app/models/mailer.rb', line 321

def self.reminders(options={})
  days = options[:days] || 7
  project = options[:project] ? Project.find(options[:project]) : nil
  tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil
  user_ids = options[:users]

  scope = Issue.open.where("#{Issue.table_name}.assigned_to_id IS NOT NULL" +
    " AND #{Project.table_name}.status = #{Project::STATUS_ACTIVE}" +
    " AND #{Issue.table_name}.due_date <= ?", days.day.from_now.to_date
  )
  scope = scope.where(:assigned_to_id => user_ids) if user_ids.present?
  scope = scope.where(:project_id => project.id) if project
  scope = scope.where(:tracker_id => tracker.id) if tracker
  issues_by_assignee = scope.includes(:status, :assigned_to, :project, :tracker).
                            group_by(&:assigned_to)
  issues_by_assignee.keys.each do |assignee|
    if assignee.is_a?(Group)
      assignee.users.each do |user|
        issues_by_assignee[user] ||= []
        issues_by_assignee[user] += issues_by_assignee[assignee]
      end
    end
  end

  issues_by_assignee.each do |assignee, issues|
    reminder(assignee, issues, days).deliver if assignee.is_a?(User) && assignee.active?
  end
end

.with_deliveries(enabled = true, &block) ⇒ Object

Activates/desactivates email deliveries during block


351
352
353
354
355
356
357
# File 'app/models/mailer.rb', line 351

def self.with_deliveries(enabled = true, &block)
  was_enabled = ActionMailer::Base.perform_deliveries
  ActionMailer::Base.perform_deliveries = !!enabled
  yield
ensure
  ActionMailer::Base.perform_deliveries = was_enabled
end

.with_synched_deliveries(&block) ⇒ Object

Sends emails synchronously in the given block


360
361
362
363
364
365
366
367
368
369
370
# File 'app/models/mailer.rb', line 360

def self.with_synched_deliveries(&block)
  saved_method = ActionMailer::Base.delivery_method
  if m = saved_method.to_s.match(%r{^async_(.+)$})
    synched_method = m[1]
    ActionMailer::Base.delivery_method = synched_method.to_sym
    ActionMailer::Base.send "#{synched_method}_settings=", ActionMailer::Base.send("async_#{synched_method}_settings")
  end
  yield
ensure
  ActionMailer::Base.delivery_method = saved_method
end

Instance Method Details

#account_activated(user) ⇒ Object

Builds a Mail::Message object used to email the specified user that their account was activated by an administrator.

Example:

account_activated(user) => Mail::Message object
Mailer.account_activated(user).deliver => sends an email to the registered user

284
285
286
287
288
289
290
# File 'app/models/mailer.rb', line 284

def (user)
  set_language_if_valid user.language
  @user = user
  @login_url = url_for(:controller => 'account', :action => 'login')
  mail :to => user.mail,
    :subject => l(:mail_subject_register, Setting.app_title)
end

#account_activation_request(user) ⇒ Object

Builds a Mail::Message object used to email all active administrators of an account activation request.

Example:

account_activation_request(user) => Mail::Message object
Mailer.account_activation_request(user).deliver => sends an email to all active administrators

268
269
270
271
272
273
274
275
276
277
# File 'app/models/mailer.rb', line 268

def (user)
  # Send the email to all active administrators
  recipients = User.active.where(:admin => true).collect { |u| u.mail }.compact
  @user = user
  @url = url_for(:controller => 'users', :action => 'index',
                       :status => User::STATUS_REGISTERED,
                       :sort_key => 'created_on', :sort_order => 'desc')
  mail :to => recipients,
    :subject => l(:mail_subject_account_activation_request, Setting.app_title)
end

#account_information(user, password) ⇒ Object

Builds a Mail::Message object used to email the specified user their account information.

Example:

account_information(user, password) => Mail::Message object
Mailer.account_information(user, password).deliver => sends account information to the user

254
255
256
257
258
259
260
261
# File 'app/models/mailer.rb', line 254

def (user, password)
  set_language_if_valid user.language
  @user = user
  @password = password
  @login_url = url_for(:controller => 'account', :action => 'login')
  mail :to => user.mail,
    :subject => l(:mail_subject_register, Setting.app_title)
end

#attachments_added(attachments) ⇒ Object

Builds a Mail::Message object used to email recipients of a project when an attachements are added.

Example:

attachments_added(attachments) => Mail::Message object
Mailer.attachments_added(attachments).deliver => sends an email to the project's recipients

121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'app/models/mailer.rb', line 121

def attachments_added(attachments)
  container = attachments.first.container
  added_to = ''
  added_to_url = ''
  @author = attachments.first.author
  case container.class.name
  when 'Project'
    added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container)
    added_to = "#{l(:label_project)}: #{container}"
    recipients = container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}.collect  {|u| u.mail}
  when 'Version'
    added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container.project)
    added_to = "#{l(:label_version)}: #{container.name}"
    recipients = container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}.collect  {|u| u.mail}
  when 'Document'
    added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id)
    added_to = "#{l(:label_document)}: #{container.title}"
    recipients = container.recipients
  end
  redmine_headers 'Project' => container.project.identifier
  @attachments = attachments
  @added_to = added_to
  @added_to_url = added_to_url
  mail :to => recipients,
    :subject => "[#{container.project.name}] #{l(:label_attachment_new)}"
end

#document_added(document) ⇒ Object

Builds a Mail::Message object used to email users belonging to the added document's project.

Example:

document_added(document) => Mail::Message object
Mailer.document_added(document).deliver => sends an email to the document's project recipients

107
108
109
110
111
112
113
114
# File 'app/models/mailer.rb', line 107

def document_added(document)
  redmine_headers 'Project' => document.project.identifier
  @author = User.current
  @document = document
  @document_url = url_for(:controller => 'documents', :action => 'show', :id => document)
  mail :to => document.recipients,
    :subject => "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}"
end

#issue_add(issue, to_users, cc_users) ⇒ Object

Builds a mail for notifying to_users and cc_users about a new issue


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/models/mailer.rb', line 31

def issue_add(issue, to_users, cc_users)
  redmine_headers 'Project' => issue.project.identifier,
                  'Issue-Id' => issue.id,
                  'Issue-Author' => issue.author.
  redmine_headers 'Issue-Assignee' => issue.assigned_to. if issue.assigned_to
  message_id issue
  references issue
  @author = issue.author
  @issue = issue
  @users = to_users + cc_users
  @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue)
  mail :to => to_users.map(&:mail),
    :cc => cc_users.map(&:mail),
    :subject => "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}"
end

#issue_edit(journal, to_users, cc_users) ⇒ Object

Builds a mail for notifying to_users and cc_users about an issue update


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/models/mailer.rb', line 57

def issue_edit(journal, to_users, cc_users)
  issue = journal.journalized
  redmine_headers 'Project' => issue.project.identifier,
                  'Issue-Id' => issue.id,
                  'Issue-Author' => issue.author.
  redmine_headers 'Issue-Assignee' => issue.assigned_to. if issue.assigned_to
  message_id journal
  references issue
  @author = journal.user
  s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] "
  s << "(#{issue.status.name}) " if journal.new_value_for('status_id')
  s << issue.subject
  @issue = issue
  @users = to_users + cc_users
  @journal = journal
  @journal_details = journal.visible_details(@users.first)
  @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue, :anchor => "change-#{journal.id}")
  mail :to => to_users.map(&:mail),
    :cc => cc_users.map(&:mail),
    :subject => s
end

#lost_password(token) ⇒ Object


292
293
294
295
296
297
298
# File 'app/models/mailer.rb', line 292

def lost_password(token)
  set_language_if_valid(token.user.language)
  @token = token
  @url = url_for(:controller => 'account', :action => 'lost_password', :token => token.value)
  mail :to => token.user.mail,
    :subject => l(:mail_subject_lost_password, Setting.app_title)
end

#mail(headers = {}, &block) ⇒ Object


372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
# File 'app/models/mailer.rb', line 372

def mail(headers={}, &block)
  headers.merge! 'X-Mailer' => 'Redmine',
          'X-Redmine-Host' => Setting.host_name,
          'X-Redmine-Site' => Setting.app_title,
          'X-Auto-Response-Suppress' => 'OOF',
          'Auto-Submitted' => 'auto-generated',
          'From' => Setting.mail_from,
          'List-Id' => "<#{Setting.mail_from.to_s.gsub('@', '.')}>"

  # Removes the author from the recipients and cc
  # if the author does not want to receive notifications
  # about what the author do
  if @author && @author.logged? && @author.pref.no_self_notified
    headers[:to].delete(@author.mail) if headers[:to].is_a?(Array)
    headers[:cc].delete(@author.mail) if headers[:cc].is_a?(Array)
  end

  if @author && @author.logged?
    redmine_headers 'Sender' => @author.
  end

  # Blind carbon copy recipients
  if Setting.bcc_recipients?
    headers[:bcc] = [headers[:to], headers[:cc]].flatten.uniq.reject(&:blank?)
    headers[:to] = nil
    headers[:cc] = nil
  end

  if @message_id_object
    headers[:message_id] = "<#{self.class.message_id_for(@message_id_object)}>"
  end
  if @references_objects
    headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o)}>"}.join(' ')
  end

  m = if block_given?
    super headers, &block
  else
    super headers do |format|
      format.text
      format.html unless Setting.plain_text_mail?
    end
  end
  set_language_if_valid @initial_language

  m
end

#message_posted(message) ⇒ Object

Builds a Mail::Message object used to email the recipients of the specified message that was posted.

Example:

message_posted(message) => Mail::Message object
Mailer.message_posted(message).deliver => sends an email to the recipients

189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'app/models/mailer.rb', line 189

def message_posted(message)
  redmine_headers 'Project' => message.project.identifier,
                  'Topic-Id' => (message.parent_id || message.id)
  @author = message.author
  message_id message
  references message.root
  recipients = message.recipients
  cc = ((message.root.watcher_recipients + message.board.watcher_recipients).uniq - recipients)
  @message = message
  @message_url = url_for(message.event_url)
  mail :to => recipients,
    :cc => cc,
    :subject => "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}"
end

#news_added(news) ⇒ Object

Builds a Mail::Message object used to email recipients of a news' project when a news item is added.

Example:

news_added(news) => Mail::Message object
Mailer.news_added(news).deliver => sends an email to the news' project recipients

153
154
155
156
157
158
159
160
161
162
163
# File 'app/models/mailer.rb', line 153

def news_added(news)
  redmine_headers 'Project' => news.project.identifier
  @author = news.author
  message_id news
  references news
  @news = news
  @news_url = url_for(:controller => 'news', :action => 'show', :id => news)
  mail :to => news.recipients,
    :cc => news.cc_for_added_news,
    :subject => "[#{news.project.name}] #{l(:label_news)}: #{news.title}"
end

#news_comment_added(comment) ⇒ Object

Builds a Mail::Message object used to email recipients of a news' project when a news comment is added.

Example:

news_comment_added(comment) => Mail::Message object
Mailer.news_comment_added(comment) => sends an email to the news' project recipients

170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'app/models/mailer.rb', line 170

def news_comment_added(comment)
  news = comment.commented
  redmine_headers 'Project' => news.project.identifier
  @author = comment.author
  message_id comment
  references news
  @news = news
  @comment = comment
  @news_url = url_for(:controller => 'news', :action => 'show', :id => news)
  mail :to => news.recipients,
   :cc => news.watcher_recipients,
   :subject => "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}"
end

#register(token) ⇒ Object


300
301
302
303
304
305
306
# File 'app/models/mailer.rb', line 300

def register(token)
  set_language_if_valid(token.user.language)
  @token = token
  @url = url_for(:controller => 'account', :action => 'activate', :token => token.value)
  mail :to => token.user.mail,
    :subject => l(:mail_subject_register, Setting.app_title)
end

#reminder(user, issues, days) ⇒ Object


91
92
93
94
95
96
97
98
99
100
# File 'app/models/mailer.rb', line 91

def reminder(user, issues, days)
  set_language_if_valid user.language
  @issues = issues
  @days = days
  @issues_url = url_for(:controller => 'issues', :action => 'index',
                              :set_filter => 1, :assigned_to_id => user.id,
                              :sort => 'due_date:asc')
  mail :to => user.mail,
    :subject => l(:mail_subject_reminder, :count => issues.size, :days => days)
end

#test_email(user) ⇒ Object


308
309
310
311
312
313
# File 'app/models/mailer.rb', line 308

def test_email(user)
  set_language_if_valid(user.language)
  @url = url_for(:controller => 'welcome')
  mail :to => user.mail,
    :subject => 'Redmine test'
end

#wiki_content_added(wiki_content) ⇒ Object

Builds a Mail::Message object used to email the recipients of a project of the specified wiki content was added.

Example:

wiki_content_added(wiki_content) => Mail::Message object
Mailer.wiki_content_added(wiki_content).deliver => sends an email to the project's recipients

209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'app/models/mailer.rb', line 209

def wiki_content_added(wiki_content)
  redmine_headers 'Project' => wiki_content.project.identifier,
                  'Wiki-Page-Id' => wiki_content.page.id
  @author = wiki_content.author
  message_id wiki_content
  recipients = wiki_content.recipients
  cc = wiki_content.page.wiki.watcher_recipients - recipients
  @wiki_content = wiki_content
  @wiki_content_url = url_for(:controller => 'wiki', :action => 'show',
                                    :project_id => wiki_content.project,
                                    :id => wiki_content.page.title)
  mail :to => recipients,
    :cc => cc,
    :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_added, :id => wiki_content.page.pretty_title)}"
end

#wiki_content_updated(wiki_content) ⇒ Object

Builds a Mail::Message object used to email the recipients of a project of the specified wiki content was updated.

Example:

wiki_content_updated(wiki_content) => Mail::Message object
Mailer.wiki_content_updated(wiki_content).deliver => sends an email to the project's recipients

230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
# File 'app/models/mailer.rb', line 230

def wiki_content_updated(wiki_content)
  redmine_headers 'Project' => wiki_content.project.identifier,
                  'Wiki-Page-Id' => wiki_content.page.id
  @author = wiki_content.author
  message_id wiki_content
  recipients = wiki_content.recipients
  cc = wiki_content.page.wiki.watcher_recipients + wiki_content.page.watcher_recipients - recipients
  @wiki_content = wiki_content
  @wiki_content_url = url_for(:controller => 'wiki', :action => 'show',
                                    :project_id => wiki_content.project,
                                    :id => wiki_content.page.title)
  @wiki_diff_url = url_for(:controller => 'wiki', :action => 'diff',
                                 :project_id => wiki_content.project, :id => wiki_content.page.title,
                                 :version => wiki_content.version)
  mail :to => recipients,
    :cc => cc,
    :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_updated, :id => wiki_content.page.pretty_title)}"
end