FEATURE: Add email_encoded parameter to accept inbound base64 encoded emails (#12947)

We have found when receiving and posting inbound emails to the handle_mail route, it is better to POST the payload as a base64 encoded string to avoid strange encoding issues. This introduces a new param of `email_encoded` and maintains the legacy param of email, showing a deprecation warning. Eventually the old param of `email` will be dropped and the new one `email_encoded` will be the only way to handle_mail.
This commit is contained in:
Martin Brennan
2021-05-06 12:59:52 +10:00
committed by GitHub
parent c697efc186
commit 5f7bef6d20
3 changed files with 46 additions and 8 deletions

View File

@ -143,14 +143,24 @@ class Admin::EmailController < Admin::AdminController
end
def handle_mail
params.require(:email)
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: params[:email], retry_on_rate_limit: true, source: :handle_mail)
Jobs.enqueue(:process_email, mail: email_raw, retry_on_rate_limit: true, source: :handle_mail)
rescue JSON::GeneratorError => e
if retry_count == 0
params[:email] = params[:email].force_encoding('iso-8859-1').encode("UTF-8")
email_raw = email_raw.force_encoding('iso-8859-1').encode("UTF-8")
retry_count += 1
retry
else
@ -158,7 +168,13 @@ class Admin::EmailController < Admin::AdminController
end
end
render plain: "email has been received and is queued for processing"
# TODO: 2022-05-01 Remove this route once all sites have migrated over
# to using the new email_encoded param.
if deprecated_email_param_used
render plain: "warning: the email parameter is deprecated. all POST requests to this route should be sent with a base64 strict encoded encoded_email parameter instead. email has been received and is queued for processing"
else
render plain: "email has been received and is queued for processing"
end
end
def raw_email