mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 09:53:32 +08:00
c3708c4276
We updated scheduled admin checks to run concurrently in their own jobs. The main reason for this was so that we can implement re-check functionality for especially flaky checks (e.g. group e-mail credentials check.) This works in the following way: 1. The check declares its retry policy using class methods. 2. A block can be yielded to if there are problems, but before they are committed to Redis. 3. The job uses this block to either a) schedule a retry if there are any remaining or b) do nothing and let the check commit.
66 lines
1.8 KiB
Ruby
66 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
##
|
|
# If group SMTP or IMAP has been configured, we want to make sure the
|
|
# credentials are always valid otherwise emails will not be sending out
|
|
# from group inboxes. This check is run as part of scheduled AdminDashboardData
|
|
# problem checks, and if any credentials have issues they will show up on
|
|
# the admin dashboard as a high priority issue.
|
|
class GroupEmailCredentialsCheck
|
|
def self.max_retries = 2
|
|
def self.retry_wait = 30.seconds
|
|
|
|
def self.run
|
|
errors = []
|
|
|
|
if SiteSetting.enable_smtp
|
|
Group.with_smtp_configured.find_each do |group|
|
|
errors << try_validate(group) do
|
|
EmailSettingsValidator.validate_smtp(
|
|
host: group.smtp_server,
|
|
port: group.smtp_port,
|
|
username: group.email_username,
|
|
password: group.email_password,
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
if SiteSetting.enable_imap
|
|
Group.with_imap_configured.find_each do |group|
|
|
errors << try_validate(group) do
|
|
EmailSettingsValidator.validate_imap(
|
|
host: group.smtp_server,
|
|
port: group.smtp_port,
|
|
username: group.email_username,
|
|
password: group.email_password,
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
errors.compact
|
|
end
|
|
|
|
def self.try_validate(group, &blk)
|
|
begin
|
|
blk.call
|
|
nil
|
|
rescue *EmailSettingsExceptionHandler::EXPECTED_EXCEPTIONS => err
|
|
{
|
|
group_id: group.id,
|
|
group_name: group.name,
|
|
group_full_name: group.full_name,
|
|
message: EmailSettingsExceptionHandler.friendly_exception_message(err, group.smtp_server),
|
|
}
|
|
rescue => err
|
|
Discourse.warn_exception(
|
|
err,
|
|
message:
|
|
"Unexpected error when checking SMTP credentials for group #{group.id} (#{group.name}).",
|
|
)
|
|
nil
|
|
end
|
|
end
|
|
end
|