Files
forum/spec/mailers/group_smtp_mailer_spec.rb
Martin BrennanandGitHub 0bfa9eb05e UX: Use a dropdown for SSL mode for group SMTP (#27932)
Our old group SMTP SSL option was a checkbox,
but this was not ideal because there are actually
3 different ways SSL can be used when sending
SMTP:

* None
* SSL/TLS
* STARTTLS

We got around this before with specific overrides
for Gmail, but it's not flexible enough and now people
want to use other providers. It's best to be clear,
though it is a technical detail. We provide a way
to test the SMTP settings before saving them so there
should be little chance of messing this up.

This commit also converts GroupEmailSettings to a glimmer
component.
2024-07-18 10:33:14 +10:00

191 lines
6.1 KiB
Ruby

# frozen_string_literal: true
require "email/receiver"
RSpec.describe GroupSmtpMailer do
let(:group) do
Fabricate(
:group,
name: "Testers",
title: "Tester",
full_name: "Testers Group",
smtp_server: "smtp.gmail.com",
smtp_port: 587,
smtp_ssl_mode: Group.smtp_ssl_modes[:starttls],
smtp_enabled: true,
imap_server: "imap.gmail.com",
imap_port: 993,
imap_ssl: true,
imap_enabled: true,
email_username: "[email protected]",
email_password: "super$secret$password",
)
end
let(:user) do
user = Fabricate(:user)
group.add_owner(user)
user
end
let(:email) { <<~EMAIL }
Delivered-To: bugs@gmail.com
MIME-Version: 1.0
From: John Doe <john@doe.com>
Date: Tue, 01 Jan 2019 12:00:00 +0200
Message-ID: <a52f67a3d3560f2a35276cda8519b10b595623bcb66912bb92df6651ad5f75be@mail.gmail.com>
Subject: Hello from John
To: "[email protected]" <bugs@gmail.com>
Cc: someotherperson@test.com
Content-Type: text/plain; charset="UTF-8"
Hello,
How are you doing?
EMAIL
let(:receiver) do
receiver = Email::Receiver.new(email, destinations: [group], uid_validity: 1, uid: 10_000)
receiver.process!
receiver
end
let(:raw) { "hello, how are you doing?" }
before do
SiteSetting.enable_smtp = true
SiteSetting.enable_imap = true
Jobs.run_immediately!
SiteSetting.manual_polling_enabled = true
SiteSetting.reply_by_email_address = "test+%{reply_key}@test.com"
SiteSetting.reply_by_email_enabled = true
end
it "sends an email for first post when IMAP is disabled" do
staged = Fabricate(:staged)
group.update(imap_enabled: false)
PostCreator.create!(
user,
skip_validations: true,
title: "Hello from John",
archetype: Archetype.private_message,
target_usernames: staged.username,
target_group_names: group.name,
raw: raw,
)
expect(ActionMailer::Base.deliveries.size).to eq(1)
sent_mail = ActionMailer::Base.deliveries[0]
expect(sent_mail.to).to contain_exactly(staged.email)
expect(sent_mail.subject).to eq("Hello from John")
expect(sent_mail.to_s).to include(raw)
end
it "sends an email as reply" do
post = PostCreator.create(user, topic_id: receiver.incoming_email.topic.id, raw: raw)
expect(ActionMailer::Base.deliveries.size).to eq(1)
sent_mail = ActionMailer::Base.deliveries[0]
expect(sent_mail.to).to contain_exactly("[email protected]")
expect(sent_mail.cc).to contain_exactly("[email protected]")
expect(sent_mail.reply_to).to eq(nil)
expect(sent_mail.subject).to eq("Re: Hello from John")
expect(sent_mail.to_s).to include(raw)
end
it "includes the participants list in the email" do
Fabricate(:staged, email: "[email protected]")
topic = receiver.incoming_email.topic
topic.invite(Discourse.system_user, "[email protected]")
PostCreator.create(user, topic_id: topic.id, raw: raw)
expect(ActionMailer::Base.deliveries.size).to eq(1)
sent_mail = ActionMailer::Base.deliveries[0]
expect(sent_mail.to_s).to include(
"[Testers Group (1)](http://test.localhost/g/Testers), [email protected]",
)
end
it "uses the OP incoming email subject for the subject over topic title" do
receiver.incoming_email.topic.update(title: "blah")
post = PostCreator.create(user, topic_id: receiver.incoming_email.topic.id, raw: raw)
sent_mail = ActionMailer::Base.deliveries[0]
expect(sent_mail.subject).to eq("Re: Hello from John")
end
it "configures delivery options for SMTP correctly" do
mail = GroupSmtpMailer.send_mail(group, user.email, Fabricate(:post))
expect(mail.delivery_method.settings).to eq(
{
address: "smtp.gmail.com",
port: 587,
domain: "gmail.com",
user_name: "[email protected]",
password: "super$secret$password",
authentication: GlobalSetting.smtp_authentication,
enable_starttls_auto: true,
enable_ssl: false,
return_response: true,
open_timeout: GlobalSetting.group_smtp_open_timeout,
read_timeout: GlobalSetting.group_smtp_read_timeout,
},
)
end
it "uses the login SMTP authentication method for office365" do
group.update!(smtp_server: "smtp.office365.com")
mail = GroupSmtpMailer.send_mail(group, user.email, Fabricate(:post))
expect(mail.delivery_method.settings[:authentication]).to eq("login")
end
it "uses the login SMTP authentication method for outlook" do
group.update!(smtp_server: "smtp-mail.outlook.com")
mail = GroupSmtpMailer.send_mail(group, user.email, Fabricate(:post))
expect(mail.delivery_method.settings[:authentication]).to eq("login")
end
context "when the site has a reply by email address configured" do
before do
SiteSetting.manual_polling_enabled = true
SiteSetting.reply_by_email_address = "test+%{reply_key}@test.com"
SiteSetting.reply_by_email_enabled = true
end
it "uses the correct IMAP/SMTP reply to address and does not create a post reply key" do
post = PostCreator.create(user, topic_id: receiver.incoming_email.topic.id, raw: raw)
expect(ActionMailer::Base.deliveries.size).to eq(1)
expect(PostReplyKey.find_by(user_id: user.id, post_id: post.id)).to eq(nil)
sent_mail = ActionMailer::Base.deliveries[0]
expect(sent_mail.reply_to).to eq(nil)
expect(sent_mail.from).to contain_exactly("[email protected]")
end
context "when IMAP is disabled for the group" do
before { group.update(imap_enabled: false) }
it "does send the email" do
post = PostCreator.create(user, topic_id: receiver.incoming_email.topic.id, raw: raw)
expect(ActionMailer::Base.deliveries.size).to eq(1)
end
end
context "when SMTP is disabled for the group" do
before { group.update(smtp_enabled: false) }
it "does not send the email" do
post = PostCreator.create(user, topic_id: receiver.incoming_email.topic.id, raw: raw)
expect(ActionMailer::Base.deliveries.size).to eq(0)
end
end
end
end