Soporte IMAP para bandejas de entrada grupales

:rotating_light: Estamos eliminando el soporte para IMAP en Discourse. Consulte esta publicación para obtener detalles: IMAP support for group inboxes - #39 by martin . :rotating_light:


Nos complace presentar una versión alfa del soporte IMAP para bandejas de entrada de grupos. Esta función agrega la capacidad de ingresar credenciales y configuraciones IMAP por grupo para sincronizar las bandejas de entrada de grupos con una bandeja de entrada de correo electrónico. :email:

:warning::warning: :warning:

Esta es una función en etapa alfa y, como tal, no está 100% completa y pulida. Es muy probable que tenga errores; actualmente no la estamos manteniendo ni usando en producción. ¡Úsela bajo su propio riesgo!

:warning: :warning: :warning:

Beneficios

  • Su grupo puede empezar de inmediato a usar las bandejas de entrada de Discourse, ¡porque todo su correo existente se sincronizará! :running_woman:
  • Su grupo puede tener sus mensajes sincronizados entre Discourse y su proveedor de correo electrónico para que no haya un único punto de falla. Las personas pueden responder desde la cuenta de correo o desde dentro de Discourse y todo se sincronizará :zap:
  • Ya no necesitará configurar reglas de reenvío complejas desde su proveedor de correo electrónico hacia su bandeja de entrada entrante de Discourse. :arrow_right:
  • Las etiquetas de correo electrónico se sincronizarán con las etiquetas de Discourse para que todo esté bien organizado :card_file_box:
  • Responderá a las personas que envían correos a su grupo desde la dirección de correo electrónico que configuró, incluso si responde desde Discourse. ¡Sin más confusiones! :relieved:

Características

  • Todo el correo entrante y saliente se sincronizará entre el servidor IMAP y Discourse, creando los temas y respuestas de publicaciones apropiados basados en los correos analizados. Las respuestas se pueden crear desde Discourse o desde el servidor IMAP y todo se sincronizará.
  • Los correos se pueden responder desde la bandeja de entrada del grupo de Discourse O desde la cuenta de correo.
  • Las etiquetas aplicadas al tema de Discourse se crearán como etiquetas y se aplicarán al correo en el servidor IMAP (esto es específico del proveedor).
  • Los correos archivados en el servidor IMAP se archivarán en la bandeja de entrada del grupo.
  • Los temas de mensajes privados del grupo que se archivan en Discourse se archivarán en el servidor IMAP.
  • Los correos eliminados en el servidor IMAP eliminarán el tema en la bandeja de entrada del grupo.
  • Los temas de mensajes privados del grupo que se eliminan en Discourse se eliminarán en el servidor IMAP.
  • Los correos enviados por grupos con esta función habilitada tendrán su dirección de respuesta configurada con el mismo nombre de usuario de correo establecido en la configuración IMAP.

Para empezar

En primer lugar, hay algunas configuraciones del sitio que debe configurar antes de poder establecer esta funcionalidad en un grupo.

  • enable imap y enable smtp deben estar habilitados. IMAP se usa para sincronizar con su servidor de correo y SMTP se usa para enviar correos desde su servidor de correo.
  • tagging enabled y allow staff to tag pms - Ambos deben estar habilitados, ya que la sincronización de etiquetas aplica etiquetas a los MP.
  • enable imap write - Debe estar habilitado si desea que los cambios realizados en Discourse se reflejen en su servidor de correo (por ejemplo, etiquetas, archivado de temas y eliminación de temas).
  • enable imap idle - Nos permite recibir actualizaciones en tiempo real de su servidor de correo SI su servidor de correo admite IDLE. Esto acelera enormemente la reflexión de los cambios en su proveedor de correo electrónico hacia Discourse. Debería activarlo (Gmail lo admite, por ejemplo). Si desea todos los detalles, puede leer sobre ellos en el RFC para IDLE.
  • imap polling period mins - Si IDLE no es compatible, este es el número de minutos que esperamos antes de verificar el servidor IMAP en busca de cambios. También es el tiempo que esperamos entre el envío de cambios al servidor IMAP desde Discourse si enable imap write está habilitado. El mínimo es 1 minuto.

Estas configuraciones pueden dejarse en sus valores predeterminados y ajustarse si encuentra problemas con la sincronización:

  • imap polling old emails - El número máximo de correos antiguos (procesados) que se actualizarán cada vez que se consulte una bandeja IMAP (0 para todos).
  • imap polling new emails - El número máximo de correos nuevos (no procesados) que se actualizarán cada vez que se consulte una bandeja IMAP.
  • imap batch import email - El número mínimo de correos nuevos que activan el modo de importación (desactiva las alertas de publicaciones).

