mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FIX: POP3 polling shouldn't stop after exception or old email (#12742)
This commit is contained in:
@@ -39,9 +39,11 @@ module Jobs
|
|||||||
pop3.start(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) do |pop|
|
pop3.start(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) do |pop|
|
||||||
pop.each_mail do |p|
|
pop.each_mail do |p|
|
||||||
mail_string = p.pop
|
mail_string = p.pop
|
||||||
break if mail_too_old?(mail_string)
|
next if mail_too_old?(mail_string)
|
||||||
process_popmail(mail_string)
|
process_popmail(mail_string)
|
||||||
p.delete if SiteSetting.pop3_polling_delete_from_server?
|
p.delete if SiteSetting.pop3_polling_delete_from_server?
|
||||||
|
rescue => e
|
||||||
|
Discourse.handle_job_exception(e, error_context(@args, "Failed to process incoming email."))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
rescue Net::OpenTimeout => e
|
rescue Net::OpenTimeout => e
|
||||||
|
|||||||
@@ -23,6 +23,23 @@ describe Jobs::PollMailbox do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe ".poll_pop3" do
|
describe ".poll_pop3" do
|
||||||
|
# the date is dynamic here because there is a 1 week cutoff for
|
||||||
|
# the pop3 polling
|
||||||
|
let(:example_email) do
|
||||||
|
email = <<~EMAIL
|
||||||
|
Return-Path: <one@foo.com>
|
||||||
|
From: One <one@foo.com>
|
||||||
|
To: team@bar.com
|
||||||
|
Subject: Testing email
|
||||||
|
Date: #{1.day.ago.strftime("%a, %d %b %Y")} 03:12:43 +0100
|
||||||
|
Message-ID: <34@foo.bar.mail>
|
||||||
|
Mime-Version: 1.0
|
||||||
|
Content-Type: text/plain
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
This is an email example.
|
||||||
|
EMAIL
|
||||||
|
end
|
||||||
|
|
||||||
context "pop errors" do
|
context "pop errors" do
|
||||||
before do
|
before do
|
||||||
@@ -55,6 +72,34 @@ describe Jobs::PollMailbox do
|
|||||||
expect(AdminDashboardData.problem_message_check(i18n_key))
|
expect(AdminDashboardData.problem_message_check(i18n_key))
|
||||||
.to eq(I18n.t(i18n_key, base_path: Discourse.base_path))
|
.to eq(I18n.t(i18n_key, base_path: Discourse.base_path))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "logs an error when pop fails and continues with next message" do
|
||||||
|
mail1 = Net::POPMail.new(1, nil, nil, nil)
|
||||||
|
mail2 = Net::POPMail.new(2, nil, nil, nil)
|
||||||
|
mail3 = Net::POPMail.new(3, nil, nil, nil)
|
||||||
|
mail4 = Net::POPMail.new(4, nil, nil, nil)
|
||||||
|
|
||||||
|
Net::POP3.any_instance.stubs(:start).yields(Net::POP3.new(nil, nil))
|
||||||
|
Net::POP3.any_instance.stubs(:mails).returns([mail1, mail2, mail3, mail4])
|
||||||
|
|
||||||
|
mail1.expects(:pop).raises(Net::POPError).once
|
||||||
|
mail1.expects(:delete).never
|
||||||
|
|
||||||
|
mail2.expects(:pop).returns(example_email).once
|
||||||
|
mail2.expects(:delete).raises(Net::POPError).once
|
||||||
|
|
||||||
|
mail3.expects(:pop).returns(example_email).once
|
||||||
|
mail3.expects(:delete).never
|
||||||
|
|
||||||
|
mail4.expects(:pop).returns(example_email).once
|
||||||
|
mail4.expects(:delete).returns(example_email).once
|
||||||
|
|
||||||
|
SiteSetting.pop3_polling_delete_from_server = true
|
||||||
|
|
||||||
|
poller.expects(:mail_too_old?).returns(false).then.raises(RuntimeError).then.returns(false).times(3)
|
||||||
|
poller.expects(:process_popmail).times(2)
|
||||||
|
poller.poll_pop3
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "calls enable_ssl when the setting is enabled" do
|
it "calls enable_ssl when the setting is enabled" do
|
||||||
@@ -74,23 +119,6 @@ describe Jobs::PollMailbox do
|
|||||||
context "has emails" do
|
context "has emails" do
|
||||||
let(:oldmail) { file_from_fixtures("old_destination.eml", "emails").read }
|
let(:oldmail) { file_from_fixtures("old_destination.eml", "emails").read }
|
||||||
|
|
||||||
# the date is dynamic here because there is a 1 week cutoff for
|
|
||||||
# the pop3 polling
|
|
||||||
let(:example_email) do
|
|
||||||
email = <<~EMAIL
|
|
||||||
Return-Path: <one@foo.com>
|
|
||||||
From: One <one@foo.com>
|
|
||||||
To: team@bar.com
|
|
||||||
Subject: Testing email
|
|
||||||
Date: #{1.day.ago.strftime("%a, %d %b %Y")} 03:12:43 +0100
|
|
||||||
Message-ID: <34@foo.bar.mail>
|
|
||||||
Mime-Version: 1.0
|
|
||||||
Content-Type: text/plain
|
|
||||||
Content-Transfer-Encoding: 7bit
|
|
||||||
|
|
||||||
This is an email example.
|
|
||||||
EMAIL
|
|
||||||
end
|
|
||||||
before do
|
before do
|
||||||
mail1 = Net::POPMail.new(1, nil, nil, nil)
|
mail1 = Net::POPMail.new(1, nil, nil, nil)
|
||||||
mail2 = Net::POPMail.new(2, nil, nil, nil)
|
mail2 = Net::POPMail.new(2, nil, nil, nil)
|
||||||
@@ -122,6 +150,12 @@ describe Jobs::PollMailbox do
|
|||||||
SiteSetting.pop3_polling_delete_from_server = false
|
SiteSetting.pop3_polling_delete_from_server = false
|
||||||
poller.poll_pop3
|
poller.poll_pop3
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "does not stop after an old email" do
|
||||||
|
SiteSetting.pop3_polling_delete_from_server = false
|
||||||
|
poller.expects(:mail_too_old?).returns(false, true, false, false).times(4)
|
||||||
|
poller.poll_pop3
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user