FIX: Do not enqueue :group_smtp_email job if IMAP disabled for the group (#13307)

When a group only has SMTP enabled and not IMAP, we do not
want to enqueue the :group_smtp_email job because using the group's
SMTP credentials for sending user_private_message emails is
handled by the UserNotifications class.

We do not want the :group_smtp_email job to be enqueued because
that uses a reply key instead of the group.email_username
for the reply-to address which is not what we want for SMTP
only, and also creates an IncomingEmail record to prevent IMAP
double syncing which we do not need either.

There is an open question about what happens when IMAP is
enabled after SMTP has been enabled for a while, and also questions
around whether we could do away with :group_smtp_email altogether
and handle everything via EmailLog and UserNotifications, adding
additional columns to the former and modifying the Imap::Sync
class to take this into account...a lot more further testing
for IMAP needs to be done to answer those questions.

For now, this fix should be sufficient to get the correct
reply-to address for user_private_response messages sent in
response to emails sent directly to the group's
email_username SMTP address.

Co-authored-by: Alan Guo Xiang Tan <gxtan1990@gmail.com>
This commit is contained in:
Martin Brennan 2021-06-07 14:17:35 +10:00 committed by GitHub
parent 0a259b94f0
commit b463a80cbf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 14 deletions

View File

@ -577,11 +577,6 @@ class PostAlerter
users users
end end
def group_notifying_via_smtp(post)
return nil if !SiteSetting.enable_smtp || post.post_type != Post.types[:regular]
post.topic.allowed_groups.where(smtp_enabled: true).first
end
def notify_pm_users(post, reply_to_user, notified) def notify_pm_users(post, reply_to_user, notified)
return unless post.topic return unless post.topic
@ -624,6 +619,11 @@ class PostAlerter
end end
end end
def group_notifying_via_smtp(post)
return nil if !SiteSetting.enable_smtp || !SiteSetting.enable_imap || post.post_type != Post.types[:regular]
post.topic.allowed_groups.where(smtp_enabled: true, imap_enabled: true).first
end
def notify_group_direct_emailers(post) def notify_group_direct_emailers(post)
email_addresses = [] email_addresses = []
emails_to_skip_send = [] emails_to_skip_send = []

View File

@ -101,17 +101,13 @@ describe GroupSmtpMailer do
group.update(imap_enabled: false) group.update(imap_enabled: false)
end end
it "uses the reply key based reply to address" do it "does not send the email" do
post = PostCreator.create(user, post = PostCreator.create(user,
topic_id: receiver.incoming_email.topic.id, topic_id: receiver.incoming_email.topic.id,
raw: raw raw: raw
) )
expect(ActionMailer::Base.deliveries.size).to eq(1) expect(ActionMailer::Base.deliveries.size).to eq(0)
sent_mail = ActionMailer::Base.deliveries[0]
post_reply_key = PostReplyKey.last
expect(sent_mail.reply_to).to contain_exactly("test+#{post_reply_key.reply_key}@test.com")
end end
end end
end end

View File

@ -1295,17 +1295,23 @@ describe PostAlerter do
context "SMTP (group_smtp_email)" do context "SMTP (group_smtp_email)" do
before do before do
SiteSetting.enable_smtp = true SiteSetting.enable_smtp = true
SiteSetting.enable_imap = true
Jobs.run_immediately! Jobs.run_immediately!
end end
fab!(:group) do fab!(:group) do
Fabricate( Fabricate(
:group, :group,
smtp_server: "imap.gmail.com", smtp_server: "smtp.gmail.com",
smtp_port: 587, smtp_port: 587,
smtp_ssl: true,
imap_server: "imap.gmail.com",
imap_port: 993,
imap_ssl: true,
email_username: "discourse@example.com", email_username: "discourse@example.com",
email_password: "discourse@example.com", email_password: "password",
smtp_enabled: true smtp_enabled: true,
imap_enabled: true
) )
end end
@ -1349,6 +1355,27 @@ describe PostAlerter do
expect(email.subject).to eq("Re: #{topic.title}") expect(email.subject).to eq("Re: #{topic.title}")
end end
it "does not send a group smtp email if imap is not enabled for the group" do
group.update!(imap_enabled: false)
create_post_with_incoming
post = Fabricate(:post, topic: topic)
expect { PostAlerter.new.after_save_post(post, true) }.to change { ActionMailer::Base.deliveries.size }.by(0)
end
it "does not send a group smtp email if SiteSetting.enable_imap is false" do
SiteSetting.enable_imap = false
create_post_with_incoming
post = Fabricate(:post, topic: topic)
expect { PostAlerter.new.after_save_post(post, true) }.to change { ActionMailer::Base.deliveries.size }.by(0)
end
it "does not send a group smtp email if SiteSetting.enable_smtp is false" do
SiteSetting.enable_smtp = false
create_post_with_incoming
post = Fabricate(:post, topic: topic)
expect { PostAlerter.new.after_save_post(post, true) }.to change { ActionMailer::Base.deliveries.size }.by(0)
end
it "does not send group smtp emails for a whisper" do it "does not send group smtp emails for a whisper" do
create_post_with_incoming create_post_with_incoming
post = Fabricate(:post, topic: topic, post_type: Post.types[:whisper]) post = Fabricate(:post, topic: topic, post_type: Post.types[:whisper])