mirror of
https://github.com/discourse/discourse.git
synced 2024-12-25 02:33:43 +08:00
48d13cb231
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.
191 lines
6.1 KiB
Ruby
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: "bugs@gmail.com",
|
|
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: "bugs@gmail.com" <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("john@doe.com")
|
|
expect(sent_mail.cc).to contain_exactly("someotherperson@test.com")
|
|
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: "james.bond@gmail.com")
|
|
topic = receiver.incoming_email.topic
|
|
topic.invite(Discourse.system_user, "james.bond@gmail.com")
|
|
|
|
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), james.bond@gmail.com",
|
|
)
|
|
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: "bugs@gmail.com",
|
|
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("bugs@gmail.com")
|
|
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
|