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
#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
402 403 404 |
# File 'app/models/mailer.rb', line 402 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)
382 383 384 385 386 387 388 |
# File 'app/models/mailer.rb', line 382 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.
363 364 365 |
# File 'app/models/mailer.rb', line 363 def self.deliver_account_information(user, password) account_information(user, password).deliver_later end |
.deliver_attachments_added(attachments) ⇒ Object
193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'app/models/mailer.rb', line 193 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, )
156 157 158 159 160 161 |
# File 'app/models/mailer.rb', line 156 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
96 97 98 99 100 101 |
# File 'app/models/mailer.rb', line 96 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
131 132 133 134 135 136 137 138 139 |
# File 'app/models/mailer.rb', line 131 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]')
421 422 423 |
# File 'app/models/mailer.rb', line 421 def self.deliver_lost_password(user, token, recipient=nil) lost_password(user, token, recipient).deliver_later end |
.deliver_mail(mail) ⇒ Object
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 |
# File 'app/models/mailer.rb', line 716 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
276 277 278 279 280 281 282 283 284 |
# File 'app/models/mailer.rb', line 276 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
224 225 226 227 228 229 |
# File 'app/models/mailer.rb', line 224 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
250 251 252 253 254 255 256 |
# File 'app/models/mailer.rb', line 250 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)
429 430 431 432 433 434 435 436 437 438 439 440 441 442 |
# File 'app/models/mailer.rb', line 429 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)
456 457 458 |
# File 'app/models/mailer.rb', line 456 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
)
498 499 500 501 502 503 504 505 506 507 508 509 |
# File 'app/models/mailer.rb', line 498 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])
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 |
# File 'app/models/mailer.rb', line 527 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)
554 555 556 557 558 559 560 561 |
# File 'app/models/mailer.rb', line 554 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)
308 309 310 311 312 313 |
# File 'app/models/mailer.rb', line 308 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)
342 343 344 345 346 347 348 349 350 351 |
# File 'app/models/mailer.rb', line 342 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]"]
738 739 740 741 742 743 744 745 746 747 748 749 |
# File 'app/models/mailer.rb', line 738 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
783 784 785 |
# File 'app/models/mailer.rb', line 783 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
789 790 791 |
# File 'app/models/mailer.rb', line 789 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)
590 591 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 |
# File 'app/models/mailer.rb', line 590 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
769 770 771 772 773 774 775 776 777 778 779 780 |
# File 'app/models/mailer.rb', line 769 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
632 633 634 635 636 637 638 |
# File 'app/models/mailer.rb', line 632 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
645 646 647 648 649 650 651 |
# File 'app/models/mailer.rb', line 645 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.
391 392 393 394 395 396 |
# File 'app/models/mailer.rb', line 391 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.
368 369 370 371 372 373 374 375 |
# File 'app/models/mailer.rb', line 368 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.
354 355 356 357 358 359 360 |
# File 'app/models/mailer.rb', line 354 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.
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'app/models/mailer.rb', line 164 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.
142 143 144 145 146 147 148 149 150 |
# File 'app/models/mailer.rb', line 142 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 |
# 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) 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
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'app/models/mailer.rb', line 104 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) 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.
407 408 409 410 411 412 413 |
# File 'app/models/mailer.rb', line 407 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
653 654 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 |
# File 'app/models/mailer.rb', line 653 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_given? 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.
259 260 261 262 263 264 265 266 267 268 269 270 |
# File 'app/models/mailer.rb', line 259 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.
208 209 210 211 212 213 214 215 216 217 218 |
# File 'app/models/mailer.rb', line 208 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.
232 233 234 235 236 237 238 239 240 241 242 243 244 |
# File 'app/models/mailer.rb', line 232 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.
445 446 447 448 449 450 |
# File 'app/models/mailer.rb', line 445 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.
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 |
# File 'app/models/mailer.rb', line 564 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
470 471 472 473 474 475 476 477 478 479 480 481 482 483 |
# File 'app/models/mailer.rb', line 470 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.
512 513 514 515 516 517 518 519 520 |
# File 'app/models/mailer.rb', line 512 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.
544 545 546 547 548 |
# File 'app/models/mailer.rb', line 544 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.
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
# File 'app/models/mailer.rb', line 287 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.
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
# File 'app/models/mailer.rb', line 316 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 |