2

我正在开发一个在线订购网络应用程序,我必须在其中通过电子邮件将栖息产品详细信息发送给客户。我已经在数据表中维护了所有数据,然后按如下方式生成了网格视图

 public GridView makeGridview(DataTable Dt)
        {
            GridView GV = new GridView();
            GV.DataSource = Dt;
            GV.DataBind();
            return GV;
        }

然后将此网格视图添加到电子邮件

 body = body.Replace("{Product_Details}", GridViewToHtml(makeGridview(Dt)));

private string GridViewToHtml(GridView gv)
        {
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            HtmlTextWriter hw = new HtmlTextWriter(sw);
            gv.RenderControl(hw);
            return sb.ToString();
        }

这工作正常,但问题是我无法以我们的预定义格式设计它。这封邮件将由我网站的客户收到,因此我需要转换为我们的客户。请指导我如何格式化它们。

如果有另一种方法可以做到这一点,那么我也对此持开放态度。

4

4 回答 4

1

我建议您不要相信 GridView 作为您呈现的 html,而是使用您当前的数据源(DataTable):

    public GridView CreateHtmlTable(DataTable dt)
    {
       //Do your HTML work here, like the following:
       string tab = "\t";

       StringBuilder sb = new StringBuilder();

       sb.AppendLine("<html>");
       sb.AppendLine(tab + "<body>");
       sb.AppendLine(tab + tab + "<table>");

       // headers.
       sb.Append(tab + tab + tab + "<tr>");

       foreach (DataColumn dc in dt.Columns)
       {        
       sb.AppendFormat("<td>{0}</td>", dc.ColumnName);        
       }

       sb.AppendLine("</tr>");

       // data rows
       foreach (DataRow dr in dt.Rows)
       {
                  sb.Append(tab + tab + tab + "<tr>");

    foreach (DataColumn dc in dt.Columns)
    {
        string cellValue = dr[dc] != null ? dr[dc].ToString() : "";
        sb.AppendFormat("<td>{0}</td>", cellValue);
    }

    sb.AppendLine("</tr>");
}

       sb.AppendLine(tab + tab + "</table>");
       sb.AppendLine(tab + "</body>");
       sb.AppendLine("</html>");
    }
于 2013-10-08T14:03:40.853 回答
0

遵循以下代码:

public void SendHTMLMail()
{
MailMessage Msg = new MailMessage();
MailAddress fromMail = new MailAddress("administrator@aspdotnet-suresh.com");
// Sender e-mail address.
Msg.From = fromMail;
// Recipient e-mail address.
Msg.To.Add(new MailAddress("suresh@gmail.com"));
// Subject of e-mail
Msg.Subject = "Send Gridivew in EMail";
Msg.Body += "Please check below data <br/><br/>";
Msg.Body += GetGridviewData(gvUserInfo);
Msg.IsBodyHtml = true;
string sSmtpServer = "";
sSmtpServer = "10.2.160.101";
SmtpClient a = new SmtpClient();
a.Host = sSmtpServer;
a.EnableSsl = true;
a.Send(Msg);
}
// This Method is used to render gridview control
public string GetGridviewData(GridView gv)
{
StringBuilder strBuilder = new StringBuilder();
StringWriter strWriter = new StringWriter(strBuilder);
HtmlTextWriter htw = new HtmlTextWriter(strWriter);
gv.RenderControl(htw);
return strBuilder.ToString();
}

请参阅以下文档:

http://www.aspdotnet-suresh.com/2012/09/how-to-send-gridview-in-email-body-in.html

于 2013-10-08T14:02:17.523 回答
0

老实说,您在这里所做的(将 Web 窗体控件呈现为电子邮件字符串)似乎有点意外。老实说,遍历集合并使用 StringBuilder 构建 HTML 表并不难。

我相信对于电子邮件 HTML,惯例通常是使用内联样式来保证与电子邮件客户端的最佳兼容性。因此,您希望像这样设置元素的样式:

<table>
  <tbody>
    <tr style="background-color: #EE0000">
      <td style="text-transform: uppercase"></td>
      ...
    </tr>
  </tbody>
</table>

在过去,我通过创建一个包含我想要的所有内容并使用占位符之类的 HTML 文件来完成此操作{VariableName},然后用它们的值对变量进行字符串替换。通过这种方式,您可以将 HTML 视图与 C# 代码分开。使用项目列表会有点棘手,在这种情况下,您至少有两个 HTML 模板:一个用于整个文档,一个用于项目行。

于 2013-10-08T14:04:31.003 回答
0

我遇到了像你这样的类似问题,我是这样完成的:

  • 将功能封装在单独的 HelperClass 中以方便使用。使用静态变量和方法来保持简单

  • 编写 HTML 代码以将 GridView 的内容格式化为一个漂亮的表格(带有斑马条纹和东西)

     public static StringBuilder gridViewToHTML(GridView gv)
    {
        StringBuilder sb = new StringBuilder();
    
        sb.AppendLine("<html>");
        sb.AppendLine("<body>");
        sb.AppendLine(@"<table style='padding: 10px; font-family: Verdana; font-size:11px;
                            border-style:solid;border-width:1px;border-color:grey;'> ");
    
        sb.AppendLine("<tr>");
    
        /* *** Build header of the HTML table *** */
        for (int i = 0; i < gv.Columns.Count; i++)
        {
            sb.AppendLine("<td style='font-weight:bold;background-color:black;color:white;'>" + gv.Columns[i].HeaderText + "</td>");
        }
    
        sb.AppendLine("</tr>");
    
    
    
        /* *** Build body of the HTML table *** */
        for (int i = 0; i < gv.Rows.Count; i++)
        {
            sb.AppendLine("<tr>");
            foreach (DataControlFieldCell gvcell in gv.Rows[i].Cells)
            {
                sb.AppendLine("<td style='text-align;left;'>" + gvcell.ToString() + "</td>");
            }
            sb.AppendLine("</tr");
        }
    
    
    
        sb.AppendLine("</table>");
        sb.AppendLine("</body>");
        sb.AppendLine("</html>");
    
        return sb;
    }
    
  • 使用 StringBuilder 对象作为内容的 html 格式发送电子邮件消息,以及随意的参数(收件人和主题)

     public static void sendEmailMessage(StringBuilder stringBuilder, string email_ToAddress, string email_Subject)
    {
        DateTime now = DateTime.Now;
        DateTime yesterday = DateTime.Now.AddDays(-1);
    
        MailMessage mail = new MailMessage();
        //SomeEmailAccount@yourOrganization.com    must be set by your Sysadmin before using it.
        mail.From = new MailAddress("SomeEmailAccount@yourOrganization.com");
        mail.To.Add(email_ToAddress);
    
        mail.Subject = $"{email_Subject} . Date #{now.ToShortDateString()}";
        mail.Body = stringBuilder.ToString();
        mail.IsBodyHtml = true;
    
        NetworkCredential autentificare = new NetworkCredential();
        autentificare.UserName = "SomeEmailAccount@yourOrganization.com"";
        autentificare.Password = "yourPassw0rd";
    
        SmtpClient smtp = new SmtpClient();
    
        smtp.Host = "mail.yourOrganization.com";
        smtp.UseDefaultCredentials = true;
        smtp.Credentials = autentificare;
        smtp.Port = 25;
        smtp.EnableSsl = false;
        smtp.Send(mail);
    
    }
    
于 2019-04-08T07:42:41.237 回答