mirror of
https://github.com/discourse/discourse.git
synced 2025-02-09 12:54:56 +00:00
Have reciever handle multiple To addresses
This commit is contained in:
parent
9a1580244a
commit
cce8b4720a
@ -13,10 +13,11 @@ module Email
|
|||||||
class EmptyEmailError < ProcessingError; end
|
class EmptyEmailError < ProcessingError; end
|
||||||
class UserNotFoundError < ProcessingError; end
|
class UserNotFoundError < ProcessingError; end
|
||||||
class UserNotSufficientTrustLevelError < ProcessingError; end
|
class UserNotSufficientTrustLevelError < ProcessingError; end
|
||||||
|
class BadDestinationAddress < ProcessingError; end
|
||||||
class EmailLogNotFound < ProcessingError; end
|
class EmailLogNotFound < ProcessingError; end
|
||||||
class InvalidPost < ProcessingError; end
|
class InvalidPost < ProcessingError; end
|
||||||
|
|
||||||
attr_reader :body, :reply_key, :email_log
|
attr_reader :body, :email_log
|
||||||
|
|
||||||
def initialize(raw)
|
def initialize(raw)
|
||||||
@raw = raw
|
@raw = raw
|
||||||
@ -37,10 +38,26 @@ module Email
|
|||||||
discourse_email_parser
|
discourse_email_parser
|
||||||
raise EmailUnparsableError if @body.blank?
|
raise EmailUnparsableError if @body.blank?
|
||||||
|
|
||||||
if is_in_email?
|
dest_info = {type: :invalid, obj: nil}
|
||||||
@user = User.find_by_email(@message.from.first)
|
@message.to.each do |to_address|
|
||||||
|
if dest_info[:type] == :invalid
|
||||||
|
dest_info = check_address to_address
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
raise BadDestinationAddress if dest_info[:type] == :invalid
|
||||||
|
|
||||||
|
if dest_info[:type] == :category
|
||||||
|
raise BadDestinationAddress unless SiteSetting.email_in
|
||||||
|
category = dest_info[:obj]
|
||||||
|
@category_id = category.id
|
||||||
|
@allow_strangers = category.email_in_allow_strangers
|
||||||
|
|
||||||
|
user_email = @message.from.first
|
||||||
|
@user = User.find_by_email(user_email)
|
||||||
if @user.blank? && @allow_strangers
|
if @user.blank? && @allow_strangers
|
||||||
wrap_body_in_quote
|
|
||||||
|
wrap_body_in_quote user_email
|
||||||
# TODO This is WRONG it should register an account
|
# TODO This is WRONG it should register an account
|
||||||
# and email the user details on how to log in / activate
|
# and email the user details on how to log in / activate
|
||||||
@user = Discourse.system_user
|
@user = Discourse.system_user
|
||||||
@ -51,22 +68,32 @@ module Email
|
|||||||
|
|
||||||
create_new_topic
|
create_new_topic
|
||||||
else
|
else
|
||||||
@reply_key = @message.to.first
|
@email_log = dest_info[:obj]
|
||||||
|
|
||||||
# Extract the `reply_key` from the format the site has specified
|
|
||||||
tokens = SiteSetting.reply_by_email_address.split("%{reply_key}")
|
|
||||||
tokens.each do |t|
|
|
||||||
@reply_key.gsub!(t, "") if t.present?
|
|
||||||
end
|
|
||||||
|
|
||||||
# Look up the email log for the reply key
|
|
||||||
@email_log = EmailLog.for(reply_key)
|
|
||||||
raise EmailLogNotFound if @email_log.blank?
|
raise EmailLogNotFound if @email_log.blank?
|
||||||
|
|
||||||
create_reply
|
create_reply
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_address(address)
|
||||||
|
category = Category.find_by_email(address)
|
||||||
|
return {type: :category, obj: category} if category
|
||||||
|
|
||||||
|
regex = Regexp.escape SiteSetting.reply_by_email_address
|
||||||
|
regex = regex.gsub(Regexp.escape('%{reply_key}'), "(.*)")
|
||||||
|
regex = Regexp.new regex
|
||||||
|
match = regex.match address
|
||||||
|
if match && match[1].present?
|
||||||
|
reply_key = match[1]
|
||||||
|
email_log = EmailLog.for(reply_key)
|
||||||
|
|
||||||
|
return {type: :reply, obj: email_log}
|
||||||
|
end
|
||||||
|
|
||||||
|
{type: :invalid, obj: nil}
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def parse_body
|
def parse_body
|
||||||
@ -135,21 +162,8 @@ module Email
|
|||||||
@body.strip!
|
@body.strip!
|
||||||
end
|
end
|
||||||
|
|
||||||
def is_in_email?
|
def wrap_body_in_quote(user_email)
|
||||||
@allow_strangers = false
|
@body = "[quote=\"#{user_email}\"]
|
||||||
return false unless SiteSetting.email_in
|
|
||||||
|
|
||||||
category = Category.find_by_email(@message.to.first)
|
|
||||||
return false unless category
|
|
||||||
|
|
||||||
@category_id = category.id
|
|
||||||
@allow_strangers = category.email_in_allow_strangers
|
|
||||||
|
|
||||||
true
|
|
||||||
end
|
|
||||||
|
|
||||||
def wrap_body_in_quote
|
|
||||||
@body = "[quote=\"#{@message.from.first}\"]
|
|
||||||
#{@body}
|
#{@body}
|
||||||
[/quote]"
|
[/quote]"
|
||||||
end
|
end
|
||||||
|
@ -181,7 +181,6 @@ greatest show ever created. Everyone should watch it.
|
|||||||
|
|
||||||
expect(receiver.body).to eq(reply_body)
|
expect(receiver.body).to eq(reply_body)
|
||||||
expect(receiver.email_log).to eq(email_log)
|
expect(receiver.email_log).to eq(email_log)
|
||||||
expect(receiver.reply_key).to eq(reply_key)
|
|
||||||
|
|
||||||
attachment_email = fixture_file("emails/attachment.eml")
|
attachment_email = fixture_file("emails/attachment.eml")
|
||||||
attachment_email = fill_email(attachment_email, "test@test.com", to)
|
attachment_email = fill_email(attachment_email, "test@test.com", to)
|
||||||
@ -209,7 +208,7 @@ greatest show ever created. Everyone should watch it.
|
|||||||
# no email in for user
|
# no email in for user
|
||||||
expect{
|
expect{
|
||||||
process_email(from: "cobb@dob.com", to: "invalid@address.com")
|
process_email(from: "cobb@dob.com", to: "invalid@address.com")
|
||||||
}.to raise_error(Email::Receiver::EmailLogNotFound)
|
}.to raise_error(Email::Receiver::BadDestinationAddress)
|
||||||
|
|
||||||
# valid target invalid user
|
# valid target invalid user
|
||||||
expect{
|
expect{
|
||||||
|
BIN
spec/fixtures/emails/multiple_destinations.eml
vendored
Normal file
BIN
spec/fixtures/emails/multiple_destinations.eml
vendored
Normal file
Binary file not shown.
@ -167,8 +167,23 @@ describe Jobs::PollMailbox do
|
|||||||
email.should be_deleted
|
email.should be_deleted
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "works with multiple To addresses" do
|
||||||
|
email = MockPop3EmailObject.new fixture_file('emails/multiple_destinations.eml')
|
||||||
|
expect_success
|
||||||
|
|
||||||
|
puts topic.posts
|
||||||
|
poller.handle_mail(email)
|
||||||
|
|
||||||
|
puts topic.posts
|
||||||
|
new_post = Post.find_by(topic: topic, post_number: 2)
|
||||||
|
assert new_post.present?
|
||||||
|
assert_equal expected_post.strip, new_post.cooked.strip
|
||||||
|
|
||||||
|
email.should be_deleted
|
||||||
|
end
|
||||||
|
|
||||||
describe "with the wrong reply key" do
|
describe "with the wrong reply key" do
|
||||||
let(:email) { MockPop3EmailObject.new fixture_file('emails/wrong_reply_key.eml')}
|
let(:email) { MockPop3EmailObject.new fixture_file('emails/wrong_reply_key.eml') }
|
||||||
|
|
||||||
it "raises an EmailLogNotFound error" do
|
it "raises an EmailLogNotFound error" do
|
||||||
expect_exception Email::Receiver::EmailLogNotFound
|
expect_exception Email::Receiver::EmailLogNotFound
|
||||||
|
Loading…
x
Reference in New Issue
Block a user