我编写了一些代码,用于发送电子邮件并从 Gridview 插入表格单元格。
Protected Sub SendRequestMail()
Dim tryCount As Integer = 5
Dim failed As Boolean = False
Do
Try
failed = False
Dim ToMailIDs As String
ToMailIDs = LblRecipients.Text
Using sw As New StringWriter()
Using hw As New HtmlTextWriter(sw)
GridView1.RenderControl(hw)
Dim sr As New StringReader(sw.ToString())
Dim smtpSection As SmtpSection = CType(ConfigurationManager.GetSection("system.net/mailSettings/smtp"), SmtpSection)
Dim mm As MailMessage = New MailMessage()
mm.From = New MailAddress(smtpSection.From, "Notification")
For i As Integer = 0 To ToMailIDs.Split(","c).Length - 1
mm.To.Add(New MailAddress(ToMailIDs.Split(","c)(i)))
Next
mm.ReplyTo = New MailAddress("[email protected]")
mm.Subject = LblMrNumFull.Text & " | " & LblMrDate1x.Text & " | " & LblStorsName1.Text & " - Approval"
mm.Body = LblMrNumFull.Text & " | " & LblMrDate1x.Text & " | " & LblStorsName1.Text
mm.Body += sw.ToString()
mm.Body += "<br />"
mm.Body += "Thanking you"
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.Delay
mm.Headers.Add("Disposition-Notification-To", "[email protected]")
' ----- webconfig mail start
mm.IsBodyHtml = True
Dim smtp As SmtpClient = New SmtpClient
smtp.Host = smtpSection.Network.Host
smtp.EnableSsl = smtpSection.Network.EnableSsl
Dim networkCred As NetworkCredential = New NetworkCredential(smtpSection.Network.UserName, smtpSection.Network.Password)
smtp.UseDefaultCredentials = smtpSection.Network.DefaultCredentials
smtp.Credentials = networkCred
smtp.Port = smtpSection.Network.Port
smtp.Send(mm)
' ----- webconfig mail end
End Using
End Using
Catch ex As Exception
failed = True
tryCount = tryCount - 1
Finally
Response.Redirect("~/abc/xyx.aspx?NewID=" & Request.QueryString("NewID"))
End Try
Loop While failed AndAlso tryCount > 0
End Sub
该代码有效,并且电子邮件已成功发送。 之后,我在 Gridview 的最后一列添加了一个图像按钮:
然后电子邮件将停止发送。请建议使用上面的代码来发送带有或不带有最后一列图像按钮的电子邮件。
尝试过没有效果
'To Export all pages.
GridView1.AllowPaging = False
Me.BindData_GridView1()
GridView1.HeaderRow.BackColor = Color.White
For Each cell As TableCell In GridView1.HeaderRow.Cells
cell.BackColor = GridView1.HeaderStyle.BackColor
Next
For Each row As GridViewRow In GridView1.Rows
row.BackColor = Color.White
For Each cell As TableCell In row.Cells
If row.RowIndex Mod 2 = 0 Then
cell.BackColor = GridView1.AlternatingRowStyle.BackColor
Else
cell.BackColor = GridView1.RowStyle.BackColor
End If
cell.CssClass = "textmode"
Next
Next
我从另一个论坛得到了解决方案,所以我将其发布在下面。
HTML
<%@ Page Title="" Language="vb" AutoEventWireup="false" EnableEventValidation="false" MasterPageFile="~/abc/xyz.Master" CodeBehind="aaaa1.aspx.vb" Inherits="aaaa.sss" %>
VB.NET
Protected Sub SendRequestMail()
Dim tryCount As Integer = 5
Dim failed As Boolean = False
Do
Try
failed = False
Dim ToMailIDs As String
ToMailIDs = LblRecipients.Text
GridView1.Columns(GridView1.Columns.Count - 1).Visible = False
Using sw As New StringWriter()
Using hw As New HtmlTextWriter(sw)
GridView1.RenderControl(hw)
Dim sr As New StringReader(sw.ToString())
Dim smtpSection As Net.Configuration.SmtpSection = CType(ConfigurationManager.GetSection("system.net/mailSettings/smtp"), SmtpSection)
Dim mm As System.Web.Mail.MailMessage = New System.Web.Mail.MailMessage()
mm.From = New MailAddress(smtpSection.From, "Notification")
For i As Integer = 0 To ToMailIDs.Split(","c).Length - 1
mm.To.Add(New MailAddress(ToMailIDs.Split(","c)(i)))
Next
mm.ReplyTo = New MailAddress("[email protected]")
mm.Subject = LblMrNumFull.Text & " | " & LblMrDate1x.Text & " | " & LblStorsName1.Text & " - Approval"
mm.Body = LblMrNumFull.Text & " | " & LblMrDate1x.Text & " | " & LblStorsName1.Text
mm.Body += sw.ToString()
mm.Body += "<br />"
mm.Body += "Thanking you"
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.Delay
mm.Headers.Add("Disposition-Notification-To", "[email protected]")
' ----- webconfig mail start
mm.IsBodyHtml = True
Dim smtp As SmtpClient = New SmtpClient
smtp.Host = smtpSection.Network.Host
smtp.EnableSsl = smtpSection.Network.EnableSsl
Dim networkCred As NetworkCredential = New NetworkCredential(smtpSection.Network.UserName, smtpSection.Network.Password)
smtp.UseDefaultCredentials = smtpSection.Network.DefaultCredentials
smtp.Credentials = networkCred
smtp.Port = smtpSection.Network.Port
smtp.Send(mm)
' ----- webconfig mail end
End Using
End Using
GridView1.Columns(GridView1.Columns.Count - 1).Visible = True
Catch ex As Exception
failed = True
tryCount = tryCount - 1
Finally
Response.Redirect("~/abc/xyx.aspx?NewID=" & Request.QueryString("NewID"))
End Try
Loop While failed AndAlso tryCount > 0
结束子
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control) End Sub
谢谢你
图像是通过 URL 提供的吗?
您可以考虑将图像转换为内联“base64”字符串,因此 GV 的 html 渲染将不包含链接。
您可能不希望将图像作为指向您网站的 URL 的“链接”(但尚未确定)。
换句话说,如果您尝试在该正文的 html 中添加/渲染/注入/拥有/使用/享受某些图像,请尝试使用“字符串”而不是图像的实际 URL。
所以,说这个例子简单gv
<h3>Hotels</h3>
<asp:GridView ID="GridView1" runat="server" Width="40%"
AutoGenerateColumns="False" DataKeyNames="ID" CssClass="table table-striped">
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="cmdApprove" runat="server"
ImageUrl="~/Content/Pictures/check1.jpg"
Width="48"
OnClick="cmdApprove_Click" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
要加载的代码是这样的:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGrid()
End If
End Sub
Sub LoadGrid()
GridView1.DataSource = Myrst("SELECT * FROM tblHotelsA ORDER BY Hotelname")
GridView1.DataBind()
End Sub
我们现在有了这个:
但是,现在让我们按 F12 打开浏览器开发工具和元素,并检查该 ImageButton,我们会找到/得到这个:
<input type="image" name="GridView1$ctl03$cmdApprove"
id="GridView1_cmdApprove_1"
src="../Content/Pictures/check1.jpg"
style="width:48px;">
嗯,我看不到网格视图如何在电子邮件正文中呈现,因为您有网站的路径名和“url”,更糟糕的是,它们是相对路径名,仅适用于当前给定的网站,并且仅适用于当前文件夹页面
注意路径名中的“../”!如果您将该网页移动到另一个文件夹,即使是简单的路径名也不再起作用!
那么,让我们从该 ImageButton 中删除 URL。
并让“流”+将图片作为嵌入字节数组注入。
所以,我们的图像按钮现在变成了这样:
<ItemTemplate>
<asp:ImageButton ID="cmdApprove" runat="server"
Width="48"
OnClick="cmdApprove_Click" />
</ItemTemplate>
所以,没有图像。
但是,现在,在行数据绑定事件中,我们这样做:
Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim ImageBtn As ImageButton = e.Row.FindControl("cmdApprove")
ImageBtn.ImageUrl = gImageBytes("~/Content/Pictures/check1.jpg")
End If
End Sub
Function gImageBytes(sFile As String) As String
Dim sFileInternal As String =
Server.MapPath(sFile)
Dim iBytes As Byte() = File.ReadAllBytes(sFileInternal)
Dim sMineType As String = MimeMapping.GetMimeMapping(sFileInternal)
Return $"data:{sMineType};base64,{Convert.ToBase64String(iBytes, 0, iBytes.Length)}"
End Function
当我们跑步时,gv看起来是一样的。
但是,现在检查标记,我们得到/看到:
<input type="image" name="GridView1$ctl02$cmdApprove"
id="GridView1_cmdApprove_0"
src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAS etc."
style="width:48px;">
我“剪切”了图像的其余字节,但现在请注意,标记如何没有 Web 服务器上某些图像的 URL 路径名 - 客户端电子邮件正文永远不会有。
因此,上面的内容将/可以/将删除该网格中图像的路径名。
但是,更好吗?
我会“隐藏”按钮(visible = false)意味着html不会在gv中呈现,因此您最终会100%删除按钮。因此,在行数据绑定中,隐藏按钮 - 它们的标记将不会被渲染。
所以,这样说:
在页面类中,定义一个标志,如下所示:
Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim ImageBtn As ImageButton = e.Row.FindControl("cmdApprove")
ImageBtn.Visible = Not (bHideGridButtons)
ImageBtn.ImageUrl = gImageBytes("~/Content/Pictures/check1.jpg")
End If
End Sub
所以,现在 gv 变成了这样:
或者,另一个想法:创建第二个 gv,并将其用于电子邮件。
(无论如何,我看不出在某些电子邮件正文中包含按钮的意义!)。
所以,您可以尝试删除图像。
但是,在做任何这些之前?
创建一个单独的 100% 例程,如下所示:
Call SendMailWeb(strTO, strSubject,
strBody, True, strCC, strBC,
FileAttachments, strReplyFromList)
或“随便”。
因此,通过一个单独的例程来调用,那么这将允许轻松编码,但也允许您根据上述想法制作一些测试网格,例如删除图像链接和使用“流”。
我经常用于显示图像,甚至用于用户下载文件?
我不允许网站和标记允许使用任何公共或基于文件的“URL”路径名。所有文件操作都是 100% 来自代码隐藏,因此我在任何时候都不会将文件暴露给网站允许的公共 URL。 (这样做是出于安全原因,也是为了让用户下载 PDF 文档,但该 PDF 文件夹不会作为任何 URL 公共路径名公开。
代码隐藏 100% 忽略 IIS 安全设置,文件路径名是 100% 简单的服务器路径(良好的老式 Windows 路径名)。因此,虽然这是一个简单的“图像”示例,但它确实表明某些图像的 URL 不必是要显示的图像的有效且现有的 URL,而只需将文件读取为字节,然后将其发送出去图像作为 Base 64 图像字符串。
因此,对于电子邮件正文中的任何图像来说,图片的链接和路径名在某些客户端计算机上的电子邮件正文中都不起作用,这些客户端计算机甚至可能没有可用的网站 URL 的图片路径名完全没有。