mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-02 20:18:08 +00:00
chore: Support plus forwarding in email channel (#6482)
- Support for plus forwarding in the email addresses for email channels Co-authored-by: Sojan <sojan@pepalo.com>
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
class EmailChannelFinder
|
class EmailChannelFinder
|
||||||
|
include EmailHelper
|
||||||
|
|
||||||
def initialize(email_object)
|
def initialize(email_object)
|
||||||
@email_object = email_object
|
@email_object = email_object
|
||||||
end
|
end
|
||||||
@@ -7,7 +9,8 @@ class EmailChannelFinder
|
|||||||
channel = nil
|
channel = nil
|
||||||
recipient_mails = @email_object.to.to_a + @email_object.cc.to_a
|
recipient_mails = @email_object.to.to_a + @email_object.cc.to_a
|
||||||
recipient_mails.each do |email|
|
recipient_mails.each do |email|
|
||||||
channel = Channel::Email.find_by('lower(email) = ? OR lower(forward_to_email) = ?', email.downcase, email.downcase)
|
normalized_email = normalize_email_with_plus_addressing(email)
|
||||||
|
channel = Channel::Email.find_by('lower(email) = ? OR lower(forward_to_email) = ?', normalized_email, normalized_email)
|
||||||
break if channel.present?
|
break if channel.present?
|
||||||
end
|
end
|
||||||
channel
|
channel
|
||||||
|
|||||||
@@ -3,4 +3,11 @@ module EmailHelper
|
|||||||
domain = email.split('@').last
|
domain = email.split('@').last
|
||||||
domain.split('.').first
|
domain.split('.').first
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# ref: https://www.rfc-editor.org/rfc/rfc5233.html
|
||||||
|
# This is not a mandatory requirement for email addresses, but it is a common practice.
|
||||||
|
# john+test@xyc.com is the same as john@xyc.com
|
||||||
|
def normalize_email_with_plus_addressing(email)
|
||||||
|
"#{email.split('@').first.split('+').first}@#{email.split('@').last}".downcase
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -24,6 +24,13 @@ describe ::EmailChannelFinder do
|
|||||||
channel = described_class.new(reply_mail.mail).perform
|
channel = described_class.new(reply_mail.mail).perform
|
||||||
expect(channel).to eq(channel_email)
|
expect(channel).to eq(channel_email)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'return channel with to+extension email' do
|
||||||
|
channel_email.update(email: 'test@example.com')
|
||||||
|
reply_mail.mail['to'] = 'test+123@example.com'
|
||||||
|
channel = described_class.new(reply_mail.mail).perform
|
||||||
|
expect(channel).to eq(channel_email)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
19
spec/helpers/email_helper_spec.rb
Normal file
19
spec/helpers/email_helper_spec.rb
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe EmailHelper, type: :helper do
|
||||||
|
describe '#normalize_email_with_plus_addressing' do
|
||||||
|
context 'when email is passed' do
|
||||||
|
it 'normalise if plus addressing is present' do
|
||||||
|
expect(helper.normalize_email_with_plus_addressing('john+test@acme.inc')).to eq 'john@acme.inc'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns original if plus addressing is not present' do
|
||||||
|
expect(helper.normalize_email_with_plus_addressing('john@acme.inc')).to eq 'john@acme.inc'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns downcased version of email' do
|
||||||
|
expect(helper.normalize_email_with_plus_addressing('JoHn+AAsdfss@acme.inc')).to eq 'john@acme.inc'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user