![]() |
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: |
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. |
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.... |
¿Pero como accedes a la BD, con un datareader? con una datatable? :pensando: |
Puedes hacerlo con un datareader o un while... Ejemplo..: Cita:
Espero que te sirva éste ejemplo: :arriba: Saludos :cool: |
Cita:
|
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 |
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... |
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: |
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: |
Hola Lucxx, gracias por tu ayuda lo voy a probar y te aviso que tal me fue... Gracias... Javier |
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 |
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: |
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 ;-) |
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: |
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: |
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: |
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... |
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: |
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.