Class: Mailer
- Inherits:
-
ActionMailer::Base
- Object
- ActionMailer::Base
- Mailer
- Includes:
- Redmine::I18n, Roadie::Rails::Automatic
- Defined in:
- app/models/mailer.rb
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, &block) ⇒ Object
Activates/desactivates email deliveries during
block
. -
.with_synched_deliveries(&block) ⇒ 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, #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.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'app/models/mailer.rb', line 57 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
404 405 406 |
# File 'app/models/mailer.rb', line 404 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)
384 385 386 387 388 389 390 |
# File 'app/models/mailer.rb', line 384 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.
365 366 367 |
# File 'app/models/mailer.rb', line 365 def self.deliver_account_information(user, password) account_information(user, password).deliver_later end |
.deliver_attachments_added(attachments) ⇒ Object
195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'app/models/mailer.rb', line 195 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, )
158 159 160 161 162 163 |
# File 'app/models/mailer.rb', line 158 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
97 98 99 100 101 102 |
# File 'app/models/mailer.rb', line 97 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
133 134 135 136 137 138 139 140 141 |
# File 'app/models/mailer.rb', line 133 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]')
423 424 425 |
# File 'app/models/mailer.rb', line 423 def self.deliver_lost_password(user, token, recipient=nil) lost_password(user, token, recipient).deliver_later end |
.deliver_mail(mail) ⇒ Object
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 |
# File 'app/models/mailer.rb', line 718 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
278 279 280 281 282 283 284 285 286 |
# File 'app/models/mailer.rb', line 278 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
226 227 228 229 230 231 |
# File 'app/models/mailer.rb', line 226 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
252 253 254 255 256 257 258 |
# File 'app/models/mailer.rb', line 252 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)
431 432 433 434 435 436 437 438 439 440 441 442 443 444 |
# File 'app/models/mailer.rb', line 431 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)
458 459 460 |
# File 'app/models/mailer.rb', line 458 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
)
500 501 502 503 504 505 506 507 508 509 510 511 |
# File 'app/models/mailer.rb', line 500 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])
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 |
# File 'app/models/mailer.rb', line 529 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)
556 557 558 559 560 561 562 563 |
# File 'app/models/mailer.rb', line 556 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)
310 311 312 313 314 315 |
# File 'app/models/mailer.rb', line 310 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)
344 345 346 347 348 349 350 351 352 353 |
# File 'app/models/mailer.rb', line 344 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]"]
740 741 742 743 744 745 746 747 748 749 750 751 |
# File 'app/models/mailer.rb', line 740 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
785 786 787 |
# File 'app/models/mailer.rb', line 785 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
791 792 793 |
# File 'app/models/mailer.rb', line 791 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)
592 593 594 595 596 597 598 599 600 601 602 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 |
# File 'app/models/mailer.rb', line 592 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| 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
771 772 773 774 775 776 777 778 779 780 781 782 |
# File 'app/models/mailer.rb', line 771 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, &block) ⇒ Object
Activates/desactivates email deliveries during block
634 635 636 637 638 639 640 |
# File 'app/models/mailer.rb', line 634 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
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
647 648 649 650 651 652 653 |
# File 'app/models/mailer.rb', line 647 def self.with_synched_deliveries(&block) 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.
393 394 395 396 397 398 |
# File 'app/models/mailer.rb', line 393 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.
370 371 372 373 374 375 376 377 |
# File 'app/models/mailer.rb', line 370 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.
356 357 358 359 360 361 362 |
# File 'app/models/mailer.rb', line 356 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.
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'app/models/mailer.rb', line 166 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 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)}" end |
#document_added(user, document, author) ⇒ Object
Builds a mail to user about a new document.
144 145 146 147 148 149 150 151 152 |
# File 'app/models/mailer.rb', line 144 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
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'app/models/mailer.rb', line 73 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
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'app/models/mailer.rb', line 105 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.
409 410 411 412 413 414 415 |
# File 'app/models/mailer.rb', line 409 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
655 656 657 658 659 660 661 662 663 664 665 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 |
# File 'app/models/mailer.rb', line 655 def mail(headers={}, &block) # Add a display name to the From field if Setting.mail_from does not # include it begin 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 list_id = "<#{mail_from.address.to_s.tr('@', '.')}>" 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 headers, &block 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.
261 262 263 264 265 266 267 268 269 270 271 272 |
# File 'app/models/mailer.rb', line 261 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.
210 211 212 213 214 215 216 217 218 219 220 |
# File 'app/models/mailer.rb', line 210 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.
234 235 236 237 238 239 240 241 242 243 244 245 246 |
# File 'app/models/mailer.rb', line 234 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.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'app/models/mailer.rb', line 35 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(action, *args) 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.
447 448 449 450 451 452 |
# File 'app/models/mailer.rb', line 447 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.
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 |
# File 'app/models/mailer.rb', line 566 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
472 473 474 475 476 477 478 479 480 481 482 483 484 485 |
# File 'app/models/mailer.rb', line 472 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.
514 515 516 517 518 519 520 521 522 |
# File 'app/models/mailer.rb', line 514 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.
546 547 548 549 550 |
# File 'app/models/mailer.rb', line 546 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.
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
# File 'app/models/mailer.rb', line 289 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.
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 |
# File 'app/models/mailer.rb', line 318 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 |