How to Email a Web Page As HTML in ASP.NET using C# VB.NET
This post explains How to Email a Web Page As HTML From Your Site or in fact any web page you want (though i would not recommend any with lots of scripts etc in it). It is very useful for email forms to customers etc from your site.
Personally I create an plainer version of the form just for email. I remove any menu functions and other things that are there as part of the website and are not useful in the email - but that is a personal preference.
I have already written a couple of posts regarding How to Send Email in ASP.NET. You can check them here:
However, to keep things simple, this is how an email could be send:
VB.NET
Now to send the page. Remember it can be any page and so you can do any code behind processing first that you wish. In essence we call Server.Execute which runs the page as if it were in a browser, but without opening the page in the browser for the user to see. The lines of code are simple as follows:
VB.NETPersonally I create an plainer version of the form just for email. I remove any menu functions and other things that are there as part of the website and are not useful in the email - but that is a personal preference.
I have already written a couple of posts regarding How to Send Email in ASP.NET. You can check them here:
- Send Bulk Emails using C# VB.NET in ASP.NET
- Send Email With Attachment in ASP.NET
- Send Email Using Gmail in ASP.NET
However, to keep things simple, this is how an email could be send:
C#
using System.Net.Mail;
public static class Emailer
{
public static void SendEmail(string from, string to, string subject, string body)
{
SmtpClient smtp = new SmtpClient("hostname");
MailMessage email = new MailMessage(from, to, subject, body);
email.IsBodyHtml = true;
smtp.Send(email);
}
}
Imports System.Net.Mail
Public NotInheritable Class Emailer
Private Sub New()
End Sub
Public Shared Sub SendEmail(from As String, [to] As String, subject As String, body As String)
Dim smtp As New SmtpClient("hostname")
Dim email As New MailMessage(from, [to], subject, body)
email.IsBodyHtml = True
smtp.Send(email)
End Sub
End Class
Now to send the page. Remember it can be any page and so you can do any code behind processing first that you wish. In essence we call Server.Execute which runs the page as if it were in a browser, but without opening the page in the browser for the user to see. The lines of code are simple as follows:
C#
using System.Net;
using System.IO:
protected void btnSendEmail_Click(object sender, EventArgs e)
{
////*** somewhere in an aspx page - preferably a different one to the one you are emailing but doesnt have to be******
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Server.Execute("YourWebPage.aspx", htw); // remember, it could be any web page
//the page has now processed and the markup is in the textwriter inner text which is the stringwriter
//I also set a status in the called aspx page and check to see all was ok before continuing but will keep it simple here
Emailer.SendEmail("from@here.com", "to@there.com", "Your aspx page", sw.ToString());
}
Imports System.Net
Imports System.IO
Protected Sub btnSendEmail_Click(sender As Object, e As EventArgs)
'''/*** somewhere in an aspx page - preferably a different one to the one you are emailing but doesnt have to be******
Dim sw As New StringWriter()
Dim htw As New HtmlTextWriter(sw)
Server.Execute("YourWebPage.aspx", htw)
' remember, it could be any web page
'the page has now processed and the markup is in the textwriter inner text which is the stringwriter
'I also set a status in the called aspx page and check to see all was ok before continuing but will keep it simple here
Emailer.SendEmail("from@here.com", "to@there.com", "Your aspx page", sw.ToString())
End Sub
You could pass parameters in the header of Server.Execute if needed or anything just as calling a normal aspx page. It you wanted to call a third party page instead then you cant use Response.Redirect.
Remember if you want to place the code above into the page you want to email then do not put it in the page load without some form of checking (say a flag) otherwise you will go into an never-ending loop (infinite loop) and overflow error.