Class: Mailer
- Inherits:
-
ActionMailer::Base
- Object
- ActionMailer::Base
- Mailer
- Includes:
- Redmine::I18n, Roadie::Rails::Automatic
- Defined in:
- app/models/mailer.rb
Defined Under Namespace
Classes: DeliveryJob
Class Method Summary collapse
-
.default_url_options ⇒ Object
Default URL options for generating URLs in emails based on host_name and protocol defined in application settings.
-
.deliver_account_activated(user) ⇒ Object
Notifies user that his account was activated.
-
.deliver_account_activation_request(new_user) ⇒ Object
Notifies admin users that an account activation request needs their approval.
-
.deliver_account_information(user, password) ⇒ Object
Notifies user about his account information.
-
.deliver_attachments_added(attachments) ⇒ Object
Notifies users about new attachments.
-
.deliver_document_added(document, author) ⇒ Object
Notifies users that document was created by author.
-
.deliver_issue_add(issue) ⇒ Object
Notifies users about a new issue.
-
.deliver_issue_edit(journal) ⇒ Object
Notifies users about an issue update.
-
.deliver_lost_password(user, token, recipient = nil) ⇒ Object
Sends an email to user with a password recovery link.
- .deliver_mail(mail) ⇒ Object
-
.deliver_message_posted(message) ⇒ Object
Notifies users about a new forum message.
-
.deliver_news_added(news) ⇒ Object
Notifies users about new news.
-
.deliver_news_comment_added(comment) ⇒ Object
Notifies users about a new comment on a news.
-
.deliver_password_updated(user, sender) ⇒ Object
Notifies user that his password was updated by sender.
-
.deliver_register(user, token) ⇒ Object
Sends an mail to user with his account activation link.
-
.deliver_security_notification(users, sender, options = {}) ⇒ Object
Notifies the given users about a security related event made by sender.
-
.deliver_settings_updated(sender, changes, options = {}) ⇒ Object
Notifies admins about application settings changes made by sender, where changes is an array of settings names.
-
.deliver_test_email(user) ⇒ Object
Send a test email to user.
-
.deliver_wiki_content_added(wiki_content) ⇒ Object
Notifies users about a new wiki content (wiki page added).
-
.deliver_wiki_content_updated(wiki_content) ⇒ Object
Notifies users about the update of the specified wiki content.
-
.email_addresses(arg) ⇒ Object
Returns an array of email addresses to notify by replacing users in arg with their notified email addresses.
-
.message_id_for(object, user) ⇒ Object
Returns a Message-Id for the given object.
-
.references_for(object, user) ⇒ Object
Returns a uniq token for a given object referenced by all notifications related to this object.
-
.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 * :version => name of target version for filtering issues (defaults to none).
- .token_for(object, user) ⇒ Object
-
.with_deliveries(enabled = true) ⇒ Object
Activates/desactivates email deliveries during
block
. -
.with_synched_deliveries ⇒ Object
Execute the given block with inline sending of emails if the default Async queue is used for the mailer.
Instance Method Summary collapse
-
#account_activated(user) ⇒ Object
Builds a mail to notify user that his account was activated.
-
#account_activation_request(user, new_user) ⇒ Object
Builds a mail to user about an account activation request.
-
#account_information(user, password) ⇒ Object
Builds a mail to user about his account information.
-
#attachments_added(user, attachments) ⇒ Object
Builds a mail to user about new attachements.
-
#document_added(user, document, author) ⇒ Object
Builds a mail to user about a new document.
-
#issue_add(user, issue) ⇒ Object
Builds a mail for notifying user about a new issue.
-
#issue_edit(user, journal) ⇒ Object
Builds a mail for notifying user about an issue update.
-
#lost_password(user, token, recipient = nil) ⇒ Object
Builds a mail with the password recovery link.
- #mail(headers = {}, &block) ⇒ Object
-
#message_posted(user, message) ⇒ Object
Builds a mail to user about a new message.
-
#news_added(user, news) ⇒ Object
Builds a mail to user about a new news.
-
#news_comment_added(user, comment) ⇒ Object
Builds a mail to user about a new news comment.
-
#process(action, *args) ⇒ Object
Overrides ActionMailer::Base#process in order to set the recipient as the current user and his language as the default locale.
-
#register(user, token) ⇒ Object
Builds a mail to user with his account activation link.
-
#reminder(user, issues, days) ⇒ Object
Builds a reminder mail to user about issues that are due in the next days.
-
#security_notification(user, sender, options = {}) ⇒ Object
Build a mail to user and the additional recipients given in options about a security related event made by sender.
-
#settings_updated(user, sender, changes, options = {}) ⇒ Object
Build a mail to user about application settings changes made by sender.
-
#test_email(user) ⇒ Object
Build a test email to user.
-
#wiki_content_added(user, wiki_content) ⇒ Object
Builds a mail to user about a new wiki content.
-
#wiki_content_updated(user, wiki_content) ⇒ Object
Builds a mail to user about an update of the specified wiki content.
Methods included from Redmine::I18n
#abbr_day_name, #current_language, #day_letter, #day_name, #find_language, #format_date, #format_hours, #format_time, included, #l, #l_hours, #l_hours_short, #l_or_humanize, #languages_options, #ll, #lu, #month_name, #normalize_float, #set_language_if_valid, #valid_languages
Class Method Details
.default_url_options ⇒ Object
Default URL options for generating URLs in emails based on host_name and protocol defined in application settings.
65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'app/models/mailer.rb', line 65 def self. = {:protocol => Setting.protocol} if Setting.host_name.to_s =~ /\A(https?\:\/\/)?(.+?)(\:(\d+))?(\/.+)?\z/i host, port, prefix = $2, $4, $5 .merge!( { :host => host, :port => port, :script_name => prefix } ) else [:host] = Setting.host_name end end |
.deliver_account_activated(user) ⇒ Object
415 416 417 |
# File 'app/models/mailer.rb', line 415 def self.deliver_account_activated(user) account_activated(user).deliver_later end |
.deliver_account_activation_request(new_user) ⇒ Object
Notifies admin users that an account activation request needs their approval.
Exemple:
Mailer.deliver_account_activation_request(new_user)
395 396 397 398 399 400 401 |
# File 'app/models/mailer.rb', line 395 def self.deliver_account_activation_request(new_user) # Send the email to all active administrators users = User.active.where(:admin => true) users.each do |user| account_activation_request(user, new_user).deliver_later end end |
.deliver_account_information(user, password) ⇒ Object
Notifies user about his account information.
376 377 378 |
# File 'app/models/mailer.rb', line 376 def self.deliver_account_information(user, password) account_information(user, password).deliver_later end |
.deliver_attachments_added(attachments) ⇒ Object
206 207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'app/models/mailer.rb', line 206 def self.() container = .first.container case container.class.name when 'Project', 'Version' users = container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)} when 'Document' users = container.notified_users end users.each do |user| (user, ).deliver_later end end |
.deliver_document_added(document, author) ⇒ Object
Notifies users that document was created by author
Example:
Mailer.deliver_document_added(document, )
166 167 168 169 170 171 |
# File 'app/models/mailer.rb', line 166 def self.deliver_document_added(document, ) users = document.notified_users users.each do |user| document_added(user, document, ).deliver_later end end |
.deliver_issue_add(issue) ⇒ Object
105 106 107 108 109 110 |
# File 'app/models/mailer.rb', line 105 def self.deliver_issue_add(issue) users = issue.notified_users | issue.notified_watchers | issue.notified_mentions users.each do |user| issue_add(user, issue).deliver_later end end |
.deliver_issue_edit(journal) ⇒ Object
141 142 143 144 145 146 147 148 149 |
# File 'app/models/mailer.rb', line 141 def self.deliver_issue_edit(journal) users = journal.notified_users | journal.notified_watchers | journal.notified_mentions | journal.journalized.notified_mentions users.select! do |user| journal.notes? || journal.visible_details(user).any? end users.each do |user| issue_edit(user, journal).deliver_later end end |
.deliver_lost_password(user, token, recipient = nil) ⇒ Object
Sends an email to user with a password recovery link. The email will be sent to the email address specifiedby recipient if provided.
Exemple:
Mailer.deliver_lost_password(user, token)
Mailer.deliver_lost_password(user, token, '[email protected]')
434 435 436 |
# File 'app/models/mailer.rb', line 434 def self.deliver_lost_password(user, token, recipient=nil) lost_password(user, token, recipient).deliver_later end |
.deliver_mail(mail) ⇒ Object
738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 |
# File 'app/models/mailer.rb', line 738 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 => e if ActionMailer::Base.raise_delivery_errors raise e else Rails.logger.error "Email delivery error: #{e.}" end end end |
.deliver_message_posted(message) ⇒ Object
289 290 291 292 293 294 295 296 297 |
# File 'app/models/mailer.rb', line 289 def self.() users = .notified_users users |= .root.notified_watchers users |= .board.notified_watchers users.each do |user| (user, ).deliver_later end end |
.deliver_news_added(news) ⇒ Object
237 238 239 240 241 242 |
# File 'app/models/mailer.rb', line 237 def self.deliver_news_added(news) users = news.notified_users | news.notified_watchers_for_added_news users.each do |user| news_added(user, news).deliver_later end end |
.deliver_news_comment_added(comment) ⇒ Object
263 264 265 266 267 268 269 |
# File 'app/models/mailer.rb', line 263 def self.deliver_news_comment_added(comment) news = comment.commented users = news.notified_users | news.notified_watchers users.each do |user| news_comment_added(user, comment).deliver_later end end |
.deliver_password_updated(user, sender) ⇒ Object
Notifies user that his password was updated by sender.
Exemple:
Mailer.deliver_password_updated(user, sender)
442 443 444 445 446 447 448 449 450 451 452 453 454 455 |
# File 'app/models/mailer.rb', line 442 def self.deliver_password_updated(user, sender) # Don't send a notification to the dummy email address when changing the password # of the default admin account which is required after the first login # TODO: maybe not the best way to handle this return if user.admin? && user.login == 'admin' && user.mail == '[email protected]' deliver_security_notification( user, sender, message: :mail_body_password_updated, title: :button_change_password, url: {controller: 'my', action: 'password'} ) end |
.deliver_register(user, token) ⇒ Object
Sends an mail to user with his account activation link.
Exemple:
Mailer.deliver_register(user, token)
469 470 471 |
# File 'app/models/mailer.rb', line 469 def self.deliver_register(user, token) register(user, token).deliver_later end |
.deliver_security_notification(users, sender, options = {}) ⇒ Object
Notifies the given users about a security related event made by sender.
You can specify additional recipients in options. These will be added to all generated mails for all given users. Usually, you’ll want to give only a single user when setting the additional recipients.
Example:
Mailer.deliver_security_notification(users,
sender,
message: :mail_body_security_notification_add,
field: :field_mail,
value: address
)
511 512 513 514 515 516 517 518 519 520 521 522 |
# File 'app/models/mailer.rb', line 511 def self.deliver_security_notification(users, sender, ={}) # Symbols cannot be serialized: # ActiveJob::SerializationError: Unsupported argument type: Symbol = .transform_values {|v| v.is_a?(Symbol) ? v.to_s : v} # sender's remote_ip would be lost on serialization/deserialization # we have to pass it with options [:remote_ip] ||= sender.remote_ip Array.wrap(users).each do |user| security_notification(user, sender, ).deliver_later end end |
.deliver_settings_updated(sender, changes, options = {}) ⇒ Object
Notifies admins about application settings changes made by sender, where changes is an array of settings names.
Exemple:
Mailer.deliver_settings_updated(sender, [:login_required, :self_registration])
540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 |
# File 'app/models/mailer.rb', line 540 def self.deliver_settings_updated(sender, changes, ={}) return unless changes.present? # Symbols cannot be serialized: # ActiveJob::SerializationError: Unsupported argument type: Symbol changes = changes.map(&:to_s) # sender's remote_ip would be lost on serialization/deserialization # we have to pass it with options [:remote_ip] ||= sender.remote_ip users = User.active.where(admin: true).to_a users.each do |user| settings_updated(user, sender, changes, ).deliver_later end end |
.deliver_test_email(user) ⇒ Object
Send a test email to user. Will raise error that may occur during delivery.
Exemple:
Mailer.deliver_test_email(user)
567 568 569 570 571 572 573 574 |
# File 'app/models/mailer.rb', line 567 def self.deliver_test_email(user) raise_delivery_errors_was = self.raise_delivery_errors self.raise_delivery_errors = true # Email must be delivered synchronously so we can catch errors test_email(user).deliver_now ensure self.raise_delivery_errors = raise_delivery_errors_was end |
.deliver_wiki_content_added(wiki_content) ⇒ Object
Notifies users about a new wiki content (wiki page added).
Example:
Mailer.deliver_wiki_content_added(wiki_content)
321 322 323 324 325 326 |
# File 'app/models/mailer.rb', line 321 def self.deliver_wiki_content_added(wiki_content) users = wiki_content.notified_users | wiki_content.page.wiki.notified_watchers | wiki_content.notified_mentions users.each do |user| wiki_content_added(user, wiki_content).deliver_later end end |
.deliver_wiki_content_updated(wiki_content) ⇒ Object
Notifies users about the update of the specified wiki content
Example:
Mailer.deliver_wiki_content_updated(wiki_content)
355 356 357 358 359 360 361 362 363 364 |
# File 'app/models/mailer.rb', line 355 def self.deliver_wiki_content_updated(wiki_content) users = wiki_content.notified_users users |= wiki_content.page.notified_watchers users |= wiki_content.page.wiki.notified_watchers users |= wiki_content.notified_mentions users.each do |user| wiki_content_updated(user, wiki_content).deliver_later end end |
.email_addresses(arg) ⇒ Object
Returns an array of email addresses to notify by replacing users in arg with their notified email addresses
Example:
Mailer.email_addresses(users)
=> ["[email protected]", "[email protected]"]
760 761 762 763 764 765 766 767 768 769 770 771 |
# File 'app/models/mailer.rb', line 760 def self.email_addresses(arg) arr = Array.wrap(arg) mails = arr.reject {|a| a.is_a? Principal} users = arr - mails if users.any? mails += EmailAddress. where(:user_id => users.map(&:id)). where("is_default = ? OR notify = ?", true, true). pluck(:address) end mails end |
.message_id_for(object, user) ⇒ Object
Returns a Message-Id for the given object
805 806 807 |
# File 'app/models/mailer.rb', line 805 def (object, user) token_for(object, user) end |
.references_for(object, user) ⇒ Object
Returns a uniq token for a given object referenced by all notifications related to this object
811 812 813 |
# File 'app/models/mailer.rb', line 811 def references_for(object, user) token_for(object, user) 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
-
:version => name of target version for filtering issues (defaults to none)
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 |
# File 'app/models/mailer.rb', line 603 def self.reminders(={}) days = [:days] || 7 project = [:project] ? Project.find([:project]) : nil tracker = [:tracker] ? Tracker.find([:tracker]) : nil target_version_id = [:version] ? Version.named([:version]).pluck(:id) : nil if [:version] && target_version_id.blank? raise ActiveRecord::RecordNotFound.new("Couldn't find Version named #{[:version]}") end user_ids = [: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(:fixed_version_id => target_version_id) if target_version_id.present? 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| # rubocop:disable Style/HashEachMethods 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| if assignee.is_a?(User) && assignee.active? && issues.present? visible_issues = issues.select {|i| i.visible?(assignee)} visible_issues.sort!{|a, b| (a.due_date <=> b.due_date).nonzero? || (a.id <=> b.id)} reminder(assignee, visible_issues, days).deliver_later if visible_issues.present? end end end |
.token_for(object, user) ⇒ Object
791 792 793 794 795 796 797 798 799 800 801 802 |
# File 'app/models/mailer.rb', line 791 def token_for(object, user) = object.send(object.respond_to?(:created_on) ? :created_on : :updated_on) hash = [ "redmine", "#{object.class.name.demodulize.underscore}-#{object.id}", .utc.strftime("%Y%m%d%H%M%S") ] hash << user.id if user host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '') host = "#{::Socket.gethostname}.redmine" if host.empty? "#{hash.join('.')}@#{host}" end |
.with_deliveries(enabled = true) ⇒ Object
Activates/desactivates email deliveries during block
645 646 647 648 649 650 651 |
# File 'app/models/mailer.rb', line 645 def self.with_deliveries(enabled = true, &) was_enabled = ActionMailer::Base.perform_deliveries ActionMailer::Base.perform_deliveries = !!enabled yield ensure ActionMailer::Base.perform_deliveries = was_enabled end |
.with_synched_deliveries ⇒ Object
Execute the given block with inline sending of emails if the default Async queue is used for the mailer. See the Rails guide: Using the asynchronous queue from a Rake task will generally not work because Rake will likely end, causing the in-process thread pool to be deleted, before any/all of the .deliver_later emails are processed
658 659 660 661 662 663 664 |
# File 'app/models/mailer.rb', line 658 def self.with_synched_deliveries(&) adapter = ActionMailer::MailDeliveryJob.queue_adapter ActionMailer::MailDeliveryJob.queue_adapter = ActiveJob::QueueAdapters::InlineAdapter.new yield ensure ActionMailer::MailDeliveryJob.queue_adapter = adapter end |
Instance Method Details
#account_activated(user) ⇒ Object
Builds a mail to notify user that his account was activated.
404 405 406 407 408 409 |
# File 'app/models/mailer.rb', line 404 def account_activated(user) @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, new_user) ⇒ Object
Builds a mail to user about an account activation request.
381 382 383 384 385 386 387 388 |
# File 'app/models/mailer.rb', line 381 def account_activation_request(user, new_user) @new_user = new_user @url = url_for(:controller => 'users', :action => 'index', :status => User::STATUS_REGISTERED, :sort_key => 'created_on', :sort_order => 'desc') mail :to => user, :subject => l(:mail_subject_account_activation_request, Setting.app_title) end |
#account_information(user, password) ⇒ Object
Builds a mail to user about his account information.
367 368 369 370 371 372 373 |
# File 'app/models/mailer.rb', line 367 def account_information(user, password) @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(user, attachments) ⇒ Object
Builds a mail to user about new attachements.
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'app/models/mailer.rb', line 174 def (user, ) container = .first.container added_to = '' added_to_url = '' @author = .first. case container.class.name when 'Project' added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container) added_to = "#{l(:label_project)}: #{container}" when 'Version' added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container.project) added_to = "#{l(:label_version)}: #{container.name}" when 'Document' added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id) added_to = "#{l(:label_document)}: #{container.title}" end summary = l(:label_attachment_summary, :filename => .first.filename, :count => .length - 1) redmine_headers 'Project' => container.project.identifier @attachments = @user = user @added_to = added_to @added_to_url = added_to_url mail :to => user, :subject => "[#{container.project.name}] #{l(:label_attachment_new)}: #{summary}" end |
#document_added(user, document, author) ⇒ Object
Builds a mail to user about a new document.
152 153 154 155 156 157 158 159 160 |
# File 'app/models/mailer.rb', line 152 def document_added(user, document, ) redmine_headers 'Project' => document.project.identifier @author = @document = document @user = user @document_url = url_for(:controller => 'documents', :action => 'show', :id => document) mail :to => user, :subject => "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}" end |
#issue_add(user, issue) ⇒ Object
Builds a mail for notifying user about a new issue
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'app/models/mailer.rb', line 81 def issue_add(user, issue) redmine_headers 'Project' => issue.project.identifier, 'Issue-Tracker' => issue.tracker.name, 'Issue-Id' => issue.id, 'Issue-Author' => issue..login, 'Issue-Assignee' => assignee_for_header(issue) redmine_headers 'Issue-Priority' => issue.priority.name if issue.priority issue references issue @author = issue. @issue = issue @user = user @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue) subject = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]" subject += " (#{issue.status.name})" if Setting.show_status_changes_in_mail_subject? subject += " #{issue.subject}" mail :to => user, :subject => subject end |
#issue_edit(user, journal) ⇒ Object
Builds a mail for notifying user about an issue update
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'app/models/mailer.rb', line 113 def issue_edit(user, journal) issue = journal.journalized redmine_headers 'Project' => issue.project.identifier, 'Issue-Tracker' => issue.tracker.name, 'Issue-Id' => issue.id, 'Issue-Author' => issue..login, 'Issue-Assignee' => assignee_for_header(issue) redmine_headers 'Issue-Priority' => issue.priority.name if issue.priority 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') && Setting.show_status_changes_in_mail_subject? s += issue.subject @issue = issue @user = user @journal = journal @journal_details = journal.visible_details @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue, :anchor => "change-#{journal.id}") mail :to => user, :subject => s end |
#lost_password(user, token, recipient = nil) ⇒ Object
Builds a mail with the password recovery link.
420 421 422 423 424 425 426 |
# File 'app/models/mailer.rb', line 420 def lost_password(user, token, recipient=nil) recipient ||= user.mail @token = token @url = url_for(:controller => 'account', :action => 'lost_password', :token => token.value) mail :to => recipient, :subject => l(:mail_subject_lost_password, Setting.app_title) end |
#mail(headers = {}, &block) ⇒ Object
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 |
# File 'app/models/mailer.rb', line 666 def mail(headers={}, &block) begin # Add a display name to the From field if Setting.mail_from does not # include it mail_from = Mail::Address.new(Setting.mail_from) if mail_from.display_name.blank? && mail_from.comments.blank? mail_from.display_name = @author&.logged? ? @author.name : Setting.app_title end from = mail_from.format # Construct the value of the List-Id header field from_addr = mail_from.address.to_s project_identifier = self.headers['X-Redmine-Project']&.value list_id = if project_identifier.present? "<#{project_identifier}.#{from_addr.tr('@', '.')}>" else # Emails outside of a project context "<#{from_addr.tr('@', '.')}>" end rescue Mail::Field::IncompleteParseError # Use Setting.mail_from as it is if Mail::Address cannot parse it # (probably the emission address is not RFC compliant) from = Setting.mail_from.to_s list_id = "<#{from.tr('@', '.')}>" end headers.reverse_merge! 'X-Mailer' => 'Redmine', 'X-Redmine-Host' => Setting.host_name, 'X-Redmine-Site' => Setting.app_title, 'X-Auto-Response-Suppress' => 'All', 'Auto-Submitted' => 'auto-generated', 'From' => from, 'List-Id' => list_id # Replaces users with their email addresses [:to, :cc, :bcc].each do |key| if headers[key].present? headers[key] = self.class.email_addresses(headers[key]) end end # Removes the author from the recipients and cc # if the author does not want to receive notifications # about what the author do if @author&.logged? && @author.pref.no_self_notified addresses = @author.mails headers[:to] -= addresses if headers[:to].is_a?(Array) headers[:cc] -= addresses if headers[:cc].is_a?(Array) end if @author&.logged? redmine_headers 'Sender' => @author.login end if @message_id_object headers[:message_id] = "<#{self.class.(@message_id_object, @user)}>" end if @references_objects headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o, @user)}>"}.join(' ') end if block super else super(headers) do |format| format.text format.html unless Setting.plain_text_mail? end end end |
#message_posted(user, message) ⇒ Object
Builds a mail to user about a new message.
272 273 274 275 276 277 278 279 280 281 282 283 |
# File 'app/models/mailer.rb', line 272 def (user, ) redmine_headers 'Project' => .project.identifier, 'Topic-Id' => (.parent_id || .id) @author = . references .root @message = @user = user @message_url = url_for(.event_url) mail :to => user, :subject => "[#{.board.project.name} - #{.board.name} - msg#{.root.id}] #{.subject}" end |
#news_added(user, news) ⇒ Object
Builds a mail to user about a new news.
221 222 223 224 225 226 227 228 229 230 231 |
# File 'app/models/mailer.rb', line 221 def news_added(user, news) redmine_headers 'Project' => news.project.identifier @author = news. news references news @news = news @user = user @news_url = url_for(:controller => 'news', :action => 'show', :id => news) mail :to => user, :subject => "[#{news.project.name}] #{l(:label_news)}: #{news.title}" end |
#news_comment_added(user, comment) ⇒ Object
Builds a mail to user about a new news comment.
245 246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'app/models/mailer.rb', line 245 def news_comment_added(user, comment) news = comment.commented redmine_headers 'Project' => news.project.identifier @author = comment. comment references news @news = news @comment = comment @user = user @news_url = url_for(:controller => 'news', :action => 'show', :id => news) mail :to => user, :subject => "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}" end |
#process(action, *args) ⇒ Object
Overrides ActionMailer::Base#process in order to set the recipient as the current user and his language as the default locale. The first argument of all actions of this Mailer must be a User (the recipient), otherwise an ArgumentError is raised.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'app/models/mailer.rb', line 43 def process(action, *args) user = args.first raise ArgumentError, "First argument has to be a user, was #{user.inspect}" unless user.is_a?(User) initial_user = User.current initial_language = ::I18n.locale begin User.current = user lang = find_language(user.language) if user.logged? lang ||= Setting.default_language set_language_if_valid(lang) super ensure User.current = initial_user ::I18n.locale = initial_language end end |
#register(user, token) ⇒ Object
Builds a mail to user with his account activation link.
458 459 460 461 462 463 |
# File 'app/models/mailer.rb', line 458 def register(user, token) @token = token @url = url_for(:controller => 'account', :action => 'activate', :token => token.value) mail :to => user.mail, :subject => l(:mail_subject_register, Setting.app_title) end |
#reminder(user, issues, days) ⇒ Object
Builds a reminder mail to user about issues that are due in the next days.
577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 |
# File 'app/models/mailer.rb', line 577 def reminder(user, issues, days) @issues = issues @days = days @open_issues_url = url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => 'me', :sort => 'due_date:asc') @reminder_issues_url = url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :sort => 'due_date:asc', :f => ['status_id', 'assigned_to_id', "due_date"], :op => {'status_id' => 'o', 'assigned_to_id' => '=', 'due_date' => '<t+'}, :v =>{'assigned_to_id' => ['me'], 'due_date' => [days]}) query = IssueQuery.new(:name => '_') query.add_filter('assigned_to_id', '=', ['me']) @open_issues_count = query.issue_count mail :to => user, :subject => l(:mail_subject_reminder, :count => issues.size, :days => days) end |
#security_notification(user, sender, options = {}) ⇒ Object
Build a mail to user and the additional recipients given in options about a security related event made by sender.
Example:
security_notification(user,
sender,
message: :mail_body_security_notification_add,
field: :field_mail,
value: address
) => Mail::Message object
483 484 485 486 487 488 489 490 491 492 493 494 495 496 |
# File 'app/models/mailer.rb', line 483 def security_notification(user, sender, ={}) @sender = sender redmine_headers 'Sender' => sender.login @message = l([:message], field: ([:field] && l([:field])), value: [:value]) @title = [:title] && l([:title]) @remote_ip = [:remote_ip] || @sender.remote_ip @url = [:url] && ([:url].is_a?(Hash) ? url_for([:url]) : [:url]) redmine_headers 'Url' => @url mail :to => [user, *[:recipients]].uniq, :subject => "[#{Setting.app_title}] #{l(:mail_subject_security_notification)}" end |
#settings_updated(user, sender, changes, options = {}) ⇒ Object
Build a mail to user about application settings changes made by sender.
525 526 527 528 529 530 531 532 533 |
# File 'app/models/mailer.rb', line 525 def settings_updated(user, sender, changes, ={}) @sender = sender redmine_headers 'Sender' => sender.login @changes = changes @remote_ip = [:remote_ip] || @sender.remote_ip @url = url_for(controller: 'settings', action: 'index') mail :to => user, :subject => "[#{Setting.app_title}] #{l(:mail_subject_security_notification)}" end |
#test_email(user) ⇒ Object
Build a test email to user.
557 558 559 560 561 |
# File 'app/models/mailer.rb', line 557 def test_email(user) @url = url_for(:controller => 'welcome') mail :to => user, :subject => 'Redmine test' end |
#wiki_content_added(user, wiki_content) ⇒ Object
Builds a mail to user about a new wiki content.
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
# File 'app/models/mailer.rb', line 300 def wiki_content_added(user, wiki_content) redmine_headers 'Project' => wiki_content.project.identifier, 'Wiki-Page-Id' => wiki_content.page.id @author = wiki_content. wiki_content @wiki_content = wiki_content @user = user @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', :project_id => wiki_content.project, :id => wiki_content.page.title) mail( :to => user, :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_added, :id => wiki_content.page.pretty_title)}" ) end |
#wiki_content_updated(user, wiki_content) ⇒ Object
Builds a mail to user about an update of the specified wiki content.
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 |
# File 'app/models/mailer.rb', line 329 def wiki_content_updated(user, wiki_content) redmine_headers 'Project' => wiki_content.project.identifier, 'Wiki-Page-Id' => wiki_content.page.id @author = wiki_content. wiki_content @wiki_content = wiki_content @user = user @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 => user, :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_updated, :id => wiki_content.page.pretty_title)}" ) end |