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 |
2013-07-24 15:07:43 -04:00
if message and h = builder . html_part
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 " ,
} . merge! ( @opts )
2013-07-22 20:20:41 +02:00
if @template_args [ :url ] . present?
2015-12-07 16:52:10 -05:00
@template_args [ :header_instructions ] = I18n . t ( 'user_notifications.header_instructions' )
2014-05-06 15:01:19 -04:00
if @opts [ :include_respond_instructions ] == false
@template_args [ :respond_instructions ] = ''
else
2015-08-12 23:00:16 +02:00
@template_args [ :respond_instructions ] = if allow_reply_by_email?
I18n . t ( 'user_notifications.reply_by_email' , @template_args )
else
I18n . t ( 'user_notifications.visit_link_to_respond' , @template_args )
end
2014-05-06 15:01:19 -04:00
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 ] )
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 ]
subject = I18n . t ( " #{ @opts [ :template ] } .subject_template " , template_args ) if @opts [ :template ]
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 ]
2015-08-12 23:00:16 +02:00
if @opts [ :add_unsubscribe_link ]
2015-12-11 10:06:07 -05:00
unsubscribe_link = PrettyText . cook ( I18n . t ( 'unsubscribe_link' , template_args ) , sanitize : false ) . html_safe
2015-08-12 23:00:16 +02:00
html_override . gsub! ( " %{unsubscribe_link} " , unsubscribe_link )
2016-01-20 22:25:25 +13:00
if SiteSetting . unsubscribe_via_email_footer && @opts [ :add_unsubscribe_via_email_link ]
unsubscribe_via_email_link = PrettyText . cook ( I18n . t ( 'unsubscribe_via_email_link' , hostname : Discourse . current_hostname ) , sanitize : false ) . html_safe
html_override . gsub! ( " %{unsubscribe_via_email_link} " , unsubscribe_via_email_link )
else
html_override . gsub! ( " %{unsubscribe_via_email_link} " , " " )
end
2015-11-24 16:58:26 +01:00
else
html_override . gsub! ( " %{unsubscribe_link} " , " " )
end
2015-12-07 16:52:10 -05:00
header_instructions = @template_args [ :header_instructions ]
if header_instructions . present?
2015-12-10 18:14:51 -05:00
header_instructions = PrettyText . cook ( 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
2015-11-24 16:58:26 +01:00
if response_instructions = @template_args [ :respond_instructions ]
2015-12-10 18:14:51 -05:00
respond_instructions = PrettyText . cook ( response_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-12-10 18:14:51 -05:00
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 ]
styled . send " format_ #{ style } "
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
if @opts [ :add_unsubscribe_link ]
body << " \n "
body << I18n . t ( 'unsubscribe_link' , template_args )
2016-01-20 22:25:25 +13:00
if SiteSetting . unsubscribe_via_email_footer && @opts [ :add_unsubscribe_via_email_link ]
body << I18n . t ( 'unsubscribe_via_email_link' , hostname : Discourse . current_hostname )
end
2013-06-10 16:46:08 -04:00
end
body
end
def build_args
2013-06-13 17:00:00 -04:00
{ to : @to ,
subject : subject ,
body : body ,
charset : 'UTF-8' ,
from : from_value }
2013-06-10 16:46:08 -04:00
end
def header_args
result = { }
if @opts [ :add_unsubscribe_link ]
result [ 'List-Unsubscribe' ] = " < #{ template_args [ :user_preferences_url ] } > " if @opts [ :add_unsubscribe_link ]
end
2013-06-13 10:56:16 -04:00
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