отправка содержимого динамической таблицы или 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 ответов:
Этот код получит сгенерированный 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 }