Si desea que las etiquetas se sincronicen con el servidor IMAP, debe habilitar las configuraciones del sitio tagging enabled y allow staff to tag pms.

A continuación, debe ir al grupo que desea sincronizar con su servidor IMAP y completar la configuración.

Estas configuraciones serán específicas del proveedor; consulte a continuación para obtener más detalles. Una vez que haya ingresado la configuración y las credenciales, haga clic en “Guardar cambios” y validaremos las credenciales contra los servidores del proveedor IMAP. Si es exitoso, se rellenará la lista de bandejas de entrada y deberá elegir cuál desea sincronizar (la orientación sobre esto también es específica del proveedor):

Si la validación de credenciales no fue exitosa, se mostrará un mensaje de error en la página. Para ser claros, el servidor SMTP ingresado se usará para enviar correos en nombre de la cuenta ingresada bajo nombre de usuario y contraseña, no el SMTP principal de Discourse configurado para correos masivos.

Finalmente, dentro de su archivo app.yml, necesitará agregar DISCOURSE_ENABLE_EMAIL_SYNC_DEMON: true dentro de la sección env y ejecutar ./launcher rebuild. ¡Esto habilitará el worker de fondo para iniciar y comenzar a sincronizar correos! :fireworks:

Información específica del proveedor

Gmail

  • :warning: Debe generar una contraseña de aplicación; de lo contrario, necesita activar “Acceso de aplicaciones menos seguras”, lo cual Google está eliminando en algún momento de todos modos. Use esta contraseña en lugar de la contraseña de su cuenta de Gmail en la configuración IMAP. Consulte Sign in with app passwords - Gmail Help para obtener más detalles. :warning:
  • Asegúrese de usar estas configuraciones para SMTP e IMAP:
  • Se recomienda encarecidamente (pronto será una función de interfaz de usuario) que solo seleccione la bandeja de entrada “[Gmail]/Todos los correos” para sincronizar.
  • No eliminamos inmediatamente los correos en Gmail, solo los movemos a la bandeja de entrada de basura cuando se elimina el tema en Discourse. La función de eliminación de “30 días” dentro de Gmail asumirá el control a partir de ahí.
  • Las etiquetas aplicadas a los temas de Discourse crearán Etiquetas en Gmail y las aplicarán a los hilos de correo. ¡Las etiquetas en Gmail también son bandejas de entrada IMAP!

Limitaciones

Esta es una función en etapa alfa y, como tal, no está 100% completa y pulida. Por lo tanto, actualmente se aplican las siguientes limitaciones:

  • Solo Gmail es compatible actualmente como proveedor IMAP. Tenemos alguna funcionalidad genérica de IMAP, pero no se garantiza que funcione. Outlook en línea es nuestro próximo gran objetivo para el soporte.
  • Resucitar correos eliminados de la Papelera de Gmail y reflejar el estado en Discourse actualmente es inestable.
  • :warning: No se recomienda cambiar la bandeja de entrada de sincronización después de que los correos ya se hayan sincronizado y puede provocar muchos problemas extraños. :warning:
  • Solo se puede sincronizar una bandeja de entrada por grupo.
  • La comunicación de grupo a grupo es un territorio inexplorado y no funcionará bien (por ejemplo, enviar un correo a team@yoursite.com desde support@yoursite.com si cada uno de esos correos está configurado para un grupo diferente).

También puede haber otros detalles sutiles y asperezas, ya que esta es una función alfa.

Comentarios y hoja de ruta

Nos encantaría recibir comentarios de cualquiera que esté usando esta función con Gmail. Seré yo quien trabaje en corregir errores y problemas. ¡La depuración es un poco complicada ahora mismo, pero estoy trabajando en ello!

Las próximas cosas en las que trabajaré:

  • Mejorar la depuración para facilitar la visualización de registros IMAP y determinar qué salió mal.
  • Mejorar la interfaz de correo del grupo para limitar las bandejas de entrada que se pueden seleccionar de Gmail y también desalentar/prohibir el cambio de bandejas de entrada.
  • Validación para evitar el uso de los mismos detalles IMAP para múltiples grupos.
  • Posibles mejoras en cómo se almacenan la configuración IMAP del grupo y una mejor experiencia de usuario para validar credenciales.
  • Soporte para Outlook.

Actualmente, mientras resolvemos los problemas, esta función no está disponible para nuestros clientes alojados.

Agradecimientos especiales :pray:

Tanto @dan como @j.jaffeux son los principales contribuyentes de esta enorme función que ha estado en desarrollo durante mucho tiempo. Sin su increíble trabajo, no habría podido llevar la función a este punto y hacer este anuncio :tada:.

