mirror of
https://github.com/discourse/discourse.git
synced 2025-06-24 01:28:08 +08:00

Follow-up to #32211. This PR adds a Settings tab to the Email settings admin page. The current Settings tab is renamed to Server settings.
142 lines
4.0 KiB
Ruby
142 lines
4.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Admin::EmailController < Admin::AdminController
|
|
def index
|
|
end
|
|
|
|
def server_settings
|
|
data = { delivery_method: delivery_method, settings: delivery_settings }
|
|
render_json_dump(data)
|
|
end
|
|
|
|
def test
|
|
params.require(:email_address)
|
|
begin
|
|
message = TestMailer.send_test(params[:email_address])
|
|
Email::Sender.new(message, :test_message).send
|
|
|
|
render json: { sent_test_email_message: I18n.t("admin.email.sent_test") }
|
|
rescue => e
|
|
render json: { errors: [e.message] }, status: 422
|
|
end
|
|
end
|
|
|
|
def preview_digest
|
|
params.require(:last_seen_at)
|
|
params.require(:username)
|
|
user = User.find_by_username(params[:username])
|
|
raise Discourse::InvalidParameters unless user
|
|
|
|
renderer = Email::Renderer.new(UserNotifications.digest(user, since: params[:last_seen_at]))
|
|
render json: MultiJson.dump(html_content: renderer.html, text_content: renderer.text)
|
|
end
|
|
|
|
def advanced_test
|
|
params.require(:email)
|
|
|
|
receiver = Email::Receiver.new(params["email"])
|
|
text, elided, format = receiver.select_body
|
|
|
|
render json: success_json.merge!(text: text, elided: elided, format: format)
|
|
end
|
|
|
|
def send_digest
|
|
params.require(:last_seen_at)
|
|
params.require(:username)
|
|
params.require(:email)
|
|
user = User.find_by_username(params[:username])
|
|
|
|
message, skip_reason =
|
|
UserNotifications.public_send(:digest, user, since: params[:last_seen_at])
|
|
|
|
if message
|
|
message.to = params[:email]
|
|
begin
|
|
Email::Sender.new(message, :digest).send
|
|
render json: success_json
|
|
rescue => e
|
|
render json: { errors: [e.message] }, status: 422
|
|
end
|
|
else
|
|
render json: { errors: skip_reason }
|
|
end
|
|
end
|
|
|
|
def smtp_should_reject
|
|
params.require(:from)
|
|
params.require(:to)
|
|
# These strings aren't localized; they are sent to an anonymous SMTP user.
|
|
if !User.with_email(Email.downcase(params[:from])).exists? && !SiteSetting.enable_staged_users
|
|
render json: {
|
|
reject: true,
|
|
reason: "Mail from your address is not accepted. Do you have an account here?",
|
|
}
|
|
elsif Email::Receiver.check_address(Email.downcase(params[:to])).nil?
|
|
render json: {
|
|
reject: true,
|
|
reason:
|
|
"Mail to this address is not accepted. Check the address and try to send again?",
|
|
}
|
|
else
|
|
render json: { reject: false }
|
|
end
|
|
end
|
|
|
|
def handle_mail
|
|
deprecated_email_param_used = false
|
|
|
|
if params[:email_encoded].present?
|
|
email_raw = Base64.strict_decode64(params[:email_encoded])
|
|
elsif params[:email].present?
|
|
deprecated_email_param_used = true
|
|
email_raw = params[:email]
|
|
else
|
|
raise ActionController::ParameterMissing.new("email_encoded or email")
|
|
end
|
|
|
|
retry_count = 0
|
|
|
|
begin
|
|
Jobs.enqueue(
|
|
:process_email,
|
|
mail: email_raw,
|
|
retry_on_rate_limit: true,
|
|
source: "handle_mail",
|
|
)
|
|
rescue JSON::GeneratorError, Encoding::UndefinedConversionError => e
|
|
if retry_count == 0
|
|
email_raw = email_raw.force_encoding("iso-8859-1").encode("UTF-8")
|
|
retry_count += 1
|
|
retry
|
|
else
|
|
raise e
|
|
end
|
|
end
|
|
|
|
if deprecated_email_param_used
|
|
warning =
|
|
"warning: the email parameter is deprecated. all POST requests to this route should be sent with a base64 strict encoded email_encoded parameter instead. email has been received and is queued for processing"
|
|
|
|
Discourse.deprecate(warning, drop_from: "3.3.0")
|
|
|
|
render plain: warning
|
|
else
|
|
render plain: "email has been received and is queued for processing"
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def delivery_settings
|
|
action_mailer_settings.reject { |k, _| k == :password }.map { |k, v| { name: k, value: v } }
|
|
end
|
|
|
|
def delivery_method
|
|
ActionMailer::Base.delivery_method
|
|
end
|
|
|
|
def action_mailer_settings
|
|
ActionMailer::Base.public_send "#{delivery_method}_settings"
|
|
end
|
|
end
|