Tipo de autenticación SMTP no reconocido con Office 365

Estoy obteniendo este error y he probado muchas opciones diferentes. Estoy usando Office 365

Error: 504 5.7.4 Tipo de autenticación no reconocido [MN2PR20CA0010.namprd20.prod.outlook.com]

Configuración aquí:

  DISCOURSE_SMTP_ADDRESS: smtp.office365.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email
  DISCOURSE_SMTP_PASSWORD: "CONTRASEÑA"
  DISCOURSE_SMTP_ENABLE_START_TLS: true

Prueba tu configuración primero con la herramienta openssl

  1. Codifica tu usuario de Office365
echo -n "tu correo electrónico aquí " | openssl enc -base64
xxx_correo_codificado_xxx
  1. Codifica tu contraseña
echo -n "tu contraseña aquí" | openssl enc -base64
xxx_contraseña_codificada_xxx
  1. Abre una conexión
openssl s_client -connect SMTP.office365.com:587 -starttls smtp -quiet -crlf
  1. Prueba la autenticación
  • Espera el mensaje 250 SMTPUTF8
  • Envía EHLO SMTP.office365.com
  • Espera la respuesta
    250-PR3P189CA0029.outlook.office365.com Hello [88.138.0.68]
    250-SIZE 157286400
    250-PIPELINING
    250-DSN
    250-ENHANCEDSTATUSCODES
    250-AUTH LOGIN XOAUTH2
    250-8BITMIME
    250-BINARYMIME
    250-CHUNKING
    250 SMTPUTF8
    
  • Envía AUTH LOGIN
  • Espera 334 VXNlcm5hbWU6
  • Envía tu inicio de sesión de usuario codificado xxx_correo_codificado_xxx
  • Espera 334 UGFzc3dvcmQ6
  • Envía tu contraseña codificada xxx_contraseña_codificada_xxx
  • Espera la respuesta 235 2.7.0 Authentication successful

Entonces, si la prueba de openssl funciona pero la prueba de conexión ejecutada por discourse-doctor sigue fallando con esos ajustes, ¿qué sigue? Aunque la prueba de openssl funcione, mi conexión de Discourse sigue fallando con 504 5.7.4 Tipo de autenticación no reconocido… Supongo que no reconoce el método de autenticación LOGIN. Intenté agregar DISCOURSE_SMTP_AUTHENTICATION: login al archivo app.yml, pero eso no ha ayudado.

Por si sirve de algo, esto es lo que he encontrado. Entré en la imagen de Docker y empecé a experimentar con el script lib/tasks/emails.rake y el archivo config/discourse.conf. Varias horas después, tras probar todas las combinaciones posibles de smtp.office365.com y .mail.protection.outlook.com con AUTH login y AUTH plain, descomenté el bloque situado justo antes del inicio de SMTP.

# Nos gustaría hacer esto, pero Net::SMTP falla al usar starttls
#Net::SMTP.start(smtp[:address], smtp[:port]) do |s|
#  s.starttls if !!smtp[:enable_starttls_auto] && s.capable_starttls?
#  s.auth_login(smtp[:user_name], smtp[:password])
#end

Ejecutarlo tal cual provocó un tiempo de espera agotado en la lectura.
Al modificarlo de esta manera —llamando a new en lugar de start— se logró un envío exitoso.

Net::SMTP.new(smtp[:address], smtp[:port]) do |s|
    s.enable_starttls
    s.auth_login(smtp[:user_name], smtp[:password])
end

Esta es mi primera experiencia con Ruby, rake y sus compañeros. No puedo explicar por qué funciona ni si es algo ‘bueno’ para casos generales.
J.

Ah, también, nunca pude lograr que funcionara con my_domain.mail.protection.outlook.com en el puerto 25 ni en el 587; lo que sí funcionó fue smtp.office365.com:587.

Utilizo socketlabs.com como mi servicio de entrega de correo y tuve un problema similar. En mi caso, la solución fue editar lib/tasks/emails.rake de la siguiente manera:
Cambiar la línea:
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password])
por
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])

Sin este cambio, DISCOURSE_SMTP_AUTHENTICATION: login no se pasa al código SMTP de nivel inferior.

No he probado si el código modificado sigue funcionando con otros métodos de autenticación, pero soluciona el problema para la autenticación login.

Puedo confirmar que agregar
smtp[:authentication]
a la llamada Net::SMTP.start y establecer
DISCOURSE_SMTP_AUTHENTICATION: login
en app.yml soluciona el problema en la página de prueba de correo electrónico.

Creo que los correos electrónicos normales se envían mediante la librería mail, y establecer
DISCOURSE_SMTP_AUTHENTICATION: login
en app.yml es suficiente para que la librería funcione correctamente.

Aun así, creo que lib/tasks/emails.rake debería ser parcheado para usar la configuración DISCOURSE_SMTP_AUTHENTICATION. Esto ahorraría depuración innecesaria.

Parece un :bug: para mí. He enviado un PR:

Hola,

Net::SMTP.start(smtp[:address], smtp[:port], ‘localhost’, smtp[:user_name], smtp[:password], smtp[:authentication])
rescue Exception => e

Se ha parcheado como se muestra arriba en mi versión actual, pero sigo obteniendo el mismo error.

Error: 504 5.7.4 Tipo de autenticación no reconocido con smtp.office365.com.

¿Alguien tiene alguna idea?

¿Cómo edito el script lib/tasks/emails.rake para que esto funcione?

Como actualización general sobre este tema, Microsoft está en proceso de eliminar la autenticación heredada para SMTP y POP3, lo que va a complicar las cosas si estás utilizando O365 como proveedor de correo. La política predeterminada aplicada ahora es prohibir SMTP AUTH y debes habilitarla por buzón. Espero que esto sea útil; ayer por la mañana estuve dando cabezazos contra esta pared.

Es una verdadera lástima, especialmente con POP, ya que configurar el correo entrante se volverá mucho más difícil a menos que Discourse añada soporte IMAP para buzones de correo entrante.

Hay una solución sencilla para el correo entrante que incluye un contenedor para recibirlo. Anteriormente se llamaba “straightforward”, pero alguien objetó el nombre y fue cambiado, y ya no puedo encontrarlo.

También existe soporte IMAP para bandejas de entrada grupales. Sin embargo, principalmente solo es compatible con Gmail.

Bueno, en cualquier caso, ejecutar tu propio servidor de correo debería considerarse un último recurso. Creo que se llamaba “entrega directa”, intenta buscar eso.

A partir de 2023, la autenticación pop3 ya no es posible en Exchange.

Si estás usando PHPMailer
Intenta comentando/eliminando la línea e intenta: //$mail->isSMTP(true);