2014-05-06 15:01:19 -04:00
# Builds a Mail::Message we can use for sending. Optionally supports using a template
2013-06-10 16:46:08 -04:00
# for the body and subject
module Email
module BuildEmailHelper
def build_email ( * builder_args )
builder = Email :: MessageBuilder . new ( * builder_args )
headers ( builder . header_args ) if builder . header_args . present?
2013-07-24 17:13:15 +10:00
mail ( builder . build_args ) . tap { | message |
2016-02-03 19:27:58 +01:00
if message && h = builder . html_part
2013-07-24 15:07:43 -04:00
message . html_part = h
end
2013-07-24 17:13:15 +10:00
}
2013-06-10 16:46:08 -04:00
end
end
class MessageBuilder
2013-07-22 20:20:41 +02:00
attr_reader :template_args
2013-06-10 16:46:08 -04:00
def initialize ( to , opts = nil )
@to = to
@opts = opts || { }
2013-07-22 20:20:41 +02:00
2015-08-12 23:00:16 +02:00
@template_args = {
site_name : SiteSetting . email_prefix . presence || SiteSetting . title ,
base_url : Discourse . base_url ,
user_preferences_url : " #{ Discourse . base_url } /my/preferences " ,
2016-06-03 15:48:54 +02:00
hostname : Discourse . current_hostname ,
2015-08-12 23:00:16 +02:00
} . merge! ( @opts )
2013-07-22 20:20:41 +02:00
if @template_args [ :url ] . present?
2016-06-03 15:48:54 +02:00
@template_args [ :header_instructions ] = I18n . t ( 'user_notifications.header_instructions' , @template_args )
2015-12-07 16:52:10 -05:00
2014-05-06 15:01:19 -04:00
if @opts [ :include_respond_instructions ] == false
@template_args [ :respond_instructions ] = ''
else
2016-02-26 23:56:56 +01:00
if @opts [ :only_reply_by_email ]
string = " user_notifications.only_reply_by_email "
2015-08-12 23:00:16 +02:00
else
2016-02-26 23:56:56 +01:00
string = allow_reply_by_email? ? " user_notifications.reply_by_email " : " user_notifications.visit_link_to_respond "
string << " _pm " if @opts [ :private_reply ]
2015-08-12 23:00:16 +02:00
end
2016-04-11 19:06:10 +02:00
@template_args [ :respond_instructions ] = " --- \n " + I18n . t ( string , @template_args )
2014-05-06 15:01:19 -04:00
end
2016-06-03 15:48:54 +02:00
if @opts [ :add_unsubscribe_link ]
unsubscribe_string = if @opts [ :mailing_list_mode ]
" unsubscribe_mailing_list "
elsif SiteSetting . unsubscribe_via_email_footer
" unsubscribe_link_and_mail "
else
" unsubscribe_link "
end
@template_args [ :unsubscribe_instructions ] = I18n . t ( unsubscribe_string , @template_args )
end
2013-07-22 20:20:41 +02:00
end
2013-06-10 16:46:08 -04:00
end
def subject
2014-09-29 10:46:55 +05:30
if @opts [ :use_site_subject ]
subject = String . new ( SiteSetting . email_subject )
subject . gsub! ( " %{site_name} " , @template_args [ :site_name ] )
2016-06-03 15:48:54 +02:00
subject . gsub! ( " %{optional_re} " , @opts [ :add_re_to_subject ] ? I18n . t ( 'subject_re' , @template_args ) : '' )
subject . gsub! ( " %{optional_pm} " , @opts [ :private_reply ] ? I18n . t ( 'subject_pm' , @template_args ) : '' )
2014-10-03 17:14:08 +05:30
subject . gsub! ( " %{optional_cat} " , @template_args [ :show_category_in_subject ] ? " [ #{ @template_args [ :show_category_in_subject ] } ] " : '' )
2014-09-29 10:46:55 +05:30
subject . gsub! ( " %{topic_title} " , @template_args [ :topic_title ] ) if @template_args [ :topic_title ] # must be last for safety
else
subject = @opts [ :subject ]
2016-06-03 15:48:54 +02:00
subject = I18n . t ( " #{ @opts [ :template ] } .subject_template " , @template_args ) if @opts [ :template ]
2014-09-29 10:46:55 +05:30
end
2013-06-10 16:46:08 -04:00
subject
end
2013-07-24 17:13:15 +10:00
def html_part
return unless html_override = @opts [ :html_override ]
2016-06-03 15:48:54 +02:00
if @template_args [ :unsubscribe_instructions ] . present?
unsubscribe_instructions = PrettyText . cook ( @template_args [ :unsubscribe_instructions ] , sanitize : false ) . html_safe
html_override . gsub! ( " %{unsubscribe_instructions} " , unsubscribe_instructions )
2015-11-24 16:58:26 +01:00
else
2016-06-03 15:48:54 +02:00
html_override . gsub! ( " %{unsubscribe_instructions} " , " " )
2015-11-24 16:58:26 +01:00
end
2016-06-03 15:48:54 +02:00
if @template_args [ :header_instructions ] . present?
header_instructions = PrettyText . cook ( @template_args [ :header_instructions ] , sanitize : false ) . html_safe
2015-12-07 16:52:10 -05:00
html_override . gsub! ( " %{header_instructions} " , header_instructions )
else
html_override . gsub! ( " %{header_instructions} " , " " )
end
2016-06-03 15:48:54 +02:00
if @template_args [ :respond_instructions ] . present?
respond_instructions = PrettyText . cook ( @template_args [ :respond_instructions ] , sanitize : false ) . html_safe
2015-11-24 16:58:26 +01:00
html_override . gsub! ( " %{respond_instructions} " , respond_instructions )
else
html_override . gsub! ( " %{respond_instructions} " , " " )
2013-07-24 17:13:15 +10:00
end
2015-10-22 19:10:07 +02:00
styled = Email :: Styles . new ( html_override , @opts )
2013-07-24 17:13:15 +10:00
styled . format_basic
2013-07-26 17:27:46 +10:00
if style = @opts [ :style ]
2016-06-03 15:48:54 +02:00
styled . send ( " format_ #{ style } " )
2013-07-26 17:27:46 +10:00
end
2013-07-24 17:13:15 +10:00
Mail :: Part . new do
content_type 'text/html; charset=UTF-8'
body styled . to_html
end
end
2013-06-10 16:46:08 -04:00
def body
body = @opts [ :body ]
2014-02-18 11:14:35 +11:00
body = I18n . t ( " #{ @opts [ :template ] } .text_body_template " , template_args ) . dup if @opts [ :template ]
2013-06-10 16:46:08 -04:00
2016-06-03 15:48:54 +02:00
if @template_args [ :unsubscribe_instructions ] . present?
2013-06-10 16:46:08 -04:00
body << " \n "
2016-06-03 15:48:54 +02:00
body << @template_args [ :unsubscribe_instructions ]
2013-06-10 16:46:08 -04:00
end
body
end
def build_args
2016-06-03 15:48:54 +02:00
{
to : @to ,
2013-06-13 17:00:00 -04:00
subject : subject ,
body : body ,
charset : 'UTF-8' ,
2016-06-03 15:48:54 +02:00
from : from_value
}
2013-06-10 16:46:08 -04:00
end
def header_args
result = { }
if @opts [ :add_unsubscribe_link ]
2016-04-07 22:21:17 +08:00
result [ 'List-Unsubscribe' ] = " < #{ template_args [ :user_preferences_url ] } > "
end
2013-06-18 15:54:02 -04:00
result [ 'X-Discourse-Post-Id' ] = @opts [ :post_id ] . to_s if @opts [ :post_id ]
result [ 'X-Discourse-Topic-Id' ] = @opts [ :topic_id ] . to_s if @opts [ :topic_id ]
2013-06-13 18:11:10 -04:00
2013-06-13 17:00:00 -04:00
if allow_reply_by_email?
2013-06-18 15:54:02 -04:00
result [ 'X-Discourse-Reply-Key' ] = reply_key
2013-06-13 17:00:00 -04:00
result [ 'Reply-To' ] = reply_by_email_address
else
result [ 'Reply-To' ] = from_value
end
2013-06-13 10:56:16 -04:00
2013-07-07 04:37:44 +04:00
result . merge ( MessageBuilder . custom_headers ( SiteSetting . email_custom_headers ) )
end
def self . custom_headers ( string )
result = { }
string . split ( '|' ) . each { | item |
header = item . split ( ':' , 2 )
if header . length == 2
name = header [ 0 ] . strip
value = header [ 1 ] . strip
result [ name ] = value if name . length > 0 && value . length > 0
end
2013-07-10 17:47:38 +04:00
} unless string . nil?
2013-06-10 16:46:08 -04:00
result
end
2013-06-13 17:00:00 -04:00
protected
def reply_key
@reply_key || = SecureRandom . hex ( 16 )
end
def allow_reply_by_email?
SiteSetting . reply_by_email_enabled? &&
reply_by_email_address . present? &&
@opts [ :allow_reply_by_email ]
end
2014-06-06 21:09:00 +08:00
def private_reply?
2015-02-06 12:08:37 +01:00
allow_reply_by_email? && @opts [ :private_reply ]
2014-06-06 21:09:00 +08:00
end
2013-06-13 17:00:00 -04:00
def from_value
return @from_value if @from_value
@from_value = @opts [ :from ] || SiteSetting . notification_email
@from_value = alias_email ( @from_value )
end
def reply_by_email_address
return @reply_by_email_address if @reply_by_email_address
return nil unless SiteSetting . reply_by_email_address . present?
@reply_by_email_address = SiteSetting . reply_by_email_address . dup
@reply_by_email_address . gsub! ( " %{reply_key} " , reply_key )
2014-06-06 21:09:00 +08:00
@reply_by_email_address = if private_reply?
alias_email ( @reply_by_email_address )
else
site_alias_email ( @reply_by_email_address )
end
2013-06-13 17:00:00 -04:00
end
def alias_email ( source )
2014-07-22 15:52:14 -04:00
return source if @opts [ :from_alias ] . blank? && SiteSetting . email_site_title . blank?
if ! @opts [ :from_alias ] . blank?
2014-08-08 13:35:25 -04:00
" #{ Email . cleanup_alias ( @opts [ :from_alias ] ) } < #{ source } > "
2014-07-22 15:52:14 -04:00
else
2014-08-08 13:35:25 -04:00
" #{ Email . cleanup_alias ( SiteSetting . email_site_title ) } < #{ source } > "
2014-07-22 15:52:14 -04:00
end
2013-06-13 17:00:00 -04:00
end
2014-06-06 21:09:00 +08:00
def site_alias_email ( source )
2014-08-08 13:35:25 -04:00
" #{ Email . cleanup_alias ( SiteSetting . email_site_title . presence || SiteSetting . title ) } < #{ source } > "
2014-06-06 21:09:00 +08:00
end
2013-06-10 16:46:08 -04:00
end
end