template net incrustada imagen formato form enviar credenciales correo con c# asp.net .net-4.0 sendmail

c# - net - enviar tabla dinámica o contenido div como contenido del cuerpo del correo electrónico



enviar email c# windows form (5)

Tengo una página ( somePage.aspx ) y necesito el contenido que se ha generado como un cuerpo de correo electrónico

<div id="DV_TimeReportWraper" runat="server" style="display:block"> <table id="TBL_UsersinTblTime"> <tr id="TR_UsersinTblTime"> <td id="TD_H_Name" class="Dg"> name </td> <td id="TD_H_UserID" class="Dg"> ID </td> <td id="TD_H_Status" class="Dg"> initial Stage </td> <td id="TD_H_SignOutAutoExeState" class="Dg"> current Stage </td> </tr> <% if(edata != null) for (int idx=0;idx<edata.Count;idx++) { var row = edata[idx]; bool bgcl = (idx % 2) == 0; string BgCol = ""; if (bgcl) BgCol = "#70878F"; else BgCol = "#E6E6B8"; %> <tr style=" background-color:<%=BgCol%>"> <td id="TD_Name"> <% = row["name"] %> </td> <td id="TD_UserID"> <%= row["UserId"]%> </td> <td id="TD_Status"> <% int uidForSrc = Convert.ToInt32(row["UserId"]); string src = "images/SignedOutNoFrame.png"; if (UserDidnotSignOutTimeOut(uidForSrc)) src = "images/didnotSignOut.png"; %> <input type="image" src="<% =src %>" style="width:25px" /> </td> <td id="TD_SignOutAutoExeState" > <% string EexcSrc = ""; string inputType ="hidden"; //this updates if needed then returns true= needed update false = isn''t need if (UpdatedTimeOutOKForUSER(uidForSrc)) { inputType = "image"; excSrc = "/images/SignedOutNoFrame.png"; } %> <input type="<%=inputType %>" src="<%=EexcSrc %>" style="width:25px" /> </td> </tr> <% if (idx == edata.Count - 1) sendLog(); } %> </table> </div>

código para sendLog()

public void sendLog() { mail.aReciver="[email protected]"; mail.bSubject="ttest"; mail.cBody = DV_UsersInTblTime.InnerHtml; mail.HentalSend(); }

No puedo obtener el valor del contenido para asignar mail.cBody con.
Está diciendo que el valor no es literal, etc.

Ese es el método que estoy usando en una clase externa que funciona bien hasta este último intento de agregar la funcionalidad del contenido de la página como un cuerpo, ¿cómo es posible lograr el resultado según sea necesario aquí?

public static class mail { public static string aReciver, bSubject, cBody; public static void HentalSend() { string SmtpServer = "smtp.gmail.com"; int port = 587; string sender = "[email protected]"; string ReCiver = aReciver; string Subject = bSubject; string Body = cBody; string account = "[email protected]"; string Pass = "123456"; Send(SmtpServer, port, account, Pass, sender, Receiver, Subject, Body); ... //send() is another relevant method to this question, it does rest of mail settings } }


Estoy haciendo una suposición aquí de que está cargando esa página y luego tratando de ejecutar el método sendLog después de que la página se carga o durante la carga de la página o de otra manera durante algún momento del ciclo de vida de la página. Tratar de obtener el innerhtml de algo que no está renderizado aún no funciona.

Básicamente, debes renderizar la página primero, y luego obtienes los contenidos.

[EDITAR] Estoy actualizando mi respuesta para incluir cómo lo haría. En lugar de escribir el código .NET para forzar el procesamiento, como indiqué en mi comentario anterior ... deje que ASP.NET haga el trabajo sucio por usted.

using(WebClient c=new WebClient()){ var result=c.DownloadString(@"http://yourdomain.com/somePage.aspx/"); }

Ahora puede usar el resultado de esa llamada como el cuerpo de su correo electrónico.


Hardrada está apuntando en la dirección correcta aquí

En su servidor debajo del archivo .ASPX, agregue los archivos de localización requeridos

/App_LocalResources somePage.aspx.en.resx somePage.aspx.es.resx somePage.aspx.fr.resx somePage.aspx

  • Agrega tus traducciones
  • Insértelos en su archivo aspx

Llame a su archivo como se sugiere, excepto con una cadena de consulta

/somePage.aspx?culture=fr

Y dentro de somepage.aspx, en el conjunto OnLoad () o OnInit ():

var culture = System.Globalization.CultureInfo.CreateSpecificCulture(Request["culture"]) if (culture != null) System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

Voila!


Prueba esto ,

Agregar espacios de nombres

using System; using System.Net.Mail; using System.IO; using System.Configuration;

Función de correo

public void SendHTMLMail() { StreamReader reader = new StreamReader(Server.MapPath("~/somePage.aspx")); string readFile = reader.ReadToEnd(); string myString = ""; myString = readFile; myString = myString.Replace("$$Admin$$", "Sajan SJ"); myString = myString.Replace("$$CompanyName$$", "RFT"); myString = myString.Replace("$$Email$$", "[email protected]"); myString = myString.Replace("$$Website$$", "http://www.roomfortekki.com"); MailMessage Msg = new MailMessage(); MailAddress fromMail = new MailAddress("[email protected]"); // Sender e-mail address. Msg.From = fromMail; // Recipient e-mail address. Msg.To.Add(new MailAddress("[email protected]")); // Subject of e-mail Msg.Subject = "Send Mail with HTML File"; Msg.Body = myString.ToString(); Msg.IsBodyHtml = true; string sSmtpServer = ""; sSmtpServer = "10.2.69.121"; SmtpClient a = new SmtpClient(); a.Host = sSmtpServer; a.Send(Msg); reader.Dispose(); }


Botón SendEmail Click Code:

protected void BtnSendIngMail_Click(object sender, EventArgs e) { StringBuilder stringBuilder = new StringBuilder(); StringWriter writer = new StringWriter(stringBuilder); HtmlTextWriter htmlWriter = new HtmlTextWriter(writer); try { DivSendMail.RenderControl(htmlWriter); } catch (HttpException generatedExceptionName) { e.ToString(); } try { string DefProductTemp_Html = stringBuilder.ToString(); //send mail string smtpServer = Convert.ToString(DotNetNuke.Common.Globals.HostSettings["SMTPServer"]); string uid = Convert.ToString(DotNetNuke.Common.Globals.HostSettings["SMTPUsername"]); string upwd = Convert.ToString(DotNetNuke.Common.Globals.HostSettings["SMTPPassword"]); // DotNetNuke.Services.Mail.Mail.SendMail(uid, txtMail.Text, uid, "Proforma Invoice", DefProductTemp_Html, "", DotNetNuke.Services.Mail.MailFormat.Html.ToString(), "", "", "", ""); System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage(); System.Net.Mail.SmtpClient client = new SmtpClient(); mail.To.Add(txtMail.Text); mail.From = new System.Net.Mail.MailAddress(uid); mail.Subject = ddlSubList.SelectedItem.Text; mail.SubjectEncoding = System.Text.Encoding.UTF8; mail.IsBodyHtml = true; mail.Body = DefProductTemp_Html; //mail.BodyEncoding = System.Text.Encoding.UTF8; //mail.Priority = System.Net.Mail.MailPriority.High; client.Credentials = new System.Net.NetworkCredential(uid, upwd); //client.Host = "localhost"; client.Host = "smtp.gmail.com"; client.Port = 587; client.EnableSsl = true; client.Send(mail); } catch (Exception ex) { // catch }


Este código obtendrá el HTML generado de su control dinámico en una variable de cadena.

StringBuilder stringBuilder = new StringBuilder(); StringWriter writer = new StringWriter(stringBuilder); HtmlTextWriter htmlWriter = new HtmlTextWriter(writer); try { DV_TimeReportWraper.RenderControl(htmlWriter); } catch (HttpException generatedExceptionName) { } string DV_TimeReportWraper_innerHTML = stringBuilder.ToString();

Entonces simplemente use DV_TimeReportWraper_innerHTML como el cuerpo de su correo electrónico

Es posible que deba crear un ciclo en caso de que este control tenga controles secundarios. Más sobre eso aquí: http://msdn.microsoft.com/en-us/library/htwek607.aspx#Y472