sudoman
(Andrew E)
10 Septiembre, 2018 20:56
1
Hello Discourse,
Is there a preexisting code base out there for pushing emails to Discourse’s incoming email API?
Thanks,
Andrew
blake
(Blake Erickson)
10 Septiembre, 2018 23:29
2
From the output of rake routes You can send a POST request to
admin/email/handle_mail
Here is the controller method from handle_mail:
# 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: :unprocessable_entity
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])
raise Discourse::InvalidParameters unless user
message, skip_reason =
UserNotifications.public_send(
:digest,
user,
since: params[:last_seen_at],
skip_unsubscribe_links: true,
)
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: :unprocessable_entity
end
else
render json: { errors: skip_reason }
end
end
# TODO (martin) Remove this in 3.7.0, this endpoint has been broken for years
# and was used only in the public mail-receiver's fast rejection code,
# which is removed in https://github.com/discourse/mail-receiver/pull/33
def smtp_should_reject
render json: { reject: false }
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
# If it isn't valid UTF-8, reinterpret as ISO-8859-1 so it can be serialized to JSON.
email_raw = email_raw.dup.force_encoding("UTF-8")
email_raw = email_raw.encode("UTF-8", "ISO-8859-1") if !email_raw.valid_encoding?
Jobs.enqueue(:process_email, mail: email_raw, retry_on_rate_limit: true, source: "handle_mail")
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
Para un usuario no técnico, necesito entender las capacidades del correo entrante a través de la API:
Lo que ya he hecho:
Correos entrantes mediante polling POP3 al dominio principal (no a un subdominio)
Correos entrantes funcionales a través del módulo de correo Postfix, pero esto solo funciona para subdominios —en mi caso, xxx@community.eleoptics.com —, lo cual no podemos usar; necesitamos el dominio principal.
Configuración actual:
Correo entrante: Direcciones de correo de “Grupos” de G Suite de Google reenviadas a cuentas gratuitas de Gmail (para evitar pagar por una cuenta de G Suite por cada dirección de correo). Polling POP3.
Correo saliente: Reenvío mediante Relay SMTP a través de GSuite, validado por la IP de mi instalación de Discourse en Google Cloud.
Esto funciona, pero me gustaría dejar de usar las cuentas gratuitas de Gmail con polling POP3.
Planeamos utilizar la API de correo de Google Cloud Platform para manejar el correo de entrada y salida, idealmente para una implementación y servicio a mayor escala.
¿Dónde está la documentación que podría enviar a mis empleados técnicos sobre cómo configurar el correo entrante directamente en Discourse?
Si ya está vinculada en la publicación anterior, gracias. De lo contrario, supongo que se necesita una explicación más contextualizada.
blake:
Aquí está el método del controlador de handle_mail:
github.com
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