41 Me gusta

Esta es, al mismo tiempo, una noticia fantástica y una noticia terrible. Déjame explicarlo. Primero, es una gran noticia ver la integración de IMAP con los grupos de Discourse, ya que aporta varias soluciones útiles para la identidad de grupo (utilizando la dirección original correcta), facilita que múltiples usuarios usen la misma cuenta IMAP (algo que no está bien soportado de forma nativa, por ejemplo, no hay estados de lectura compartidos) y abre el camino a los inboxes de ActivityPub… Pero es una noticia terrible porque su implementación favorece a los gigantes del correo electrónico que han convertido un servicio federado en un sistema ampliamente centralizado. Entiendo la atracción de trabajar con proveedores a gran escala, pero espero que se prefiera el estándar IMAP sobre las extensiones específicas del proveedor, para que cualquier proveedor de correo electrónico sea compatible una vez que esta función llegue al estado beta.

Felicidades por hacer esto posible.

10 Me gusta

Hay una gran razón por la que esta función se considera “alpha” :slight_smile:

El problema con IMAP, según lo que he observado desde la periferia, es la cantidad de “interpretación abierta” con la que nos vemos obligados a lidiar.

Sin duda queremos que esto funcione con más proveedores; nuestra necesidad interna favorece a Google porque, en realidad, usamos Google en Discourse, así que queríamos resolver nuestro problema primero.

Las PR para que esto funcione mejor con más proveedores son bienvenidas. En su ausencia, con el paso del tiempo y a medida que observemos más interés en usarlo con otros proveedores, construiremos el soporte.

17 Me gusta

Esta es una crítica justa; como dijo @sam, nos centramos primero en Gmail porque es lo que usamos, por lo que es lo más relevante para nosotros. Sin embargo, creo que nuestro proveedor “genérico” base, aunque ciertamente no cumple al 100 % con la RFC y no es completo en cuanto a funciones, sigue el protocolo IMAP bastante de cerca… consulte https://github.com/discourse/discourse/blob/master/lib/imap/providers/generic.rb. Las únicas adiciones que creo que necesitará son el manejo especial de la archivación y la eliminación. Actualmente, la eliminación simplemente se marca como \Deleted y se envía el comando EXPUNGE, pero sé que ciertos clientes de correo permiten elegir entre hacer esto o enviar primero a una carpeta de papelera y luego ejecutar EXPUNGE, etc. No estoy seguro de cuál es el estándar de archivación para IMAP. Tenemos una clase específica para el proveedor de Gmail que anula algunos de estos métodos genéricos.

Si tienes alguna sugerencia sobre más servidores/proveedores IMAP “genéricos” contra los que pueda probar, sería de gran ayuda, ya que Gmail tiene su propio tratamiento especial y único de ciertas cosas, además de las extensiones IMAP de Gmail.

Además, como dijo Sam, cualquier PR de mejora es bienvenida; de lo contrario, nos adaptaremos a la demanda, y predigo que el próximo será Outlook, otro caso de uso importante para organizaciones que desean este tipo de función (Outlook tiene sus propias reglas especiales y únicas… como que la archivación sea una carpeta o buzón y que no admita etiquetas).

12 Me gusta

¡Parece muy emocionante! Mi firma cambió recientemente de nuestro propio servidor de correo a G-Suite y esta integración nos facilitará mucho responder a las consultas de los clientes y gestionar nuestros controladores de progreso. Tengo una pregunta para @martin. No me queda claro si utilizaría el SMTP de Gmail para responder a los mensajes recibidos en la bandeja de entrada del grupo o si usaría el SMTP masivo configurado para enviar correos en nombre de Discourse. Veo que el plugin menciona el SMTP de Gmail, pero aún así quería aclarar este punto.

6 Me gusta

Se utiliza el servidor SMTP de Gmail para enviar las respuestas, ya que estás enviando las respuestas en nombre de la cuenta de correo electrónico utilizada para la sincronización IMAP. Agregaré una nota a este efecto en la publicación original para aclararlo.

7 Me gusta

Eso es realmente brillante. Se me ocurren tantos casos de uso para esto. ¡Felicidades @martin @dan @j.jaffeux :raising_hands:

9 Me gusta

Una rápida actualización. Fusioné estos dos PRs la semana pasada. Primero, la corrección para que el etiquetado no sea necesario para que funcionen la archivación y la eliminación:

Segundo, ahora estoy escribiendo todos los registros de IMAP en la base de datos para facilitar su inspección. Se ejecutará una tarea diaria para eliminar los registros con más de 5 días de antigüedad:

