notify.rb 4.0 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
14
  add_template_helper EmailsHelper
G
gitlabhq 已提交
15

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

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

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

29 30 31 32 33 34 35 36
  def test_email(recepient_email, subject, body)
    mail(to: recepient_email,
         subject: subject,
         body: body.html_safe,
         content_type: 'text/html'
    )
  end

37 38
  private

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
  # 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

56 57 58 59 60 61 62 63 64 65 66
  # 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

67 68 69 70 71 72 73 74
  # 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

75 76 77 78 79 80 81
  # 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')
82
  #   => "Lorem ipsum"
83 84 85 86 87
  #
  #   # 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')
88
  #   => "Ruby on Rails | Lorem ipsum "
89 90 91
  #
  #   # Accepts multiple arguments
  #   >> subject('Lorem ipsum', 'Dolor sit amet')
92
  #   => "Lorem ipsum | Dolor sit amet"
93
  def subject(*extra)
94
    subject = ""
95
    subject << "#{@project.name} | " if @project
96
    subject << extra.join(' | ') if extra.present?
97
    subject
98
  end
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 126 127 128 129 130 131 132 133 134

  # 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 已提交
135
end