send dynamic table or div content as an email body

2019-06-20 14:30发布

问题:

I have a page (somePage.aspx) and I need the content that has been generated as an Email body

<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>

code for sendLog()

public void sendLog()
{
    mail.aReciver="username@gmail.com";
    mail.bSubject="ttest";
    mail.cBody = DV_UsersInTblTime.InnerHtml;
    mail.HentalSend();
}

I can't get the value of content to assign mail.cBody with.
It's saying something about the value not being a literal etc'.

That is the method I'm using in an external class which works fine till this last attempt to add the functionality of page content as a body, how is it possible to achieve the result as needed here?

public static class mail
{
    public static string aReciver, bSubject, cBody;
    public static void HentalSend()
    {
        string SmtpServer = "smtp.gmail.com";
        int port = 587;
        string sender = "Sender@domain.com";
        string ReCiver = aReciver;
        string Subject = bSubject;
        string Body = cBody;
        string account = "mail@domain.com";
        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
    }
}

回答1:

This code will get the generated HTML of your dynamic control in to a string variable.

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();

Then just use DV_TimeReportWraper_innerHTML as the body of your email

You might have to create a loop in case this control has children controls. More on that here: http://msdn.microsoft.com/en-us/library/htwek607.aspx#Y472



回答2:

I'm making an assumption here that you are loading that page up and then trying to run the sendLog method after the page loads or during page load or otherwise during some part of the page life cycle. Trying to get the innerhtml of of something that isn't rendered yet wont' work.

Essentially, you need to render the page first, and then you get the contents.

[EDIT] I'm updating my answer to include how I would do this. Instead of writing the .NET code to force the render, as I stated in my comment above.. let ASP.NET do the dirty work for you.

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

Now you can use the result from that call as the body of your email.



回答3:

Try this ,

Add Namespaces

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

Mail Function

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$$", "sajan@roomfortekki.com");
myString = myString.Replace("$$Website$$", "http://www.roomfortekki.com");
MailMessage Msg = new MailMessage();
MailAddress fromMail = new MailAddress("sajan@roomfortekki.com");
// Sender e-mail address.
Msg.From = fromMail;
// Recipient e-mail address.
Msg.To.Add(new MailAddress("sajan@roomfortekki.com"));
// 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();
}


回答4:

Hardrada is pointing in the right direction here

On your server underneath the .ASPX file, add the required localization files

\App_LocalResources
    somePage.aspx.en.resx
    somePage.aspx.es.resx
    somePage.aspx.fr.resx
somePage.aspx
  • Add your translations
  • Insert them in your aspx file

Call your file as suggested, except with a querystring

/somePage.aspx?culture=fr

And inside somepage.aspx, in the OnLoad() or OnInit() set:

var culture = System.Globalization.CultureInfo.CreateSpecificCulture(Request["culture"])

if (culture != null)
   System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

Voila!



回答5:

SendEmail Button 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
        }