11 Me gusta

¡Esto es genial! Gracias.

Debo decir que tuve que crear una contraseña de aplicación en mi cuenta de correo de Google para que Discourse aceptara mi nombre de usuario y contraseña.

5 Me gusta

¿Tienes la autenticación en dos pasos activada en Google? Si es así, esto es una práctica estándar.

2 Me gusta

Sí. Creo que fue necesario para que yo pudiera crear la contraseña de la aplicación (aunque no lo recuerdo con seguridad).

1 me gusta

Esto se menciona en la publicación original :wink: De lo contrario, tendrás que pasar por toda una serie de trámites absurdos para que tu cuenta de Gmail acepte «Aplicaciones menos seguras». En algún momento tendremos que implementar OAuth para Google, ya que parece ser el camino que se está tomando.

4 Me gusta

¡Ups! ¿Mencioné que mis habilidades de comprensión lectora son terribles? :woozy_face:

5 Me gusta

¡No hay problema! Es un punto importante, así que lo he movido a la parte superior de la lista de Gmail y he añadido algunos indicadores de advertencia. Gracias por intentar avisar a otros para ahorrarles problemas :slight_smile:

6 Me gusta

Estoy intentando entender por qué falla la sincronización de correos con un servidor IMAP de Dovecot (desafortunadamente, sin experiencia en Ruby o Rails).

Al leer los imap_sync_logs, el daemon de importación se queda atrapado en un bucle:

UIDVALIDITY = 1612565899 no coincide con el esperado 0, invalidando la caché IMAP y resincronizando los correos para la bandeja INBOX

Por lo tanto, me pregunto si @group.imap_uid_validity no debería actualizarse en este caso:

Tras una actualización manual de este valor, el daemon de importación se queda atrapado en otro bucle.

Dovecot no soporta 'LABELS' en

lo que provoca un Net::IMAP::BadResponseError, que, desafortunadamente, no aparece en los registros.

Ahora me pregunto:

  • si el soporte de Dovecot para banderas personalizadas es suficiente para una sincronización bidireccional con Discourse
  • cómo detectar Dovecot en lib/imap/providers/detector.rb
  • cómo emular la función de etiquetas en un proveedor de Dovecot

5 Me gusta

La sincronización IMAP para bandejas de entrada grupales sigue siendo una función en etapas tempranas que actualmente solo admite Gmail. En teoría, podrías escribir un proveedor de dovecot, pero hace un par de semanas noté que hay algunas partes del código principal que utilizan funciones exclusivas de Gmail y que deben trasladarse a código específico del proveedor. Así que lo siento, pero quizás quieras esperar hasta que esto esté un poco más cerca de estar listo para su uso general.

7 Me gusta

Según mi entendimiento, 'LABELS' es una característica no estándar de Gmail.
Me gustaría entender la diferencia entre IMAP de Google e IMAP estándar.

Este es mi resumen hasta ahora:

IMAP estándar IMAP de Google
Los correos archivados viven en subcarpetas Todos los correos viven en una carpeta
Los mensajes archivados carecen de la etiqueta “\INBOX”
Las marcas personalizadas se almacenan junto con las marcas del sistema Almacena las marcas personalizadas como etiquetas

¿Sería suficiente

  • emular las etiquetas en IMAP estándar dividiendo las marcas en marcas del sistema y marcas personalizadas
  • manejar email_is_archived mediante el proveedor (por ejemplo, agregar y probar una marca “archivado”)

para lograr la sincronización con IMAP estándar?

Esto afectaría estas líneas:

Esta línea me parece extraña:

Cualquier marca del sistema será sobrescrita por las etiquetas de Discourse.
¿Esto maneja correctamente todas las marcas IMAP (\Answered, \Deleted, \Draft, \Flagged, \Recent y \Seen / $Forwarded, $MDNSent, $SubmitPending y $Submitted)?

2 Me gusta

Vuelvo a esto después de un tiempo de ausencia.

No he podido averiguar cómo hacer que el encabezado reply-to funcione correctamente. Puedo configurar un grupo para sincronizarlo con una cuenta de Gmail específica, pero cuando intento responder por correo electrónico, la dirección reply-to se establece en el correo de notificación configurado en Discourse y no en la dirección IMAP.

¿Hay algo que me esté pasando por alto?

1 me gusta

Solo probé esto con el proveedor de correo de GoDaddy, pero sin éxito. Con Gmail funciona genial, pero lamentablemente queremos usar nuestro propio dominio. ¿Hay alguna actualización para que esté lista para su uso en producción?

1 me gusta

Por cierto, puedes usar tu propio dominio con Gmail (de pago).

1 me gusta