Discussion:
envio de emails desde jsp-servlet-clase
(demasiado antiguo para responder)
[Miren]
2004-09-08 14:22:57 UTC
Permalink
Hola en una maquina con weblogic 5.1 he puesto una jsp que llama un servlet
que envia correos mediente una clase de envio de correos y luego devuelve
una jsp de confirmacion.
bien lo he probado y me funciona con 20 correos (a mi mismo).
la cosa es que quiero usarlo para mandar correos a unalista que tengo de
usuairos de 1000 usuarios, osea un email masivo (no spam, ino usuarios mios)
mediente este sistema.
En principio esta montado para que llame al servlet, este hace la consulta a
la bbdd, envia los correos y me devuelve una jsp de confirmacion.
pregunta:
al ser tantos correo habrá problemas que haya, por ejemplo, un time out y no
se me presente la jsp y no acabe el proceso de envio?
o seguiria el lanzamiento de emails?
o no se daria este time out?

teneis alguna opinion / experiencia al respecto?
gracias
JM
2004-09-09 06:19:32 UTC
Permalink
Post by [Miren]
Hola en una maquina con weblogic 5.1 he puesto una jsp que llama un servlet
que envia correos mediente una clase de envio de correos y luego devuelve
una jsp de confirmacion.
bien lo he probado y me funciona con 20 correos (a mi mismo).
la cosa es que quiero usarlo para mandar correos a unalista que tengo de
usuairos de 1000 usuarios, osea un email masivo (no spam, ino usuarios mios)
mediente este sistema.
En principio esta montado para que llame al servlet, este hace la consulta a
la bbdd, envia los correos y me devuelve una jsp de confirmacion.
al ser tantos correo habrá problemas que haya, por ejemplo, un time out y no
se me presente la jsp y no acabe el proceso de envio?
o seguiria el lanzamiento de emails?
o no se daria este time out?
No se como esta hecho el servicio, pero si lo que hace es ponerse en
contacto con el servidor de correos para que este los mande, da igual
que lo mandes a 20 que a 1000. La conexión con el servidor de correos se
realiza una sola vez. Una vez recibido el servidor confirma la
recepción, tras lo cual empieza a enviar el correo a los remitentes que
corresponda. Para ello hará una conexión con cada servidor de correo de
los destinatarios. Si hay varios destinatarios de un mismo servidor hará
una única conexión.

Espero haberte aclarado algo el asunto.

Saludos
Mindundi
2004-09-09 20:53:47 UTC
Permalink
Déjame complemetar lo que dices JM, porque posiblemente esté mandando una
copia del mensaje a cada destinatario.

Lo que tienes que hacer si el mensaje es idéntico para cada uno de los
usuarios es simplemente enviar un sólo correo, pero con los 1000
destinarios, con el método addRecipients de MimeMessage o similares. Como
bien dice JM, tú sólo establecerás una comunicación y, será el servidor de
correo saliente que uses, el que se ocupe de repartirlos. En general
cualquier servidor de este tipo puede soportar ese tráfico y más.

Ahora bien, si los mensajes son distintos, tendrás que realizar las 1000
conexiones y eso sí que posiblemente no podría devolverte una respuesta
online en un tiempo decente.
Sólo si ese es el caso, dilo y te comentaré como puedes usar una cola de
mensajes, cosa que es bastante más complicada.

Un saludo
Post by JM
Post by [Miren]
Hola en una maquina con weblogic 5.1 he puesto una jsp que llama un servlet
que envia correos mediente una clase de envio de correos y luego devuelve
una jsp de confirmacion.
bien lo he probado y me funciona con 20 correos (a mi mismo).
la cosa es que quiero usarlo para mandar correos a unalista que tengo de
usuairos de 1000 usuarios, osea un email masivo (no spam, ino usuarios mios)
mediente este sistema.
En principio esta montado para que llame al servlet, este hace la consulta a
la bbdd, envia los correos y me devuelve una jsp de confirmacion.
al ser tantos correo habrá problemas que haya, por ejemplo, un time out y no
se me presente la jsp y no acabe el proceso de envio?
o seguiria el lanzamiento de emails?
o no se daria este time out?
No se como esta hecho el servicio, pero si lo que hace es ponerse en
contacto con el servidor de correos para que este los mande, da igual que
lo mandes a 20 que a 1000. La conexión con el servidor de correos se
realiza una sola vez. Una vez recibido el servidor confirma la recepción,
tras lo cual empieza a enviar el correo a los remitentes que corresponda.
Para ello hará una conexión con cada servidor de correo de los
destinatarios. Si hay varios destinatarios de un mismo servidor hará una
única conexión.
Espero haberte aclarado algo el asunto.
Saludos
[Miren]
2004-09-10 21:51:45 UTC
Permalink
Muchas gracias por tu respuesta.
Se me plantean los dos escenarios
me podrias dar un poco mas de info acerca de los dos=?
como uso el addRecipients? apareceria el el to la lista de destinatarios
(cosa que no queiro que conozcan los destinatarios las direcciones de los
otros).

y la segunda casuistica como la plantearias?
muchas gracias
Post by Mindundi
Déjame complemetar lo que dices JM, porque posiblemente esté mandando una
copia del mensaje a cada destinatario.
Lo que tienes que hacer si el mensaje es idéntico para cada uno de los
usuarios es simplemente enviar un sólo correo, pero con los 1000
destinarios, con el método addRecipients de MimeMessage o similares. Como
bien dice JM, tú sólo establecerás una comunicación y, será el servidor de
correo saliente que uses, el que se ocupe de repartirlos. En general
cualquier servidor de este tipo puede soportar ese tráfico y más.
Ahora bien, si los mensajes son distintos, tendrás que realizar las 1000
conexiones y eso sí que posiblemente no podría devolverte una respuesta
online en un tiempo decente.
Sólo si ese es el caso, dilo y te comentaré como puedes usar una cola de
mensajes, cosa que es bastante más complicada.
Un saludo
Post by JM
Post by [Miren]
Hola en una maquina con weblogic 5.1 he puesto una jsp que llama un servlet
que envia correos mediente una clase de envio de correos y luego devuelve
una jsp de confirmacion.
bien lo he probado y me funciona con 20 correos (a mi mismo).
la cosa es que quiero usarlo para mandar correos a unalista que tengo de
usuairos de 1000 usuarios, osea un email masivo (no spam, ino usuarios mios)
mediente este sistema.
En principio esta montado para que llame al servlet, este hace la consulta a
la bbdd, envia los correos y me devuelve una jsp de confirmacion.
al ser tantos correo habrá problemas que haya, por ejemplo, un time out
y
Post by Mindundi
Post by JM
Post by [Miren]
no
se me presente la jsp y no acabe el proceso de envio?
o seguiria el lanzamiento de emails?
o no se daria este time out?
No se como esta hecho el servicio, pero si lo que hace es ponerse en
contacto con el servidor de correos para que este los mande, da igual que
lo mandes a 20 que a 1000. La conexión con el servidor de correos se
realiza una sola vez. Una vez recibido el servidor confirma la recepción,
tras lo cual empieza a enviar el correo a los remitentes que
corresponda.
Post by Mindundi
Post by JM
Para ello hará una conexión con cada servidor de correo de los
destinatarios. Si hay varios destinatarios de un mismo servidor hará una
única conexión.
Espero haberte aclarado algo el asunto.
Saludos
Mindundi
2004-09-11 01:14:32 UTC
Permalink
Aquí te pongo la dirección del API de JavaMail. Es importante que le eches
un vistazo (clases Session, Message, MimeMessage y Transport, no todo el
API).

http://java.sun.com/products/javamail/javadocs/index.html

Fíjate en la clase MimeMessage. Los métodos addRecipients reciben dos
argumentos. El segundo es un objeto Address que puedes crear a partir de un
String con la dirección de correo.
El primero va a ser una constante con el tipo de destinatario, léase normal
(TO), de copia (CC), o de copia oculta (BCC).
Lo usual en los envíos masivos es que, como tú dices, los destinatarios no
vean las direcciones de los demás. Por lo tanto deberán ser de tipo copia
oculta. Algo así:

mensaje.addRecipient(Message.RecipientType.BCC, direcciones);

En direcciones estará el array con las 1000 direcciones.

Te apunto a uno de los mejores tutoriales online que yo he visto nunca, y es
precisamente el de JavaMail.
http://java.sun.com/developer/onlineTraining/JavaMail/contents.html

La segunda casuística te aseguro que es mucho más complicada, pero te voy a
dar un resumen de lo que yo haría, aunque es probable que otra gente te
pueda decir otras formas.

Primera opción: un bucle for y probar de modo online. Yo nunca lo he hecho
con tantos correos. Sé que en el mismo bloque de código la conexión y la
sesión se reutilizan con facilidad, pero realmente no te puedo decir el
rendimiento de la operación. Lo que sí te digo es que merece la pena
probarlo, porque es la solución más sencilla con mucha diferencia y al final
puede que en un par de segundos responda. Ojo al control de excepciones en
este caso, que te puedes quedar sin enviar muchos correos sin que te
enteres.

Segunda opción: usar hilos. Yo soy de I-Net, y la capacidad multihilo la da
el API de Servlets, así que no soy experto en programación concurrente. Como
he visto muchas chapuzas por ahí que luego van fatal, procuro evitarlo en la
medida de lo posible y dejárselo a los expertos. Otros en este grupo seguro
que te pueden aconsejar si vas por esa línea. Es la segunda solución en
complejidad.

Tercera opción: instalar un gestor de colas (OpenJMS) en la máquina que vaya
a enviar los correos por JavaMail. No tiene porqué ser la misma que la del
servidor web/aplicaciones, y de hecho, si se opta por esto, es mejor que
esté en otra. Desde la aplicación web lo que haces es mandar un mensaje JMS
una cola de ese gestor por cada mail que quieres enviar, y en la parte del
gestor de colas se van gestionando esos mensajes JMS en orden y mandando un
correo por cada uno. Esta opción es la más complicada y puede que te suene a
chino, sobre todo si no tienes conocimientos de lo que es JMS (Java Message
Service) o un gestor de colas. También es verdad que es una solución muy
general que sirve para todo tipo de colas, no sólo de correos, sino de
impresión, etc.

Esto se aplica a las tres soluciones:
Supongo que el contenido del correo se generaría a partir de un patrón
común, sustituyendo ciertos campos relativos al usuario al que se le manda.
En ese caso usaría un motor de plantillas (como Velocity) para la generación
de cada uno.


Vaya rollo, espero que te sirva la explicación.

Un saludo
Post by [Miren]
Muchas gracias por tu respuesta.
Se me plantean los dos escenarios
me podrias dar un poco mas de info acerca de los dos=?
como uso el addRecipients? apareceria el el to la lista de destinatarios
(cosa que no queiro que conozcan los destinatarios las direcciones de los
otros).
y la segunda casuistica como la plantearias?
muchas gracias
Post by Mindundi
Déjame complemetar lo que dices JM, porque posiblemente esté mandando una
copia del mensaje a cada destinatario.
Lo que tienes que hacer si el mensaje es idéntico para cada uno de los
usuarios es simplemente enviar un sólo correo, pero con los 1000
destinarios, con el método addRecipients de MimeMessage o similares. Como
bien dice JM, tú sólo establecerás una comunicación y, será el servidor de
correo saliente que uses, el que se ocupe de repartirlos. En general
cualquier servidor de este tipo puede soportar ese tráfico y más.
Ahora bien, si los mensajes son distintos, tendrás que realizar las 1000
conexiones y eso sí que posiblemente no podría devolverte una respuesta
online en un tiempo decente.
Sólo si ese es el caso, dilo y te comentaré como puedes usar una cola de
mensajes, cosa que es bastante más complicada.
Un saludo
Post by JM
Post by [Miren]
Hola en una maquina con weblogic 5.1 he puesto una jsp que llama un servlet
que envia correos mediente una clase de envio de correos y luego
devuelve
Post by Mindundi
Post by JM
Post by [Miren]
una jsp de confirmacion.
bien lo he probado y me funciona con 20 correos (a mi mismo).
la cosa es que quiero usarlo para mandar correos a unalista que tengo
de
Post by Mindundi
Post by JM
Post by [Miren]
usuairos de 1000 usuarios, osea un email masivo (no spam, ino usuarios mios)
mediente este sistema.
En principio esta montado para que llame al servlet, este hace la consulta a
la bbdd, envia los correos y me devuelve una jsp de confirmacion.
al ser tantos correo habrá problemas que haya, por ejemplo, un time out
y
Post by Mindundi
Post by JM
Post by [Miren]
no
se me presente la jsp y no acabe el proceso de envio?
o seguiria el lanzamiento de emails?
o no se daria este time out?
No se como esta hecho el servicio, pero si lo que hace es ponerse en
contacto con el servidor de correos para que este los mande, da igual
que
Post by Mindundi
Post by JM
lo mandes a 20 que a 1000. La conexión con el servidor de correos se
realiza una sola vez. Una vez recibido el servidor confirma la
recepción,
Post by Mindundi
Post by JM
tras lo cual empieza a enviar el correo a los remitentes que
corresponda.
Post by Mindundi
Post by JM
Para ello hará una conexión con cada servidor de correo de los
destinatarios. Si hay varios destinatarios de un mismo servidor hará una
única conexión.
Espero haberte aclarado algo el asunto.
Saludos
Loading...