notify.rb 3.8 KB
Newer Older
G
gitlabhq 已提交
1
class Notify < ActionMailer::Base
2 3
  include ActionDispatch::Routing::PolymorphicRoutes

4 5 6 7
  include Emails::Issues
  include Emails::MergeRequests
  include Emails::Notes
  include Emails::Projects
8 9
  include Emails::Profile
  include Emails::Groups
10

G
gitlabhq 已提交
11
  add_template_helper ApplicationHelper
D
Dmitriy Zaporozhets 已提交
12
  add_template_helper GitlabMarkdownHelper
13
  add_template_helper MergeRequestsHelper
G
gitlabhq 已提交
14

15 16
  default_url_options[:host]     = Gitlab.config.gitlab.host
  default_url_options[:protocol] = Gitlab.config.gitlab.protocol
17
  default_url_options[:port]     = Gitlab.config.gitlab.port unless Gitlab.config.gitlab_on_standard_port?
18
  default_url_options[:script_name] = Gitlab.config.gitlab.relative_url_root
D
Dmitriy Zaporozhets 已提交
19

20
  default from: Proc.new { default_sender_address.format }
21
  default reply_to: "noreply@#{Gitlab.config.gitlab.host}"
G
gitlabhq 已提交
22

P
Pierre de La Morinerie 已提交
23
  # Just send email with 2 seconds delay
24 25 26
  def self.delay
    delay_for(2.seconds)
  end
27

28 29
  private

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
  # The default email address to send emails from
  def default_sender_address
    address = Mail::Address.new(Gitlab.config.gitlab.email_from)
    address.display_name = "GitLab"
    address
  end

  # Return an email address that displays the name of the sender.
  # Only the displayed name changes; the actual email address is always the same.
  def sender(sender_id)
    if sender = User.find(sender_id)
      address = default_sender_address
      address.display_name = sender.name
      address.format
    end
  end

47 48 49 50 51 52 53 54 55 56 57
  # Look up a User by their ID and return their email address
  #
  # recipient_id - User ID
  #
  # Returns a String containing the User's email address.
  def recipient(recipient_id)
    if recipient = User.find(recipient_id)
      recipient.email
    end
  end

58 59 60 61 62 63 64 65
  # Set the References header field
  #
  # local_part - The local part of the referenced message ID
  #
  def set_reference(local_part)
    headers["References"] = "<#{local_part}@#{Gitlab.config.gitlab.host}>"
  end

66 67 68 69 70 71 72
  # Formats arguments into a String suitable for use as an email subject
  #
  # extra - Extra Strings to be inserted into the subject
  #
  # Examples
  #
  #   >> subject('Lorem ipsum')
73
  #   => "Lorem ipsum"
74 75 76 77 78
  #
  #   # Automatically inserts Project name when @project is set
  #   >> @project = Project.last
  #   => #<Project id: 1, name: "Ruby on Rails", path: "ruby_on_rails", ...>
  #   >> subject('Lorem ipsum')
79
  #   => "Ruby on Rails | Lorem ipsum "
80 81 82
  #
  #   # Accepts multiple arguments
  #   >> subject('Lorem ipsum', 'Dolor sit amet')
83
  #   => "Lorem ipsum | Dolor sit amet"
84
  def subject(*extra)
85
    subject = ""
86
    subject << "#{@project.name} | " if @project
87
    subject << extra.join(' | ') if extra.present?
88
    subject
89
  end
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

  # Return a string suitable for inclusion in the 'Message-Id' mail header.
  #
  # The message-id is generated from the unique URL to a model object.
  def message_id(model)
    model_name = model.class.model_name.singular_route_key
    "<#{model_name}_#{model.id}@#{Gitlab.config.gitlab.host}>"
  end

  # Send an email that starts a new conversation thread,
  # with headers suitable for grouping by thread in email clients.
  #
  # See: mail_answer_thread
  def mail_new_thread(model, headers = {}, &block)
    headers['Message-ID'] = message_id(model)
    mail(headers, &block)
  end

  # Send an email that responds to an existing conversation thread,
  # with headers suitable for grouping by thread in email clients.
  #
  # For grouping emails by thread, email clients heuristics require the answers to:
  #
  #  * have a subject that begin by 'Re: '
  #  * have a 'In-Reply-To' or 'References' header that references the original 'Message-ID'
  #
  def mail_answer_thread(model, headers = {}, &block)
    headers['In-Reply-To'] = message_id(model)
    headers['References'] = message_id(model)

    if (headers[:subject])
      headers[:subject].prepend('Re: ')
    end

    mail(headers, &block)
  end
G
gitlabhq 已提交
126
end