mirror of
https://github.com/discourse/discourse.git
synced 2025-02-28 16:29:22 +00:00
FEATURE: add support for multiple incoming emails for groups & categories
This commit is contained in:
parent
54262cc9b2
commit
f7432d8ec9
@ -33,6 +33,8 @@ class Category < ActiveRecord::Base
|
||||
length: { in: 1..50 }
|
||||
validate :parent_category_validator
|
||||
|
||||
validate :email_in_validator
|
||||
|
||||
validate :ensure_slug
|
||||
before_save :apply_permissions
|
||||
before_save :downcase_email
|
||||
@ -308,7 +310,16 @@ SQL
|
||||
end
|
||||
|
||||
def downcase_email
|
||||
self.email_in = email_in.downcase if self.email_in
|
||||
self.email_in = (email_in || "").strip.downcase.presence
|
||||
end
|
||||
|
||||
def email_in_validator
|
||||
return if self.email_in.blank?
|
||||
email_in.split("|").each do |email|
|
||||
unless Email.is_valid?(email)
|
||||
self.errors.add(:base, I18n.t('category.errors.invalid_email_in', email_in: email))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def downcase_name
|
||||
@ -380,7 +391,7 @@ SQL
|
||||
end
|
||||
|
||||
def self.find_by_email(email)
|
||||
self.find_by(email_in: Email.downcase(email))
|
||||
self.where("email_in LIKE ?", "%#{Email.downcase(email)}%").first
|
||||
end
|
||||
|
||||
def has_children?
|
||||
|
@ -81,8 +81,10 @@ class Group < ActiveRecord::Base
|
||||
|
||||
def incoming_email_validator
|
||||
return if self.automatic || self.incoming_email.blank?
|
||||
unless Email.is_valid?(incoming_email)
|
||||
self.errors.add(:base, I18n.t('groups.errors.invalid_incoming_email', incoming_email: incoming_email))
|
||||
incoming_email.split("|").each do |email|
|
||||
unless Email.is_valid?(email)
|
||||
self.errors.add(:base, I18n.t('groups.errors.invalid_incoming_email', incoming_email: email))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -332,7 +334,7 @@ class Group < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def self.find_by_email(email)
|
||||
self.find_by(incoming_email: Email.downcase(email))
|
||||
self.where("incoming_email LIKE ?", "%#{Email.downcase(email)}%").first
|
||||
end
|
||||
|
||||
def bulk_add(user_ids)
|
||||
|
@ -374,6 +374,7 @@ en:
|
||||
self_parent: "A subcategory's parent cannot be itself"
|
||||
depth: "You can't nest a subcategory under another"
|
||||
email_in_already_exist: "Incoming email address '%{email_in}' is already in use for '%{category_name}' category."
|
||||
invalid_email_in: "'%{email_in}' is not a valid email address."
|
||||
cannot_delete:
|
||||
uncategorized: "Can't delete Uncategorized"
|
||||
has_subcategories: "Can't delete this category because it has sub-categories."
|
||||
|
@ -214,11 +214,11 @@ module Email
|
||||
end
|
||||
|
||||
def group_incoming_emails_regex
|
||||
@group_incoming_emails_regex ||= Regexp.union Group.pluck(:incoming_email).select(&:present?).uniq
|
||||
@group_incoming_emails_regex ||= Regexp.union Group.pluck(:incoming_email).select(&:present?).map { |e| e.split("|") }.flatten.uniq
|
||||
end
|
||||
|
||||
def category_email_in_regex
|
||||
@category_email_in_regex ||= Regexp.union Category.pluck(:email_in).select(&:present?).uniq
|
||||
@category_email_in_regex ||= Regexp.union Category.pluck(:email_in).select(&:present?).map { |e| e.split("|") }.flatten.uniq
|
||||
end
|
||||
|
||||
def find_related_post
|
||||
|
@ -223,7 +223,7 @@ describe Email::Receiver do
|
||||
|
||||
context "new message to a group" do
|
||||
|
||||
let!(:group) { Fabricate(:group, incoming_email: "team@bar.com") }
|
||||
let!(:group) { Fabricate(:group, incoming_email: "team@bar.com|meat@bar.com") }
|
||||
|
||||
it "handles encoded display names" do
|
||||
expect { process(:encoded_display_name) }.to change(Topic, :count)
|
||||
@ -275,7 +275,7 @@ describe Email::Receiver do
|
||||
|
||||
context "new topic in a category" do
|
||||
|
||||
let!(:category) { Fabricate(:category, email_in: "category@bar.com", email_in_allow_strangers: false) }
|
||||
let!(:category) { Fabricate(:category, email_in: "category@bar.com|category@foo.com", email_in_allow_strangers: false) }
|
||||
|
||||
it "raises a StrangersNotAllowedError when 'email_in_allow_strangers' is disabled" do
|
||||
expect { process(:new_user) }.to raise_error(Email::Receiver::StrangersNotAllowedError)
|
||||
|
BIN
spec/fixtures/emails/encoded_display_name.eml
vendored
BIN
spec/fixtures/emails/encoded_display_name.eml
vendored
Binary file not shown.
BIN
spec/fixtures/emails/new_user.eml
vendored
BIN
spec/fixtures/emails/new_user.eml
vendored
Binary file not shown.
BIN
spec/fixtures/emails/no_subject.eml
vendored
BIN
spec/fixtures/emails/no_subject.eml
vendored
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user