restyle all user notification emails to use a custom html template
This commit is contained in:
parent
cb5ce3aab9
commit
366cb13140
|
@ -9,4 +9,12 @@ module UserNotificationsHelper
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def correct_top_margin(html, desired)
|
||||||
|
fragment = Nokogiri::HTML.fragment(html)
|
||||||
|
if para = fragment.css("p:first").first
|
||||||
|
para["style"] = "margin-top: #{desired};"
|
||||||
|
end
|
||||||
|
fragment.to_html.html_safe
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -96,12 +96,16 @@ class UserNotifications < ActionMailer::Base
|
||||||
|
|
||||||
def email_post_markdown(post)
|
def email_post_markdown(post)
|
||||||
result = "[email-indent]\n"
|
result = "[email-indent]\n"
|
||||||
result << "#### #{I18n.t('user_notifications.posted_by', username: post.username, post_date: post.created_at.strftime("%m/%d/%Y"))}\n\n"
|
|
||||||
result << "#{post.raw}\n\n"
|
result << "#{post.raw}\n\n"
|
||||||
|
result << "#{I18n.t('user_notifications.posted_by', username: post.username, post_date: post.created_at.strftime("%m/%d/%Y"))}\n\n"
|
||||||
result << "[/email-indent]\n"
|
result << "[/email-indent]\n"
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class UserNotificationRenderer < ActionView::Base
|
||||||
|
include UserNotificationsHelper
|
||||||
|
end
|
||||||
|
|
||||||
def notification_email(user, opts)
|
def notification_email(user, opts)
|
||||||
@notification = opts[:notification]
|
@notification = opts[:notification]
|
||||||
return unless @notification.present?
|
return unless @notification.present?
|
||||||
|
@ -119,12 +123,19 @@ class UserNotifications < ActionMailer::Base
|
||||||
.limit(SiteSetting.email_posts_context)
|
.limit(SiteSetting.email_posts_context)
|
||||||
|
|
||||||
if context_posts.present?
|
if context_posts.present?
|
||||||
context << "---\n### #{I18n.t('user_notifications.post_history')}\n"
|
context << "---\n*#{I18n.t('user_notifications.previous_discussion')}*\n"
|
||||||
context_posts.each do |cp|
|
context_posts.each do |cp|
|
||||||
context << email_post_markdown(cp)
|
context << email_post_markdown(cp)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
html = UserNotificationRenderer.new(Rails.configuration.paths["app/views"]).render(
|
||||||
|
template: 'email/notification',
|
||||||
|
format: :html,
|
||||||
|
locals: { context_posts: context_posts, post: @post }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
email_opts = {
|
email_opts = {
|
||||||
topic_title: @notification.data_hash[:topic_title],
|
topic_title: @notification.data_hash[:topic_title],
|
||||||
message: email_post_markdown(@post),
|
message: email_post_markdown(@post),
|
||||||
|
@ -135,7 +146,8 @@ class UserNotifications < ActionMailer::Base
|
||||||
username: username,
|
username: username,
|
||||||
add_unsubscribe_link: true,
|
add_unsubscribe_link: true,
|
||||||
allow_reply_by_email: opts[:allow_reply_by_email],
|
allow_reply_by_email: opts[:allow_reply_by_email],
|
||||||
template: "user_notifications.user_#{notification_type}"
|
template: "user_notifications.user_#{notification_type}",
|
||||||
|
html_override: html
|
||||||
}
|
}
|
||||||
|
|
||||||
# If we have a display name, change the from address
|
# If we have a display name, change the from address
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
<table cellspacing="0" cellpadding="0" border="0" style='margin-bottom:20px;max-width:761px'>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style='padding-right:10px;vertical-align:top;'>
|
||||||
|
<img width="45" height="45" src="<%= post.user.small_avatar_url%>" class="avatar" title="<%= post.user.username%>">
|
||||||
|
</td>
|
||||||
|
<td style="width: 100%">
|
||||||
|
<table cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="font-size:13px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;padding-right:10px;">
|
||||||
|
<a style="color:#3b5998;text-decoration:none;font-weight:bold" href="<%=Discourse.base_url%>/users/<%= post.user.username_lower%>" target="_blank"><%= post.user.username %></a>
|
||||||
|
</td>
|
||||||
|
<td style="text-align:right;color:#999999;padding-right:5px;font-family:'lucida grande',tahoma,verdana,arial,sans-serif;font-size:11px"> <%= l post.created_at, format: :short_no_year %> </td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<%= correct_top_margin post.cooked.html_safe, "5px" %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
|
@ -0,0 +1,12 @@
|
||||||
|
<%= render :partial => 'email/post', :locals => {:post => post} %>
|
||||||
|
|
||||||
|
<% if context_posts.present? %>
|
||||||
|
<hr>
|
||||||
|
<h4 style='font-size: 17px; color: #444;'><%= t "user_notifications.previous_discussion" %></h4>
|
||||||
|
|
||||||
|
<% context_posts.each do |p| %>
|
||||||
|
<%= render :partial => 'email/post', :locals => {:post => p} %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<hr>
|
|
@ -934,6 +934,7 @@ en:
|
||||||
unsubscribe_link: "To unsubscribe from these emails, visit your [user preferences](%{user_preferences_url})."
|
unsubscribe_link: "To unsubscribe from these emails, visit your [user preferences](%{user_preferences_url})."
|
||||||
|
|
||||||
user_notifications:
|
user_notifications:
|
||||||
|
previous_discussion: "Previous discussion"
|
||||||
unsubscribe:
|
unsubscribe:
|
||||||
title: "Unsubscribe"
|
title: "Unsubscribe"
|
||||||
description: "Not interested in getting these emails? No problem! Click below to unsubscribe instantly:"
|
description: "Not interested in getting these emails? No problem! Click below to unsubscribe instantly:"
|
||||||
|
@ -941,7 +942,6 @@ en:
|
||||||
reply_by_email: "To respond, reply to this email or visit %{base_url}%{url} in your browser."
|
reply_by_email: "To respond, reply to this email or visit %{base_url}%{url} in your browser."
|
||||||
visit_link_to_respond: "To respond, visit %{base_url}%{url} in your browser."
|
visit_link_to_respond: "To respond, visit %{base_url}%{url} in your browser."
|
||||||
|
|
||||||
post_history: "Post History"
|
|
||||||
posted_by: "Posted by %{username} on %{post_date}"
|
posted_by: "Posted by %{username} on %{post_date}"
|
||||||
|
|
||||||
user_invited_to_private_message:
|
user_invited_to_private_message:
|
||||||
|
@ -954,8 +954,6 @@ en:
|
||||||
user_replied:
|
user_replied:
|
||||||
subject_template: "[%{site_name}] new reply to your post in '%{topic_title}'"
|
subject_template: "[%{site_name}] new reply to your post in '%{topic_title}'"
|
||||||
text_body_template: |
|
text_body_template: |
|
||||||
%{username} replied to your post in '%{topic_title}' on %{site_name}:
|
|
||||||
|
|
||||||
%{message}
|
%{message}
|
||||||
|
|
||||||
%{context}
|
%{context}
|
||||||
|
@ -966,8 +964,6 @@ en:
|
||||||
user_quoted:
|
user_quoted:
|
||||||
subject_template: "[%{site_name}] %{username} quoted you in '%{topic_title}'"
|
subject_template: "[%{site_name}] %{username} quoted you in '%{topic_title}'"
|
||||||
text_body_template: |
|
text_body_template: |
|
||||||
%{username} quoted you in '%{topic_title}' on %{site_name}:
|
|
||||||
|
|
||||||
%{message}
|
%{message}
|
||||||
|
|
||||||
%{context}
|
%{context}
|
||||||
|
@ -978,8 +974,6 @@ en:
|
||||||
user_mentioned:
|
user_mentioned:
|
||||||
subject_template: "[%{site_name}] %{username} mentioned you in '%{topic_title}'"
|
subject_template: "[%{site_name}] %{username} mentioned you in '%{topic_title}'"
|
||||||
text_body_template: |
|
text_body_template: |
|
||||||
### %{username} mentioned you in '%{topic_title}' on %{site_name}:
|
|
||||||
|
|
||||||
%{message}
|
%{message}
|
||||||
|
|
||||||
%{context}
|
%{context}
|
||||||
|
@ -990,8 +984,6 @@ en:
|
||||||
user_posted:
|
user_posted:
|
||||||
subject_template: "[%{site_name}] new post in '%{topic_title}'"
|
subject_template: "[%{site_name}] new post in '%{topic_title}'"
|
||||||
text_body_template: |
|
text_body_template: |
|
||||||
%{username} posted in '%{topic_title}' on %{site_name}:
|
|
||||||
|
|
||||||
%{message}
|
%{message}
|
||||||
|
|
||||||
%{context}
|
%{context}
|
||||||
|
|
|
@ -6,7 +6,9 @@ module Email
|
||||||
def build_email(*builder_args)
|
def build_email(*builder_args)
|
||||||
builder = Email::MessageBuilder.new(*builder_args)
|
builder = Email::MessageBuilder.new(*builder_args)
|
||||||
headers(builder.header_args) if builder.header_args.present?
|
headers(builder.header_args) if builder.header_args.present?
|
||||||
mail(builder.build_args)
|
mail(builder.build_args).tap { |message|
|
||||||
|
message.html_part = builder.html_part if message
|
||||||
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -22,10 +24,11 @@ module Email
|
||||||
user_preferences_url: "#{Discourse.base_url}/user_preferences" }.merge!(@opts)
|
user_preferences_url: "#{Discourse.base_url}/user_preferences" }.merge!(@opts)
|
||||||
|
|
||||||
if @template_args[:url].present?
|
if @template_args[:url].present?
|
||||||
|
@template_args[:respond_instructions] =
|
||||||
if allow_reply_by_email?
|
if allow_reply_by_email?
|
||||||
@template_args[:respond_instructions] = I18n.t('user_notifications.reply_by_email', @template_args)
|
I18n.t('user_notifications.reply_by_email', @template_args)
|
||||||
else
|
else
|
||||||
@template_args[:respond_instructions] = I18n.t('user_notifications.visit_link_to_respond', @template_args)
|
I18n.t('user_notifications.visit_link_to_respond', @template_args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -36,6 +39,27 @@ module Email
|
||||||
subject
|
subject
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def html_part
|
||||||
|
return unless html_override = @opts[:html_override]
|
||||||
|
if @opts[:add_unsubscribe_link]
|
||||||
|
html_override << "<br>".html_safe
|
||||||
|
|
||||||
|
if response_instructions = @template_args[:respond_instructions]
|
||||||
|
html_override << PrettyText.cook(response_instructions).html_safe
|
||||||
|
end
|
||||||
|
|
||||||
|
html_override << PrettyText.cook(I18n.t('unsubscribe_link', template_args)).html_safe
|
||||||
|
end
|
||||||
|
|
||||||
|
styled = Email::Styles.new(html_override)
|
||||||
|
styled.format_basic
|
||||||
|
|
||||||
|
Mail::Part.new do
|
||||||
|
content_type 'text/html; charset=UTF-8'
|
||||||
|
body styled.to_html
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def body
|
def body
|
||||||
body = @opts[:body]
|
body = @opts[:body]
|
||||||
body = I18n.t("#{@opts[:template]}.text_body_template", template_args) if @opts[:template]
|
body = I18n.t("#{@opts[:template]}.text_body_template", template_args) if @opts[:template]
|
||||||
|
|
|
@ -32,14 +32,15 @@ module Email
|
||||||
|
|
||||||
renderer = Email::Renderer.new(@message, opts)
|
renderer = Email::Renderer.new(@message, opts)
|
||||||
|
|
||||||
|
unless @message.html_part
|
||||||
@message.html_part = Mail::Part.new do
|
@message.html_part = Mail::Part.new do
|
||||||
content_type 'text/html; charset=UTF-8'
|
content_type 'text/html; charset=UTF-8'
|
||||||
body renderer.html
|
body renderer.html
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@message.parts[0].body = @message.parts[0].body.to_s.gsub!(/\[\/?email-indent\]/, '')
|
@message.parts[0].body = @message.parts[0].body.to_s.gsub!(/\[\/?email-indent\]/, '')
|
||||||
|
|
||||||
|
|
||||||
@message.text_part.content_type = 'text/plain; charset=UTF-8'
|
@message.text_part.content_type = 'text/plain; charset=UTF-8'
|
||||||
|
|
||||||
# Set up the email log
|
# Set up the email log
|
||||||
|
|
Loading…
Reference in New Issue