La mejor manera de pasar correos electrónicos a una aplicación Rails

La mejor manera de pasar correos electrónicos a una aplicación Rails

Estoy pensando en la arquitectura de un sistema que debería manejar los correos entrantes y pasarlos a una aplicación Rails que procese los correos entrantes. No estoy seguro de cuál es la mejor manera de hacer algo así.

Debería funcionar así:

  • Los correos se envían a algo como contact@user_id.myapp.com
  • El servidor de correo acepta los correos y los pasa a la aplicación Rails (o los almacena y la aplicación Rails los recupera)
  • La aplicación Rails procesa los correos electrónicos (algunos análisis luego los arrojan a la base de datos)

Básicamente debería funcionar como un queque. Los picos repentinos en el tráfico de correo no deberían acabar con la aplicación Rails.

No estoy buscando una solución completa. Sólo me interesa tu opinión. Pensé en 3 opciones posibles:

  • Rails se conecta vía Pop3 al servidor de correo y simplemente descarga los mensajes (probablemente lento)
  • El servidor de correo canaliza los correos con una solicitud POST a la aplicación Rails (probablemente también demasiado lento, podría matar el servidor web si encuentra una bomba de correo)
  • El maildir está virtualmente vinculado al sistema de archivos del servidor de aplicaciones Rails (el servidor de correo y el servidor de aplicaciones deben estar separados) y Rails simplemente lee directamente desde allí.

¿Cuál crees que es el mejor enfoque en cuanto a rendimiento y seguridad? ¿Me estoy perdiendo de algo? ¿Existe una mejor manera? ¿Tiene ahora algunos recursos de mejores prácticas?

¡Gracias!

Respuesta1

Aquí hay una publicación que puede ayudar:

Recibir correos electrónicos y archivos adjuntos con Rails

El artículo también tiene enlaces a publicaciones anteriores sobre la configuración de RailsCron.

Respuesta2

He visto aplicaciones que hacen esto con POP3 (Spiceworks es un ejemplo que se me ocurre). Creo que es una forma decente de separar la aplicación. servidor del servidor de correo y le permite dejar que el servidor de correo se concentre en lo que hace bien y liberar al cliente de las tareas de cola/almacenamiento de los mensajes.

re: Seguridad

Un problema con POP3 que me viene a la mente es el uso predeterminado de credenciales de texto sin cifrar. Si puede ejecutarlo a través de SSL (dependiente del servidor de correo), puede mitigar esa preocupación.

re: Rendimiento y escalado

No estoy tan seguro de que el acceso POP3 vaya a ser tan lento. Sería cauteloso a la hora de realizar la integración a nivel del sistema de archivos, porque es posible que tenga problemas de contención y bloqueo (uf, piense en montar maildirs a través de NFS como un ejemplo de problemas divertidos de contención del sistema de archivos) a medida que llega correo nuevo. POP3 le brinda un buen método para acceder atómicamente a los elementos del buzón.

Tener varios consumidores ejecutándose en el mismo buzón POP3 al mismo tiempo probablemente sería problemático (si intenta escalar para manejar más tráfico de mensajes). Para eso, es posible que desee escribir algo en el lado del servidor de correo para distribuir por turnos los mensajes entrantes en un grupo de buzones y vincular a cada consumidor a un buzón determinado. (Podría considerar el uso de IMAP para una arquitectura de múltiples consumidores, pero solo soy yo lanzando humo sin pensarlo).

Sin duda, está agregando más capas y posibles cuellos de botella que simplemente aceptar SMTP directamente en su código, pero está aprovechando todo el trabajo que los autores del servidor de correo ya han realizado. Sin embargo, prefiero tener un problema de escala en un servidor de correo que un problema de escala en un código de servidor SMTP personalizado.

Respuesta3

Probablemente Rails sea la herramienta equivocada para el trabajo. Probablemente desee escribir un pequeño script que acepte el correo electrónico en la entrada estándar y lo inserte en su base de datos. Es posible que pueda utilizar el mismo código ActiveRecord para hacer esto. Luego sólo necesita configurar su MTA para entregar el correo canalizándolo a su script.

Si necesita un poco más de rendimiento, puede reescribir su script para que sea un demonio que acepte el correo electrónico a través de LTMP, lo que evitará la ineficiencia de iniciar un proceso para cada correo.

Respuesta4

En lugar de POP (si sigue esa ruta), utilice IMAP(S). De esa manera puedes dejar cosas en el servidor "leídas" una vez que se haya actuado en consecuencia.

información relacionada