1 Introduction Printer Friendly
1.1 What is System.Net.Mail? Printer Friendly
System.Net.Mail is the namespace used to send email if you are using the 2.0 (or higher) .NET Framework.
Unlike System.Web.Mail, which was introduced in the 1.0 Framework, it is not built upon the CDO/CDOSYS libraries. Instead it is written from the ground up without any interop. Thus, it is not dependant upon other COM libraries. System.Net.Mail introduces brand new classes for creating and sending email.
Although some functionality has been removed, the new System.Net.Mail namespace is much more versatile than the older CDO dependant System.Web.Mail.
1.2 What is the .NET Framework ? Printer Friendly
1.3 What do I need to send email in .NET? Printer Friendly
1.4 What is a relay server? Printer Friendly
1.5 What is the IIS SMTP Service? Printer Friendly
1.6 Can System.Net.Mail read email? Printer Friendly
2 Exploring System.Net.Mail Classes Printer Friendly
This FAQ section will explore the main classes of the System.Net.Mail name space. This is not a complete listing of all the classes, but rather the ones that are most commonly used. They include:
2.1 MailMessage Class Printer Friendly
The MailMessage class can be considered the foundation class of the System.Net.Mail namespace. It deals with creating and managing the email message. All other classes will somehow interact with this class. The MailMessage class exposes such properties as the
Below you will find an example of using the MailMessage class
static void PlainText() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub PlainText() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'PlainText
2.2 MailAddress Class Printer Friendly
The MailAddress class is used for creating email addresses. This class is used for setting the MailMessage.From, MailMessage.To, MailMessage.CC and MailMessage.BCC properties. Of these properties the .From class is actually a MailAddress, while the To, CC and BCC properties are actually collections of MailAddresses. The two most common properties of the MailAddress class are the DisplayName and the Address properties. They are described below.
Below is an example demonstrating the MailAddress class.
[ C# ]
static void MultipleRecipients() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses //to specify a friendly 'from' name, we use a different ctor mail.From = new MailAddress("me@mycompany.com", "Steve James"); //since the To,Cc, and Bcc accept addresses, we can use the same technique as the From address //since the To, Cc, and Bcc properties are collections, to add multiple addreses, we simply call .Add(...) multple times mail.To.Add("you@yourcompany.com"); mail.To.Add("you2@yourcompany.com"); mail.CC.Add("cc1@yourcompany.com"); mail.CC.Add("cc2@yourcompany.com"); mail.Bcc.Add("blindcc1@yourcompany.com"); mail.Bcc.Add("blindcc2@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub MultipleRecipients() 'create the mail message Dim mail As New MailMessage() 'set the addresses 'to specify a friendly 'from' name, we use a different ctor mail.From = New MailAddress("me@mycompany.com", "Steve James") 'since the To,Cc, and Bcc accept addresses, we can use the same technique as the From address 'since the To, Cc, and Bcc properties are collections, to add multiple addreses, we simply call .Add(...) multple times mail.To.Add("you@yourcompany.com") mail.To.Add("you2@yourcompany.com") mail.CC.Add("cc1@yourcompany.com") mail.CC.Add("cc2@yourcompany.com") mail.Bcc.Add("blindcc1@yourcompany.com") mail.Bcc.Add("blindcc2@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'MultipleRecipients
2.3 Attachment Class Printer Friendly
The Attachment class is used for creating and managing individual attachments of the MailMessage object. Attachments can be created from streams or file paths. The stream or file path must be set in the ctor of the Attachment.
Below is an example demonstrating the Attachment class
static void AttachmentFromFile() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this content is in the body"; //add an attachment from the filesystem mail.Attachments.Add(new Attachment("c:\\temp\\example.txt")); //to add additional attachments, simply call .Add(...) again mail.Attachments.Add(new Attachment("c:\\temp\\example2.txt")); mail.Attachments.Add(new Attachment("c:\\temp\\example3.txt")); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub AttachmentFromFile() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this content is in the body" 'add an attachment from the filesystem mail.Attachments.Add(New Attachment("c:\temp\example.txt")) 'to add additional attachments, simply call .Add(...) again mail.Attachments.Add(New Attachment("c:\temp\example2.txt")) mail.Attachments.Add(New Attachment("c:\temp\example3.txt")) 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'AttachmentFromFile
2.4 SmtpClient Class Printer Friendly
The SmtpClient class is responsible for sending or transporting the email. The SmtpClient can transport the email content over the network, or it can actually write them to the filesystem in the MS IIS Smtp Service Pickup Directory format, which resembles a RFC821 formatted message. Emails can be sent either synchronously or asynchronously. The SmtpClient also supports sending email via SSL for security purposes. The following list of properties are the most common used on the SmtpClient class.
Below is an example demonstrating the SmtpClient class.
static void Authenticate() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); //to authenticate we set the username and password properites on the SmtpClient smtp.Credentials = new NetworkCredential("username", "secret"); smtp.Send(mail); }
Sub Authenticate() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") 'to authenticate we set the username and password properites on the SmtpClient smtp.Credentials = New NetworkCredential("username", "secret") smtp.Send(mail) End Sub 'Authenticate
2.5 AlternateView Class Printer Friendly
The AlternateView class is used for providing alternate bodies and creating Multi-Part mime emails. If you want to create an email that will be rendered properly in both Html capable and Plain Text only mail clients, then you will create alternate views of the message. There are a few main properties and methods you will use with the AlternateView class. They are:
Below is an example demonstrating the AlternateView class.
static void MultiPartMime() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; //first we create the Plain Text part AlternateView plainView = AlternateView.CreateAlternateViewFromString("This is my plain text content, viewable by those clients that don't support html", null, "text/plain"); //then we create the Html part AlternateView htmlView = AlternateView.CreateAlternateViewFromString("<b>this is bold text, and viewable by those mail clients that support html</b>", null, "text/html"); mail.AlternateViews.Add(plainView); mail.AlternateViews.Add(htmlView); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); //specify the mail server address smtp.Send(mail); }
Sub MultiPartMime() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" 'first we create the Plain Text part Dim plainView As AlternateView = AlternateView.CreateAlternateViewFromString("This is my plain text content, viewable by those clients that don't support html", Nothing, "text/plain") 'then we create the Html part Dim htmlView As AlternateView = AlternateView.CreateAlternateViewFromString("<b>this is bold text, and viewable by those mail clients that support html</b>", Nothing, "text/html") mail.AlternateViews.Add(plainView) mail.AlternateViews.Add(htmlView) 'send the message Dim smtp As New SmtpClient("127.0.0.1") 'specify the mail server address smtp.Send(mail) End Sub 'MultiPartMime
2.6 Linked Resource Printer Friendly
The LinkedResource class is the last, and least used main class. It is mainly used for creating embedded images. To create an embedded image you will need to first create a Html formatted AlternateView. Within that alternate view you create an tag, that points to the ContentId (CID) of the LinkedResource. You then create a LinkedResource object and add it to the AlternateView's LinkedResources collection.
Below is an example using the LinkedResource class.
static void EmbedImages() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; //first we create the Plain Text part AlternateView plainView = AlternateView.CreateAlternateViewFromString("This is my plain text content, viewable by those clients that don't support html", null, "text/plain"); //then we create the Html part //to embed images, we need to use the prefix 'cid' in the img src value //the cid value will map to the Content-Id of a Linked resource. //thus <img src='cid:companylogo'> will map to a LinkedResource with a ContentId of 'companylogo' AlternateView htmlView = AlternateView.CreateAlternateViewFromString("Here is an embedded image.<img src=cid:companylogo>", null, "text/html"); //create the LinkedResource (embedded image) LinkedResource logo = new LinkedResource( "c:\\temp\\logo.gif" ); logo.ContentId = "companylogo"; //add the LinkedResource to the appropriate view htmlView.LinkedResources.Add(logo); //add the views mail.AlternateViews.Add(plainView); mail.AlternateViews.Add(htmlView); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); //specify the mail server address smtp.Send(mail); }
Sub EmbedImages() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" 'first we create the Plain Text part Dim plainView As AlternateView = AlternateView.CreateAlternateViewFromString("This is my plain text content, viewable by those clients that don't support html", Nothing, "text/plain") 'then we create the Html part 'to embed images, we need to use the prefix 'cid' in the img src value 'the cid value will map to the Content-Id of a Linked resource. 'thus <img src='cid:companylogo'> will map to a LinkedResource with a ContentId of 'companylogo' Dim htmlView As AlternateView = AlternateView.CreateAlternateViewFromString("Here is an embedded image.<img src=cid:companylogo>", Nothing, "text/html") 'create the LinkedResource (embedded image) Dim logo As New LinkedResource("c:\temp\logo.gif") logo.ContentId = "companylogo" 'add the LinkedResource to the appropriate view htmlView.LinkedResources.Add(logo) 'add the views mail.AlternateViews.Add(plainView) mail.AlternateViews.Add(htmlView) 'send the message Dim smtp As New SmtpClient("127.0.0.1") 'specify the mail server address smtp.Send(mail) End Sub 'EmbedImages
3 Quickstart Programming Samples Printer Friendly
3.1 Working with the Body Printer Friendly
3.1.1 How do I send a plain text email? Printer Friendly
//create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is a sample body"; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail);
'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is a sample body" 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail)
3.1.2 How do I send a simple Html email? Printer Friendly
//create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is a sample body with html in it. <b>This is bold</b> <font color=#336699>This is blue</font>"; mail.IsBodyHtml = true; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail);
'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is a sample body with html in it. <b>This is bold</b> <font color=#336699>This is blue</font>" mail.IsBodyHtml = True 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail)
3.1.3 How do I create a Multi-Part mime message? Printer Friendly
The following example creates the most common Multi-Part mime email, a Plain Text and a Html Text email (2 alternate body parts).
3.2 Working with Addresses Printer Friendly
3.2.1 How do I change the FROM address to a friendly name? Printer Friendly
static void FriendlyFromName() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses //to specify a friendly 'from' name, we use a different ctor mail.From = new MailAddress("me@mycompany.com", "Steve James" ); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub FriendlyFromName() 'create the mail message Dim mail As New MailMessage() 'set the addresses 'to specify a friendly 'from' name, we use a different ctor mail.From = New MailAddress("me@mycompany.com", "Steve James") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'FriendlyFromName
3.2.2 How do I change the TO address to a friendly name? Printer Friendly
Below is a sample that demonstrates this.
static void FriendlyToName() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses //to specify a friendly 'from' name, we use a different ctor mail.From = new MailAddress("me@mycompany.com", "Steve James"); //since the To,Cc, and Bcc accept addresses, we can use the same technique as the From address mail.To.Add( new MailAddress( "you@yourcompany.com", "Beth Jones") ); mail.CC.Add(new MailAddress("donna@yourcompany.com", "Donna Summers")); mail.Bcc.Add(new MailAddress("bob@yourcompany.com", "Bob Smith")); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub FriendlyToName() 'create the mail message Dim mail As New MailMessage() 'set the addresses 'to specify a friendly 'from' name, we use a different ctor mail.From = New MailAddress("me@mycompany.com", "Steve James") 'since the To,Cc, and Bcc accept addresses, we can use the same technique as the From address mail.To.Add(New MailAddress("you@yourcompany.com", "Beth Jones")) mail.CC.Add(New MailAddress("donna@yourcompany.com", "Donna Summers")) mail.Bcc.Add(New MailAddress("bob@yourcompany.com", "Bob Smith")) 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'FriendlyToName
3.2.3 How do I specify multiple recipients? Printer Friendly
Below is an example that demonstrates adding multiple To, CC, and Bcc addresses.
3.2.4 How do I create a friendly non-ascii display name? Printer Friendly
Below is an example of creating a friendly display name that uses ISO-8859-1 characters.
static void FriendlyNonAsciiName() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses //to specify a friendly non ascii name, we use a different ctor. //A ctor that accepts an encoding that matches the text of the name mail.From = new MailAddress("me@mycompany.com", "Steve Øbirk", Encoding.GetEncoding( "iso-8859-1")); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub FriendlyNonAsciiName() 'create the mail message Dim mail As New MailMessage() 'set the addresses 'to specify a friendly non ascii name, we use a different ctor. 'A ctor that accepts an encoding that matches the text of the name mail.From = New MailAddress("me@mycompany.com", "Steve Øbirk", Encoding.GetEncoding("iso-8859-1")) mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'FriendlyNonAsciiName
3.3 Working with Headers Printer Friendly
3.3.1 How do I change the email priority? Printer Friendly
A priority can have the following values
The following example demonstrates setting the MailMessage object to a High priority.
static void SetPriority() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //specify the priority of the mail message mail.Priority = MailPriority.High; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub SetPriority() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'specify the priority of the mail message mail.Priority = MailPriority.High 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'SetPriority
3.3.2 How do I add the Reply-To header to the MailMessage? Printer Friendly
The following example demonstrates setting the ReplyTo property.
static void SetTheReplyToHeader() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //specify the priority of the mail message mail.ReplyTo = new MailAddress("SomeOtherAddress@mycompany.com"); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub SetTheReplyToHeader() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'specify the priority of the mail message mail.ReplyTo = New MailAddress("SomeOtherAddress@mycompany.com") 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'SetTheReplyToHeader
3.3.3 How do I request a read receipt? Printer Friendly
To request a read receipt, we need to specify a Disposition-Notification-To header. This header is recognized my most major mail clients to send a read receipt when the email is first read. It's important to note that just because you request a read receipt, doesn't' mean you will get one.
Read receipt requests may not be always honored because
1) A mail client may not recognize the special Disposition-Notification-To header. 2) A mail client may not implement that functionality. 3) The end user may have that functionality turned off. 4) The end user may optionally not choose to send one for your particular email.
static void ReadReceipts() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //To request a read receipt, we need add a custom header named 'Disposition-Notification-To' //in this example, read receipts will go back to 'someaddress@mydomain.com' //it's important to note that read receipts will only be sent by those mail clients that //a) support them //and //b)have them enabled. mail.Headers.Add("Disposition-Notification-To", "<someaddress@mydomain.com>"); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub ReadReceipts() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'To request a read receipt, we need add a custom header named 'Disposition-Notification-To' 'in this example, read receipts will go back to 'someaddress@mydomain.com' 'it's important to note that read receipts will only be sent by those mail clients that 'a) support them 'and 'b)have them enabled. mail.Headers.Add("Disposition-Notification-To", "<someaddress@mydomain.com>") 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'ReadReceipts
3.3.4 How do I add custom headers to the MailMessage? Printer Friendly
Below is an example of adding two "X-" headers to a MailMessage. There isn't anything special about adding the prefix "X-" to a header. In the email world, the "X-" prefix has just come to mean "extra".
static void CustomHeaders() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //to add custom headers, we use the Headers.Add(...) method to add headers to the //.Headers collection mail.Headers.Add("X-Company", "My Company"); mail.Headers.Add("X-Location", "Hong Kong"); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Sub CustomHeaders() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'to add custom headers, we use the Headers.Add(...) method to add headers to the '.Headers collection mail.Headers.Add("X-Company", "My Company") mail.Headers.Add("X-Location", "Hong Kong") 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'CustomHeaders
3.4 Working with Attachments Printer Friendly
3.4.1 How do I send an email with attachments? Printer Friendly
Below is a simple example of attaching text files to an outgoing email. [ C# ]
3.4.2 How do I create an attachment from a stream? Printer Friendly
The following example creates an attachment from some simple text, but it could have just as easily have come from Sql Server.
static void AttachmentFromStream() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this content is in the body"; //Get some binary data byte[] data = GetData(); //save the data to a memory stream MemoryStream ms = new MemoryStream(data); //create the attachment from a stream. Be sure to name the data with a file and //media type that is respective of the data mail.Attachments.Add( new Attachment( ms, "example.txt", "text/plain" )); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); } static byte[] GetData() { //this method just returns some binary data. //it could come from anywhere, such as Sql Server string s = "this is some text"; byte[] data = Encoding.ASCII.GetBytes(s); return data; }
Sub AttachmentFromStream() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this content is in the body" 'Get some binary data Dim data As Byte() = GetData() 'save the data to a memory stream Dim ms As New MemoryStream(data) 'create the attachment from a stream. Be sure to name the data with a file and 'media type that is respective of the data mail.Attachments.Add(New Attachment(ms, "example.txt", "text/plain")) 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'AttachmentFromStream Function GetData() As Byte() 'this method just returns some binary data. 'it could come from anywhere, such as Sql Server Dim s As String = "this is some text" Dim data As Byte() = Encoding.ASCII.GetBytes(s) Return data End Function 'GetData
3.5 Accessing Config File Mail Settings Programmatically Printer Friendly
Special thanks to Ryan Olshan for this one.
System.Net.Configuration.MailSettingsSectionGroup mMailSettings; int mPort = mMailSettings.Smtp.Network.Port; string mHost = mMailSettings.Smtp.Network.Host; string mPassword = mMailSettings.Smtp.Network.Password; string mUsername = mMailSettings.Smtp.Network.Username;
Dim mMailSettings As System.Net.Configuration.MailSettingsSectionGroup Dim mPort As Integer = mMailSettings.Smtp.Network.Port Dim mHost As String = mMailSettings.Smtp.Network.Host Dim mPassword As String = mMailSettings.Smtp.Network.Password Dim mUsername As String = mMailSettings.Smtp.Network.Username
4 Advanced Programming Samples Printer Friendly
4.1 How do I read SMTP configuration data? Printer Friendly
Using the configuation file, you can set the following default properties:
MailMessage.From SmtpClient.Host SmtpClient.Port
The settings will also allow you specify a Username and Password to be used for authentication. It is important to note that if DefaultCredentials are specified to true, the userName and password attributes are igorned.
Here is an example of the node:
<configuration> <system.net> <mailSettings> <smtp from="me@mycompany.com"> -- The node supports the following properties, but we won't use all of them --> <network host="127.0.0.1" /> smtp> mailSettings> system.net> configuration>
<location path="SomeDirectory/Page1.aspx"> <system.net> <mailSettings> <smtp deliveryMethod="Network" from="admin@example.com"> <network defaultCredentials="true" host="smtp.example.com" port="25" userName="admin@example.com" password="password"/> </smtp> </mailSettings> </system.net> </location> <location path="SomeDirectory/Page2.aspx"> <system.net> <mailSettings> <smtp deliveryMethod="Network" from="sales@example.com"> <network defaultCredentials="true" host="smtp.example.com" port="25" userName="sales@example.com" password="password"/> </smtp> </mailSettings> </system.net> </location> <location path="SomeDirectory/Page3.aspx"> <system.net> <mailSettings> <smtp deliveryMethod="Network" from="info@example.com"> <network defaultCredentials="true" host="smtp.example.com" port="25" userName="info@example.com" password="password"/> </smtp> </mailSettings> </system.net> </location>
4.10 How do I create a log file of the SMTP session? Printer Friendly
The System.Net namespace allows you to log the contents of the SMTP session to a file. This is done through a combination of trace switches in your app's configuration file.
The following example of trace switches will cause the SMTP session to be logged to a file named "System.Net.trace.log".
<configuration> <system.diagnostics> <trace autoflush="true" /> <sources> <source name="System.Net" > <listeners> <add name="MyTraceFile"/> </listeners> </source> <source name="System.Net.Sockets"> <listeners> <add name="MyTraceFile"/> </listeners> </source> </sources>
<sharedListeners> <add name="MyTraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="System.Net.trace.log" /> </sharedListeners>
<switches> <add name="System.Net" value="Verbose" /> <add name="System.Net.Sockets" value="Verbose" /> </switches> </configuration>
Here is what the log file might look like:
System.Net Verbose: 0 : [0992] SmtpClient::.ctor(host=127.0.0.1) System.Net Information: 0 : [0992] Associating SmtpClient#47606018 with SmtpTransport#5689696 System.Net Verbose: 0 : [0992] Exiting SmtpClient::.ctor() -> SmtpClient#47606018 System.Net Verbose: 0 : [0992] SmtpClient#47606018::Send(MailMessage#5138334) System.Net Information: 0 : [0992] SmtpClient#47606018::Send(DeliveryMethod=Network) System.Net Information: 0 : [0992] Associating SmtpClient#47606018 with MailMessage#5138334 System.Net Information: 0 : [0992] Associating SmtpTransport#5689696 with SmtpConnection#31950948 System.Net Information: 0 : [0992] Associating SmtpConnection#31950948 with ServicePoint#34920472 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Socket(InterNetwork#2) System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Socket() System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Connect(1:25#16777318) System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Connect() System.Net Information: 0 : [0992] Associating SmtpConnection#31950948 with SmtpPooledStream#48167163 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Receive() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Receive System.Net.Sockets Verbose: 0 : [0992] 00000000 : 32 32 30 20 77 32 6B 20-4D 69 63 72 6F 73 6F 66 : 220 w2k Microsof System.Net.Sockets Verbose: 0 : [0992] 00000010 : 74 20 45 53 4D 54 50 20-4D 41 49 4C 20 53 65 72 : t ESMTP MAIL Ser System.Net.Sockets Verbose: 0 : [0992] 00000020 : 76 69 63 65 2C 20 56 65-72 73 69 6F 6E 3A 20 35 : vice, Version: 5 System.Net.Sockets Verbose: 0 : [0992] 00000030 : 2E 30 2E 32 31 39 35 2E-36 37 31 33 20 72 65 61 : .0.2195.6713 rea System.Net.Sockets Verbose: 0 : [0992] 00000040 : 64 79 20 61 74 20 20 53-61 74 2C 20 33 31 20 44 : dy at Sat, 31 D System.Net.Sockets Verbose: 0 : [0992] 00000050 : 65 63 20 32 30 30 35 20-32 32 3A 31 33 3A 31 34 : ec 2005 22:13:14 System.Net.Sockets Verbose: 0 : [0992] 00000060 : 20 2D 30 36 30 30 20 0D-0A : -0600 .. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Receive() -> 105#105 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Send() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Send System.Net.Sockets Verbose: 0 : [0992] 00000000 : 45 48 4C 4F 20 77 32 6B-0D 0A : EHLO w2k.. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Send() -> 10#10 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Receive() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Receive System.Net.Sockets Verbose: 0 : [0992] 00000000 : 32 35 30 2D 77 32 6B 20-48 65 6C 6C 6F 20 5B 31 : 250-w2k Hello [1 System.Net.Sockets Verbose: 0 : [0992] 00000010 : 32 37 2E 30 2E 30 2E 31-5D 0D 0A 32 35 30 2D 41 : 27.0.0.1]..250-A System.Net.Sockets Verbose: 0 : [0992] 00000020 : 55 54 48 20 47 53 53 41-50 49 20 4E 54 4C 4D 20 : UTH GSSAPI NTLM System.Net.Sockets Verbose: 0 : [0992] 00000030 : 4C 4F 47 49 4E 0D 0A 32-35 30 2D 41 55 54 48 3D : LOGIN..250-AUTH= System.Net.Sockets Verbose: 0 : [0992] 00000040 : 4C 4F 47 49 4E 0D 0A 32-35 30 2D 54 55 52 4E 0D : LOGIN..250-TURN. System.Net.Sockets Verbose: 0 : [0992] 00000050 : 0A 32 35 30 2D 41 54 52-4E 0D 0A 32 35 30 2D 53 : .250-ATRN..250-S System.Net.Sockets Verbose: 0 : [0992] 00000060 : 49 5A 45 20 32 30 39 37-31 35 32 0D 0A 32 35 30 : IZE 2097152..250 System.Net.Sockets Verbose: 0 : [0992] 00000070 : 2D 45 54 52 4E 0D 0A 32-35 30 2D 50 49 50 45 4C : -ETRN..250-PIPEL System.Net.Sockets Verbose: 0 : [0992] 00000080 : 49 4E 49 4E 47 0D 0A 32-35 30 2D 44 53 4E 0D 0A : INING..250-DSN.. System.Net.Sockets Verbose: 0 : [0992] 00000090 : 32 35 30 2D 45 4E 48 41-4E 43 45 44 53 54 41 54 : 250-ENHANCEDSTAT System.Net.Sockets Verbose: 0 : [0992] 000000A0 : 55 53 43 4F 44 45 53 0D-0A 32 35 30 2D 38 62 69 : USCODES..250-8bi System.Net.Sockets Verbose: 0 : [0992] 000000B0 : 74 6D 69 6D 65 0D 0A 32-35 30 2D 42 49 4E 41 52 : tmime..250-BINAR System.Net.Sockets Verbose: 0 : [0992] 000000C0 : 59 4D 49 4D 45 0D 0A 32-35 30 2D 43 48 55 4E 4B : YMIME..250-CHUNK System.Net.Sockets Verbose: 0 : [0992] 000000D0 : 49 4E 47 0D 0A 32 35 30-2D 56 52 46 59 0D 0A 32 : ING..250-VRFY..2 System.Net.Sockets Verbose: 0 : [0992] 000000E0 : 35 30 20 4F 4B 0D 0A : 50 OK.. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Receive() -> 231#231 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Send() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Send System.Net.Sockets Verbose: 0 : [0992] 00000000 : 4D 41 49 4C 20 46 52 4F-4D 3A 3C 6D 65 40 6D 79 : MAIL FROM:.. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Send() -> 30#30 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Receive() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Receive System.Net.Sockets Verbose: 0 : [0992] 00000000 : 32 35 30 20 32 2E 31 2E-30 20 6D 65 40 6D 79 63 : 250 2.1.0 me@myc System.Net.Sockets Verbose: 0 : [0992] 00000010 : 6F 6D 70 61 6E 79 2E 63-6F 6D 2E 2E 2E 2E 53 65 : ompany.com....Se System.Net.Sockets Verbose: 0 : [0992] 00000020 : 6E 64 65 72 20 4F 4B 0D-0A : nder OK.. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Receive() -> 41#41 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Send() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Send System.Net.Sockets Verbose: 0 : [0992] 00000000 : 52 43 50 54 20 54 4F 3A-3C 68 69 6D 40 68 69 73 : RCPT TO:.. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Send() -> 30#30 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Receive() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Receive System.Net.Sockets Verbose: 0 : [0992] 00000000 : 35 35 30 20 35 2E 37 2E-31 20 55 6E 61 62 6C 65 : 550 5.7.1 Unable System.Net.Sockets Verbose: 0 : [0992] 00000010 : 20 74 6F 20 72 65 6C 61-79 20 66 6F 72 20 68 69 : to relay for hi System.Net.Sockets Verbose: 0 : [0992] 00000020 : 6D 40 68 69 73 63 6F 6D-70 61 6E 79 2E 63 6F 6D : m@hiscompany.com System.Net.Sockets Verbose: 0 : [0992] 00000030 : 0D 0A : .. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Receive() -> 50#50 System.Net Error: 0 : [0992] Exception in the SmtpClient#47606018::Send - Mailbox unavailable. The server response was: 5.7.1 Unable to relay for him@hiscompany.com System.Net Error: 0 : [0992] at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception) at System.Net.Mail.SmtpClient.Send(MailMessage message) System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Dispose() System.Net Verbose: 0 : [0992] Exiting SmtpClient#47606018::Send()
In this example, an exception was actually thrown. The exception basically said I don't have permission to relay through the mail server to send email.
4.11 How do I encrypt messages using s/mime or pgp? Printer Friendly
4.2 How do I authenticate to send an email? Printer Friendly
Below is an example setting the username and password.
4.3 How do I change the SMTP port number? Printer Friendly
Below is an example that changes the SMTP port to the lesser used port number 587.
static void ChangePort() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); //to change the port (default is 25), we set the port property smtp.Port = 587; smtp.Send(mail); }
Sub ChangePort() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") 'to change the port (default is 25), we set the port property smtp.Port = 587 smtp.Send(mail) End Sub 'ChangePort
4.4 How do I embed images in an email? Printer Friendly
Create a LinkedResource object. The LinkedResource will actually contain the binary data of the Image. This binary data is encoded as part of the email, and sent along as part of the MailMessage.
Give the LinkedResource a unique name, also known as a Content-Id.
Create a HTML AlternateView.
Inside that HTML text, you need to use the standard <img> tag.
For the "src" value, you need to point it at the Content-Id of the LinkedResource image. This is done by using the syntax <img src="cid:whatever"> The "src=cid:" part is required for the email client to recognize the <img> tag as an embedded image, while the "whatever" part is the actual Content-Id of the LinkedResource image. This will instruct the mail client to find an embedded image named "whatever" and display the contents *without* making a http:// request.
That's all there is to create a linked image. Below is a short but complete example that demonstrates creating an embedded image.
4.5 How do I send an email over SSL? Printer Friendly
Below you will find an example of of SMTP over SSL.
Note: Due to what I believe is a bug in System.Net.Mail you *cannot* use SSL and Credentials (username/password) at the same time. I was never able to get that to work. I always got an exception from the remote mail server. I believe it has to do with the steps System.Net.Mail takes to initiate the SSL session and SMTP authentication.
static void SSL() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //Port 587 is another SMTP port SmtpClient smtp = new SmtpClient("127.0.01", 587); smtp.EnableSsl = true; smtp.Send(mail); }
Sub SSL() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'Port 587 is another SMTP port Dim smtp As New SmtpClient("127.0.0.1", 587) smtp.EnableSsl = True smtp.Send(mail) End Sub
4.6 How do I send email asynchronously? Printer Friendly
These steps are demonstrated in the code below.
static void SendAsync() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); //specify the mail server address //the userstate can be any object. The object can be accessed in the callback method //in this example, we will just use the MailMessage object. object userState = mail; //wire up the event for when the Async send is completed smtp.SendCompleted += new SendCompletedEventHandler(SmtpClient_OnCompleted); smtp.SendAsync( mail, userState ); } public static void SmtpClient_OnCompleted(object sender, AsyncCompletedEventArgs e) { //Get the Original MailMessage object MailMessage mail= (MailMessage)e.UserState; //write out the subject string subject = mail.Subject; if (e.Cancelled) { Console.WriteLine("Send canceled for mail with subject [{0}].", subject); } if (e.Error != null) { Console.WriteLine("Error {1} occurred when sending mail [{0}] ", subject, e.Error.ToString()); } else { Console.WriteLine("Message [{0}] sent.", subject ); } }
Sub SendAsync() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") 'specify the mail server address 'the userstate can be any object. The object can be accessed in the callback method 'in this example, we will just use the MailMessage object. Dim userState As Object = mail 'wire up the event for when the Async send is completed AddHandler smtp.SendCompleted, AddressOf SmtpClient_OnCompleted smtp.SendAsync(mail, userState) End Sub 'SendAsync Public Sub SmtpClient_OnCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) 'Get the Original MailMessage object Dim mail As MailMessage = CType(e.UserState, MailMessage) 'write out the subject Dim subject As String = mail.Subject If e.Cancelled Then Console.WriteLine("Send canceled for mail with subject [{0}].", subject) End If If Not (e.Error Is Nothing) Then Console.WriteLine("Error {1} occurred when sending mail [{0}] ", subject, e.Error.ToString()) Else Console.WriteLine("Message [{0}] sent.", subject) End If End Sub 'SmtpClient_OnCompleted
4.7 How do I write to the Pickup directory? Printer Friendly
Writing email to the IIS Server's SMTP service pickup directory is another new feature of System.Net.Mail. The SMTP pickup directory is a special directory used by Microsoft's SMTP service to send email. Any email files found in that directory are processed and delivered over SMTP. If the delivery process fails, the files are stored in a queue directory for delivery at another time. If a fatal error occurs (such as a DNS resolution error), the files are moved to the Badmail directory.
By writing to the pickup directory, this speeds up the process because the entire chatting SMTP layer used for relaying is by passed. Below is an example of how to write directly to the Pickup directory.
public static void PickupDirectory() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //if we are using the IIS SMTP Service, we can write the message //directly to the PickupDirectory, and bypass the Network layer SmtpClient smtp = new SmtpClient(); smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis; smtp.Send(mail); }
Public Sub PickupDirectory() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'if we are using the IIS SMTP Service, we can write the message 'directly to the PickupDirectory, and bypass the Network layer Dim smtp As New SmtpClient() smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis smtp.Send(mail) End Sub 'PickupDirectory
4.8 How do I send a web page? Printer Friendly
public static void EmailWebPage() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; //screen scrape the html string html = ScreenScrapeHtml("http://localhost/example.htm"); mail.Body = html; mail.IsBodyHtml = true; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); } public static string ScreenScrapeHtml(string url) { WebRequest objRequest = System.Net.HttpWebRequest.Create(url); StreamReader sr = new StreamReader(objRequest.GetResponse().GetResponseStream()); string result = sr.ReadToEnd(); sr.Close(); return result; }
Public Sub EmailWebPage() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" 'screen scrape the html Dim html As String = ScreenScrapeHtml("http://localhost/example.htm") mail.Body = html mail.IsBodyHtml = True 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'EmailWebPage Public Function ScreenScrapeHtml(ByVal url As String) As String Dim objRequest As WebRequest = System.Net.HttpWebRequest.Create(url) Dim sr As New StreamReader(objRequest.GetResponse().GetResponseStream()) Dim result As String = sr.ReadToEnd() sr.Close() Return result End Function 'ScreenScrapeHtml
4.9 How do I send non US-ASCII emails? Printer Friendly
public static void NonAsciiMail() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("you@yourcompany.com"); //set the content mail.Subject = "This is an email"; //to send non-ascii content, we need to set the encoding that matches the //string characterset. //In this example we use the ISO-8859-1 characterset mail.Body = "this text has some ISO-8859-1 characters: âÒÕÇ"; mail.BodyEncoding = Encoding.GetEncoding("iso-8859-1"); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); }
Public Sub NonAsciiMail() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("you@yourcompany.com") 'set the content mail.Subject = "This is an email" 'to send non-ascii content, we need to set the encoding that matches the 'string characterset. 'In this example we use the ISO-8859-1 characterset mail.Body = "this text has some ISO-8859-1 characters: âÒÕÇ" mail.BodyEncoding = Encoding.GetEncoding("iso-8859-1") 'send the message Dim smtp As New SmtpClient("127.0.0.1") smtp.Send(mail) End Sub 'NonAsciiMail
5 Troubleshooting System.Net.Mail Printer Friendly
System.Net.Mail seems like a pretty stable class of email objects. There are a few known issues. I'm sure more will crop up over time. At the time I put this FAQ together, System.Net.Mail has been out of beta for less than 30 days. Check the forums for more ideas and help.
If you do get any exceptions, be sure to always check the inner exception for more additional information. Usually the inner exceptions will provide the additional information to solve your problem. Here's a code example for checking inner exceptions in a console application. If you want to use this code in an ASP.NET page, be sure to change Console.WriteLine(...) to Response.Write(...).
public static void InnerExceptions() { //create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("me@mycompany.com"); mail.To.Add("him@hiscompany.com"); //set the content mail.Subject = "This is an email"; mail.Body = "this is the body content of the email."; //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); try { smtp.Send(mail); } catch (Exception ex) { Exception ex2 = ex; string errorMessage = string.Empty; while (ex2 != null) { errorMessage += ex2.ToString(); ex2 = ex2.InnerException; } Console.WriteLine(errorMessage); } }
Public Shared Sub InnerExceptions() 'create the mail message Dim mail As New MailMessage() 'set the addresses mail.From = New MailAddress("me@mycompany.com") mail.To.Add("him@hiscompany.com") 'set the content mail.Subject = "This is an email" mail.Body = "this is the body content of the email." 'send the message Dim smtp As New SmtpClient("127.0.0.1") Try smtp.Send(mail) Catch ex As Exception Dim ex2 As Exception = ex Dim errorMessage As String = String.Empty While Not (ex2 Is Nothing) errorMessage += ex2.ToString() ex2 = ex2.InnerException End While Console.WriteLine(errorMessage) End Try End Sub 'InnerExceptions
5.1 Bccs are not so blind. Printer Friendly
5.2 Cannot enable SSL with a username and password. Printer Friendly
5.3 System.Net.Mail with SSL to authenticate against port 465 Printer Friendly
Sending mail using System.Net.Mail with SSL will fail:
System.Net.NetworkCredential aCred = new System.Net.NetworkCredential("myacct", "mypassword");SmtpClient smtp = new SmtpClient("smtp.mail.myserver.com", 465); smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; smtp.Credentials = aCred;
System.Net.Mail only supports "Explicit SSL".
Explicit SSL
System.Net.Mail only supports "Explicit SSL". Explicit SSL starts as unencrypted on port 25, then issues a STARTDLS and switches to an Encrypted connection. See RFC 2228.
Explicit SLL would go something like: Connect on 25 -> StartTLS (starts to encrypt) -> authenticate -> send data
If the SMTP server expects SSL/TLS connection right from the start then this will not work.
Implicit SSL
There is no way to use Implicit SSL (SMTPS) with System.Net.Mail. Implicit SSL would have the entire connection is wrapped in an SSL layer. A specific port would be used (port 465 is common). There is no formal RFC covering Implicit SSL.
Implicit SLL would go something like: Start SSL (start encryption) -> Connect -> Authenticate -> send data
6 Additional Help Printer Friendly
The following list of links are places to find additional information on System.Net.Mail
Search the Microsoft .NET Newsgroups (using google) for various System.Net.Mail keywords. MailMessage http://groups.google.as/groups?q=group%3Amicrosoft.public.dotnet.*+MailMessage&start=0&scoring=d&hl=en&lr=&safe=off&num=10& SmtpClient http://groups.google.as/groups?q=group%3Amicrosoft.public.dotnet.*+SmtpClient&start=0&scoring=d&hl=en&lr=&safe=off&num=10& AlternateView http://groups.google.as/groups?q=group%3Amicrosoft.public.dotnet.*+AlternateView&start=0&scoring=d&hl=en&lr=&safe=off&num=10&
MSDN Documentation on various System.Net.Mail classes. AlternateView http://msdn2.microsoft.com/en-us/library/ms144582(en-US,VS.80).aspx Attachment http://msdn2.microsoft.com/en-us/library/e02kz1ak(en-US,VS.80).aspx LinkedResource http://msdn2.microsoft.com/en-us/library/ms144655(en-US,VS.80).aspx MailMessage http://msdn2.microsoft.com/en-us/library/8t22a8ww(en-US,VS.80).aspx SmtpClient http://msdn2.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx