Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   .NET (http://www.forosdelweb.com/f29/)
-   -   Problema con Asp Email (http://www.forosdelweb.com/f29/problema-con-asp-email-202771/)

MsTech.DotNet 13/05/2004 22:50

Problema con Asp Email
 
Hola amigos...

Estoy desarrollando una aplicación web en asp.net para el envio de emails, el problema esta en que el contenido es dinamico y proviene de una base de datos.

Cuando traigo 1 registro en especifico, que provenga por un where idcampo = x si funciona pero el problema surge cuando quiero que me traiga varios registros y los mande por correo.

Como ya sabemos hay un parametro que es el body del email el cual lo lleno con una variable que es donde esta el html a enviar por el email y ese html contiene elementos dinamicos que provienen de la base de datos, pero necesito que el repita ese html con cada registro para enviarlo por mail.

En si la aplicacion es un newsletter que lo que hace es enviar los ultimos 10 articulos de la base de datos pero cada articulo debe estar metido en una tabla diferente y todos ser enviados juntos en 1 solo email..

Alguien tiene idea donde puedo conseguir informacion sobre esto o como puedo solucionar este problema??? :pensando:

Gracias... :adios:

Benjact 14/05/2004 01:14

Digo yo que con un bucle de 10 o hasta donde tú quieras y que empiece justo antes de la instrucción de la tabla y acabe al cerrarla, ya lo tendrías solucionado.

Yo normalmente uso una variable a la que le voy concatenando trozos, así puedo dividir el código en porciones. En este caso yo haría algo así:

i=0
where i<10
texto="<table><tr><td>"
texto=texto & "Aquí pones lo que tu quieras"
texto=texto & "</td></tr></table>
i=i+1
wend

Mail.Body=texto


Algo parecido a esto aunque no sea usando este bucle.

MsTech.DotNet 14/05/2004 09:19

Hola Benjact como estas? si bueno de por si ya lo habia intentado claro no con esa estructura bucle que pusiste porque creo que asp.net no lo usa si no que usa:
dim i as integer
i=0
do while i<10
variables....
Loop

Pero el problema no es ese, el problema es que me repite siempre el mismo registro y lo que quiero es que haga el bucle pero avanzando los registros de la bd...

Alguna idea??? :pensando:

Gracias....

lucxx 14/05/2004 09:38

¿Pero como accedes a la BD, con un datareader? con una datatable? :pensando:

RootK 14/05/2004 09:44

Puedes hacerlo con un datareader o un while...

Ejemplo..:

Cita:

Dim _mm As New System.Web.Mail.MailMessage
Do While dr.Read
_mm.To = CStr(dr("Email"))
_mm.From = "[email protected]"
_mm.Subject = "Algun título"
_mm.BodyFormat = Mail.MailFormat.Html 'opcional ;-)
_mm.Body = "Mensaje"
System.Web.Mail.SmtpMail.SmtpServer = "tu_smtp"
Try
System.Web.Mail.SmtpMail.Send(_mm)
Catch ex As Exception
End Try
Loop
Con ello irás recorriendo los registros que traes de tu query..y enviarás el mail a cada uno de tus usuarios.



Espero que te sirva éste ejemplo: :arriba:

Saludos :cool:

RootK 14/05/2004 09:45

Cita:

con un datareader o un while... :borracho:
Mas bien es un datareader y un while :arriba:

MsTech.DotNet 14/05/2004 10:47

Gracias Rootk... ok hastan ahora todo eso va bien, pero el problema no es traerme los emails sino que el contenido del body es dinamico, si me traigo 1 solo registro si lo hace pero necesito traerme varios y que lo meta en el body, es decir, yo hago una consulta sql donde me traigo todos los articulos desde una fecha "x" hasta la fecha actual, y esos registros deben ir acomodados en una tabla html cada uno, y esas tablas que contiene a los articulos deben ir en el body del mensaje.. como puedo hacer eso??...

En si yo lo q mando en el newsletter son los resumenes de todos los articulos encontrados desde la fecha "x" hasta la fecha actual

Espero que me entiendan...

Gracias...


Javier

MsTech.DotNet 14/05/2004 10:55

ahh y se me olvidaba... todos los resumenes de los articulos que encuentre entre 2 fechas son enviados en 1 solo email a toda la lista de los correos que estan agregados al newsletter...

lucxx 14/05/2004 11:03

Pues es que no veo el problema... :pensando:

Vamos a ver:
Tu tienes un string -Mensaje- que es el contenido html de la pagina. Inicialmente, pones algo como:

mensaje = "<table> <tr>"

haces la consulta a la bd y con un datareader vas leyendo:

do while dr.read()
mensaje &= "<td>" & dr("TITULAR") & "</td></tr>"
mensaje &= "<td>" & dr("NOTICIA") & "</td></tr>"
loop

mensaje &= "</table>"

;-) de las etiquetas html que he puesto no hagas mucho caso pero seria algo asi

Despues, te traes un datareader con las direcciones de los usuarios

Dim _mm As New System.Web.Mail.MailMessage
Do While dr.Read
_mm.To = CStr(dr("Email"))
_mm.From = "[email protected]"
_mm.Subject = "Algun título"
_mm.BodyFormat = Mail.MailFormat.Html 'opcional
_mm.Body = "Mensaje"
System.Web.Mail.SmtpMail.SmtpServer = "tu_smtp"
Try
System.Web.Mail.SmtpMail.Send(_mm)
Catch ex As Exception
End Try
Loop


Lo ves claro ya?

Salu2 :adios:

lucxx 14/05/2004 11:14

Lo mejoramos un poco, y tomamos en cuenta el caso de que no haya noticias:

mensaje = "<table> <tr>"

if dr.Read() then

mensaje &= "<td>" & dr("TITULAR") & "</td></tr>"
mensaje &= "<td>" & dr("NOTICIA") & "</td></tr>"

do while dr.read()
mensaje &= "<td>" & dr("TITULAR") & "</td></tr>"
mensaje &= "<td>" & dr("NOTICIA") & "</td></tr>"
loop

else

hayNoticias = false
mensaje &= "</tr>"

end if


mensaje &= "</table>"

if hayNoticias then

Dim _mm As New System.Web.Mail.MailMessage
Do While dr.Read
_mm.To = CStr(dr("Email"))
_mm.From = "[email protected]"
_mm.Subject = "Algun título"
_mm.BodyFormat = Mail.MailFormat.Html 'opcional
_mm.Body = "Mensaje"
System.Web.Mail.SmtpMail.SmtpServer = "tu_smtp"
Try
System.Web.Mail.SmtpMail.Send(_mm)
Catch ex As Exception
End Try
Loop

end if


Salu2 :adios:

MsTech.DotNet 14/05/2004 11:44

Hola Lucxx, gracias por tu ayuda lo voy a probar y te aviso que tal me fue...

Gracias...

Javier

MsTech.DotNet 14/05/2004 13:51

Hola Lucxx, mira si con el reader si me funcionó al pelo, gracias... ahora tengo 2 problemitas mas...

1. Necesito hacer esta consulta:

dim fechainicio as string = desde.text
dim fechafin as string = hasta.text

La consulta SQL es: Select * from articulos where fechapub < "& fechafin &" and fechapub > "& fechainicio &" "

Pero al ejecutarla no me manda ningun articulo, ahora si quito la clausula where logicamente si me los manda todos, pero necesito que los mande (los articulos) desde 1 fecha "x" hasta la fecha actual. el campo fechapub de la base de datos es de tipo date/time

2. Yo me traigo todos los correos inscritos en el newsletter y los meto en un listbox y luego con unos botones elijo a cuales se los quiero enviar y los paso a otro listbox, entonces necesito que me envie el newsletter a todos los correos que estan dentro de un listbox, para ello hice lo siguiente....

dim bcc as string
dim i as integer
for i=0 to emailsxenviar.Items.Count-1
bcc = bcc & emailsxenviar.Items(i).Value
bcc = bcc & " ; "
Next
MiMail.Bcc = bcc

No se si esto funciona pero necesito que me saque los emails de un listbox y los separe por punto y coma y los meta en el parametro mimail.bcc para enviar el newsletter a cada email del listbox..

Gracias de Nuevo..

Saludos...

Javier

lucxx 15/05/2004 09:34

Hola

en cuanto a lo primero:

dim fechainicio as string = desde.text
dim fechafin as string = hasta.text

yo declararia fechainicio y fechafin como DateTime, y cargaría sus valores a partir del texto de los textbox, ahora no tengo la documentación delante, asi que no se cual es la manera de crear un datetime a partir de un string, pero basta con irse a la documentación y buscar "datetime members" ;-)


y en cuanto a lo segundo, yo en lugar de meter las direcciones en un string separados por ";" las introduciría en un ArrayList, así no hay que ir parseando la cadena, sino simplemente ir recorriendo el arraylist dentro de un bucle

Espero que te sirva, salu2 :cool:

MsTech.DotNet 15/05/2004 16:31

Hola amigos...

En cuanto a como sacar los correos del Listbox y separarlos por coma ya lo logre resolver, no use arrays, pero logre programarlo de una forma mas sencilla, basicamente como lo estaba haciendo en un principio...

Aqui la solucion por si alguien la necesita...

dim email as listitem
For Each email In emailsxenviar.Items
correos = correos & email.value
correos = correos & " ; "
Next

Y luego meter la variable en el parametro "to"

enviocorreo.to = correos

En cuanto a lo de seleccionar todos los articulos segun un rango de fecha es decir, entre 2 fechas lo estaba haciendo asi...

Select * from articulos where fechapub between " & fechainicio & " and " & fechafin & "

Lo probe con diferentes formas que si con comillas simples comilla doble, solo con comillas dobles, intente asi:

Select * from articulos where fechapub between #" & fechainicio & "# and #" & fechafin & "#

Pero nada, solo esta ultima forma me trae los articulos pero no dentro del rango de las fechas que le pido...

Alguien tiene alguna sugerencia...

Aqui esta como tengo las variables definidas...

dim fechainicio as date = desde.text
dim fechafin as date = hasta.text

Lo probe asi y con las variables de tipo string.. pero no da resultado alguno... el campo en la base de datos es date/time con el formato dd/mm/yyyy y los parametros de entrada en la consulta sql tambien tienen el mismo formato dd/mm/yyyy, he estado leyendo y creo que es access que tiene un bug con eso de las fechas que no sabe diferenciar los formatos... es lo malo de access pero como asi me lo pidio mi cliente no tuve mas opcion... :pensando:

Bueno espero que alguien tenga alguna sugerencia de como resolver este problema con lo de las fechas...

Gracias de antemano..... :arriba:

Saludos... :adios:

Javier ;-)

lucxx 16/05/2004 08:34

Hola

utiliza esto:

dim fechainicio as DateTime = new DateTime(anioIni, mesIni, diaIni)
dim fechafin as DateTime = new DateTime(anioFin, mesFin, diaFin)

Bien, los valores correspondientes al año, mes, etc, se pueden obtener separando el texto de los textbox, aunque yo utilizaria dropDownList's para cada componente de la fecha, pero en fin, eso es cuestión de gustos...

Así debería funcionar :arriba:

Salu2 :cool:

lucxx 16/05/2004 08:39

vuelvo...
P.D.: aunque el orden en los datetime que tienes que crear sea año - mes - dia, y el orden en que los muestra tu base de datos sea dia - mes - año, no cambies nada, funciona igual, en realidad eso son formas de representación y ambos sistemas interpretan las fechas internamente como un long

Salu2 :cool:

MsTech.DotNet 16/05/2004 11:17

Epale Lucxx que mas Bro!, dejame probar ese codigo a ver que tal me resulta... ya te aviso si me funcionó!!!

Saludos... :adios:

Javier :arriba:

MsTech.DotNet 16/05/2004 11:23

Ah pero mira bro! se me olvidaba...

El problema es como separo la fecha del textbox porque lo que pasa es que son dos textbox... uno fecha inicio y uno fecha fin.. los dos estan readonly = "true" puesto que solo es para visualizar que el boletin será enviado entre esas dos fechas, la fecha inicio se la trae de la base de datos y no es mas que la ultima fecha de envio del boletin y la fecha fin es un date.now que es la fecha actual en que se va a enviar el newsletter.

Seria cuestion de separar de cada textbox el dia, el mes el año y meterlo en lo que me pusistes....

dim fechainicio as DateTime = new DateTime(anioIni, mesIni, diaIni)
dim fechafin as DateTime = new DateTime(anioFin, mesFin, diaFin)

Pero tendria que usar split y eso para sacar numero por numero cada vez que encuentre un "/"...

Sera que asi funciona???

voy a probar.... de todos modos echale un ojo a lo que puse en este post...

Saludos...

lucxx 17/05/2004 08:22

Bueno, yo creía que la fecha la introducias tu en el textBox, pero en tu caso yo lo que haría es almacenar la fecha de inicio como un objeto dateTime en session al traerla de la base de datos, y la fecha actual obtenerla en el momento de ir a realizar el envio con un dateTime.Now.
Pero si optas por la otra forma, recuerda que a la fecha de fin debes hacerle
fechaFin = fechaFin.AddDays(1), ya que al crearla de esa manera te pone la hora a las 0:00:00, y si has introducido noticias en el último dia no te las tendría en cuenta.
No se si me he explicado muy bien, espero que por lo menos se entienda.

Salu2 :adios:

MsTech.DotNet 20/05/2004 20:21

Problema resuelto... lo que hice fue poner tanto la consulta como en la bd, el formato de la fecha en "yyyy/mm/dd" y funciono a la perfección...

Lo publico por si alguien más tiene este problema... :pensando:

Saludos... :adios:

Javier... :arriba:


La zona horaria es GMT -6. Ahora son las 19:04.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.