FEATURE: add setting to show content of forwarded emails in topics (#7935)

This commit is contained in:
Leo McArdle
2019-08-07 11:32:19 +01:00
committed by Régis Hanol
parent 5d72561f4f
commit 6296ae3d31
5 changed files with 165 additions and 34 deletions

View File

@@ -660,7 +660,7 @@ module Email
end
def process_destination(destination, user, body, elided, hidden_reason_id)
return if SiteSetting.enable_forwarded_emails &&
return if SiteSetting.forwarded_emails_behaviour != "hide" &&
has_been_forwarded? &&
process_forwarded_email(destination, user)
@@ -800,27 +800,30 @@ module Email
def process_forwarded_email(destination, user)
user ||= stage_from_user
embedded = Mail.new(embedded_email_raw)
email, display_name = parse_from_field(embedded)
return false if email.blank? || !email["@"]
raw = try_to_encode(embedded.decoded, "UTF-8").presence || embedded.to_s
title = embedded.subject.presence || subject
case SiteSetting.forwarded_emails_behaviour
when "create_replies"
forwarded_email_create_replies(destination, user)
when "quote"
forwarded_email_quote_forwarded(destination, user)
else
false
end
end
def forwarded_email_create_topic(destination: , user: , raw: , title: , date: nil, embedded_user: nil)
case destination[:type]
when :group
group = destination[:obj]
embedded_user = find_or_create_user(email, display_name)
post = create_topic(user: embedded_user,
raw: raw,
title: title,
archetype: Archetype.private_message,
target_usernames: [user.username],
target_group_names: [group.name],
is_group_message: true,
skip_validations: true,
created_at: embedded.date)
topic_user = embedded_user&.call || user
create_topic(user: topic_user,
raw: raw,
title: title,
archetype: Archetype.private_message,
target_usernames: [user.username],
target_group_names: [group.name],
is_group_message: true,
skip_validations: true,
created_at: date)
when :category
category = destination[:obj]
@@ -828,16 +831,31 @@ module Email
return false if user.staged? && !category.email_in_allow_strangers
return false if !user.has_trust_level?(SiteSetting.email_in_min_trust)
embedded_user = find_or_create_user(email, display_name)
post = create_topic(user: embedded_user,
raw: raw,
title: title,
category: category.id,
skip_validations: embedded_user.staged?,
created_at: embedded.date)
topic_user = embedded_user&.call || user
create_topic(user: topic_user,
raw: raw,
title: title,
category: category.id,
skip_validations: topic_user.staged?,
created_at: date)
else
return false
false
end
end
def forwarded_email_create_replies(destination, user)
embedded = Mail.new(embedded_email_raw)
email, display_name = parse_from_field(embedded)
return false if email.blank? || !email["@"]
post = forwarded_email_create_topic(destination: destination,
user: user,
raw: try_to_encode(embedded.decoded, "UTF-8").presence || embedded.to_s,
title: embedded.subject.presence || subject,
date: embedded.date,
embedded_user: lambda { find_or_create_user(email, display_name) })
return false unless post
if post&.topic
# mark post as seen for the forwarder
@@ -846,7 +864,7 @@ module Email
# create reply when available
if @before_embedded.present?
post_type = Post.types[:regular]
post_type = Post.types[:whisper] if post.topic.private_message? && group.usernames[user.username]
post_type = Post.types[:whisper] if post.topic.private_message? && destination[:obj].usernames[user.username]
create_reply(user: user,
raw: @before_embedded,
@@ -860,6 +878,19 @@ module Email
true
end
def forwarded_email_quote_forwarded(destination, user)
embedded = embedded_email_raw
raw = <<~EOF
#{@before_embedded}
[quote]
#{PlainTextToMarkdown.new(embedded).to_markdown}
[/quote]
EOF
return true if forwarded_email_create_topic(destination: destination, user: user, raw: raw, title: subject)
end
def self.reply_by_email_address_regex(extract_reply_key = true, include_verp = false)
reply_addresses = [SiteSetting.reply_by_email_address]
reply_addresses << (SiteSetting.alternative_reply_by_email_addresses.presence || "").split("|")