отправка содержимого динамической таблицы или div в качестве основного содержимого электронной почты


У меня есть страница (somePage.aspx), и мне нужно содержимое, которое было сгенерировано как тело электронной почты

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

Код для sendLog()

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

Я не могу получить значение контента для присвоения mail.cBody.
это говорит что-то о том, что значение не является буквальным и т. д.'.

Это метод, который я использую во внешнем классе, который прекрасно работает до этой последней попытки добавить функциональность содержимого страницы в качестве тела, как можно достичь результата, как это необходимо здесь?

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

5 ответов:

Этот код получит сгенерированный HTML вашего динамического элемента управления в строковую переменную.

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

Тогда просто используйте DV_TimeReportWraper_innerHTML как тело вашего письма

Возможно, вам придется создать цикл, если этот элемент управления имеет дочерние элементы управления. Подробнее об этом здесь: http://msdn.microsoft.com/en-us/library/htwek607.aspx#Y472

Здесь я делаю предположение, что вы загружаете эту страницу, а затем пытаетесь запустить метод sendLog после загрузки страницы или во время загрузки страницы или иным образом в течение некоторой части жизненного цикла Страницы. Попытка получить innerhtml чего-то, что еще не визуализировано, не сработает.

По существу, сначала нужно отрисовать страницу, а затем получить ее содержимое.

[править] Я обновляю свой ответ, чтобы включить, как бы я это сделал. Вместо того, чтобы писать .NET-код, чтобы заставить рендер, как я уже сказал в своем комментарии выше.. пусть ASP.NET делай за тебя грязную работу.

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

Теперь вы можете использовать результат этого вызова в качестве тела Вашего сообщения электронной почты.

Попробуйте это,

Добавить Пространства Имен

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

Почтовая Функция

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

Хардрада указывает здесь в правильном направлении

На вашем сервере под ним .ASPX файл, добавьте необходимые файлы локализации

\App_LocalResources
    somePage.aspx.en.resx
    somePage.aspx.es.resx
    somePage.aspx.fr.resx
somePage.aspx
  • добавьте свои переводы
  • вставьте их в файл aspx

Вызовите файл, как предложено, за исключением строки запроса

/ somePage.аспн?культура=fr

И внутри какой-то страницы.aspx, в наборе OnLoad() или OnInit ():

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

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

Вуаля!

Кнопка Отправить Сообщение Нажмите Код:

    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
        }