envío - java mail java
¿Cómo debe un programa Java manejar un servidor de correo externo que está inactivo? (7)
Coloque el objeto de correo electrónico en una pila o lista cuando no se puede enviar, cuando el servidor de correo electrónico vuelva a aparecer, muestre cada correo electrónico hasta que esté vacío.
Tengo un programa Java en ejecución constante que necesita enviar un correo electrónico cada vez que encuentra un problema. Sin embargo, es posible que el servidor de correo que utiliza pueda estar inactivo en el momento en que intenta enviar el correo electrónico.
¿Cuál es la mejor manera de garantizar que el correo electrónico se entregará cuando el servidor de correo vuelva a funcionar?
Es posible que desee guardar el correo electrónico en un archivo, quizás un archivo xml, de modo que si la aplicación falla, no perderá esta información.
Este archivo se carga cuando se inicia la aplicación, y lo mantiene todo en la memoria, de modo que mientras haya correos electrónicos pendientes, se siga revisando cada 5 minutos más o menos; luego, cuando envíe cada correo electrónico, volverá a guardar el archivo xml, por lo que debería se cuelga después de enviar 3 correos electrónicos de 10, no reenviará esos tres cuando se inicie.
Pero, cómo lo maneje dependerá realmente de la especificación de cómo manejar las condiciones de error.
La sugerencia de utilizar a James es buena, pero he tenido algunos problemas en el pasado de que James estaba un poco raro y necesitaba reiniciarse.
Podría usar algo como Quartz para que un programador verifique los mensajes que deben enviarse. Si el mensaje no se puede enviar (p. Ej., El servidor smtp no está disponible), ese mensaje se reprograma para ser enviado posteriormente. Usted puede tener una tarea por mensaje o tener una tarea persistente que verifica los mensajes y el servidor de correo disponible y luego los envía. La tarea persistente te da lotes de correo electrónico.
Poner en cola las solicitudes. Tenga un hilo separado que simplemente espere que algo entre en la cola, y luego intenta enviarlo por correo electrónico. Si falla, espera unas pocas horas e intenta de nuevo. Una vez que envía un mensaje, vuelve a la cola para obtener el siguiente mensaje.
Si pasa de "reenviar todo a este servidor SMTP que siempre está ahí" a una situación donde necesita manejar todo tipo de condiciones normalmente manejadas por un servidor SMTP completo como volver a intentar más tarde, retransmitir si la conexión se cerró, use hosts MX en su orden establecido y similar, es posible que desee considerar simplemente tener un servidor SMTP dentro de su cliente (pero que no acepte conexiones entrantes) ya que esto aleja toda la lógica sucia de sus aplicaciones.
Creo que el servidor de correo electrónico de James - http://james.apache.org/ - es fácilmente incrustable, pero en realidad no lo he intentado.
Si se encuentra en un mundo de Unix / Linux, considere la alternativa de enviar sus alertas mediante syslog
y lidiar con la generación de correos electrónicos de ese lado. Por ejemplo, nsyslogd tiene un módulo llamado ommail para generar correos electrónicos de forma nativa.
IIRC, hay adaptadores para log4j y similares que pueden tender puentes entre los mundos Java y syslog con un mínimo de (¿cero?) Codificación.
Apache James - http://james.apache.org/ te permitirá ejecutar tu propio servidor de correo como un proxy, no solo eso, sino que está escrito en un 100% Java, para que puedas descubrir qué está haciendo y como un extra extra James utiliza bases de datos para poner en cola el correo, por lo que incluso puede inyectar el correo directamente en las colas insertándolo en una base de datos, luego dejar todo el asunto de enviar el correo a James.