VS.NET 2010/2012 Users Click Here   

HOMECONTACT PRODUCTS DOWNLOADS PURCHASE TESTIMONIALS FORUMS COMPANY CONTACT
Home
Products
Downloads
Purchase
Licensing
Licensing FAQ
Software Updates
Support Forums
Testimonials
Feature Requests
Guarantee
About Us
Contact Us
Hosting Companies
Privacy Policy
   
Shopping Cart


Search
aspNetEmail

RSS feed for aspNetEmail Subscribe to category: aspNetEmail

Sending Sensitive Emails

by Dave 19. October 2010 04:22

Sometimes Lotus Notes users may want to send an email, but not allow it to be forwarded. This is a feature of Lotus Notes, and not a feature of the SMTP protocol.

To do this, Lotus Notes recognizes the Sensitivy header.  By setting the Sensitivity option to CompanyConfidential in aspNetEmail, we are able to take advantage of this feature.

Here is some example code.

EmailMessage msg = new EmailMessage( "127.0.0.1" );
msg.From = "me@example.com";
msg.To = "you@example.com";
msg.Subject = "sensitivity test";
msg.Body = "You should not be able to forward this email.";
msg.Sensitivity = MailSensitivity.CompanyConfidential;
msg.Send()

As always, if anyone has any questions or comments, please let me know.

Thanks!
Dave Wanta

Tags:

aspNetEmail

iCalendar as an Email Body

by Dave 14. October 2010 01:58

 Recently I had a request about sending an iCalendar (Meeting Request) object, as the email body itself, rather than as an attachment.(Thanks Paras!)

Background
iCalendars are special attachments that can be used to represent Meeting Requests or Appointments. By default, most mail systems like to have the iCalendar  object as an alternative body. In fact, that is how I wrote aspNetEmail to work. When you can create and add an iCalendar to the EmailMessage object, under the covers, aspNetEmail actually adds it to the internal body parts collection.

Below are 3 code examples. One example demonstrates creating a standard iCalendar enabled  email.  The 2nd example demonstrates creating email that has the iCalendar as the body. The 3rd example offers a combination of the 2.

All 3 of these examples use the following helper method called CreateiCal(…)

Create iCal creates a very simple iCalendar object, that has a meeting set tomorrow at 10am.

public iCalendar CreateiCal()
{
	iCalendar iCal = new iCalendar(); 
	iCal.ContentTransferEncoding = MailEncoding.Bit7;

	//create an start and end date, tomorrow at 10am, for 1 hr.
	DateTime tomorrow = DateTime.Now.AddDays(1);
	DateTime start = new DateTime( tomorrow.Year, tomorrow.Month, tomorrow.Day, 10,0,0);
	DateTime end = start.AddHours( 1 );

	//set some basic properties
	iCal.Event.Summary.Text = "this is a test ical"; 
	iCal.Event.Location.Text = "100 main conf room"; 
	iCal.Event.DateStart.Date = start; 
	iCal.Event.DateEnd.Date = end; 

	iCal.TimeZone.Format = TimeZoneFormat.ConvertToUTC;

	return iCal;
}

Example 1
This example demonstrates how to create a standard iCalendar enabled email. This code example will create the iCalender object, and add it to the EmailMessage object. Internally, aspNetEmail actually adds the iCalender to the internal body parts collection. The resulting email will actually have 3 body parts:

a)A Plain Text body part
b)A Html Body Part
c)An iCalendar Body Part

Here is a code example that demonstrates this behavior, along with a screenshot of the resulting email.

public void NormaliCalendar()
{
	//create a normal EmailMessage object
	//set some basic properties
	EmailMessage msg = new EmailMessage( "127.0.0.1" );
	msg.From = "me@example.com";
	msg.To = "you@example.com";
	msg.Subject = "ical test";

	//create the iCalendar object
	iCalendar iCal = CreateiCal(); 

	//add the iCalendar to the EmailMessage object
	msg.AddCalendar( iCal );

	//send it
	//msg.Send();
}

Notice that in that screenshot, we can have a nicely formatted, easily readable body. By default, aspNetEmail will create this from the properties of the iCalendar. However, the developer can over ride this behavior, and create their own friendly body.

Example 2
Some mail systems don't like to have a 3rd body part. This is typically a smaller subset, has a specialized situation. Instead, these mail systems like to have the entire body of the email actually be the iCalendar. The limitation of this is that some mail systems don't know how to interpret the email message.  This may or may not affect your situation. If you need to have the iCalendar object be the email body, the following code example demonstrates this behavior. Also, found below, is a screenshot of an email that doesn't know how to render this type of format.

public void iCalAsBody()
{
	//create a normal EmailMessage object
	//set some basic properties
	EmailMessage msg = new EmailMessage( "127.0.0.1" );
	msg.From = "me@example.com";
	msg.To = "you@example.com";
	msg.Subject = "ical test";

	//create the iCalendar object
	iCalendar iCal = CreateiCal(); 

	//set the body of the EmailMessage object itself.
	msg.ContentType = "text/Calendar;\r\n\tMethod=\"REQUEST\";";
	msg.Body = 	iCal.ToString( iCalendarType.iCal );

	//send it
	//msg.Send();

}

Notice that in this screenshot, the email is not easily reable. Also, this iCalendar appears to be missing. This is because the email client (Outlook Express in this example) doesn't know how to render an email, where the body is an iCalender.

Example 3
The 3rd example attempts to offer a combination of both Example 1 and Example 2. By adding a "name" parameter to the Content-Type value, we can get some mail clients to alternatively render the body of the email as an attachment. There really isn't an attachment, but the mail client thinks there is. This allows some mail clients to at least add the iCalendar to their calendaring system.

Below is a code example that demonstrates this, along with a screenshot of the resulting email.

public void iCalAsBodyAndAttachment()
{
	//create a normal EmailMessage object
	//set some basic properties
	EmailMessage msg = new EmailMessage( "127.0.0.1" );
	msg.From = "me@example.com";
	msg.To = "you@example.com";
	msg.Subject = "ical test";

	//create the iCalendar object
	iCalendar iCal = CreateiCal(); 

	//set the body of the EmailMessage object itself.
	//however, the additional Name parameter tricks the 
	//mail client into thinking there is an attachment
	msg.ContentType = "text/Calendar;\r\n\tMethod=\"REQUEST\";\r\n\tName=\"meeting.ics\"";
	msg.Body = 	iCal.ToString( iCalendarType.iCal );
	//send it
	//msg.Send();

}

 

Although this email isn't as pretty, by adding the "Name" parameter, it allows the mail client to present the user with an iCal that can be used.

As always, if anyone has any questions, feel free to contact me.

Thanks!
Dave Wanta

Using the ReversePath property

by Dave 13. October 2010 15:05

Today I received a request (Thanks Suraj!) about using a different email address during the SMTP process than what is seen in the email. Is this possible?

The short answer is "yes"!

aspNetEmail exposes a property called the ReversePath property. By default, this value is the FromAddress value.  The ReversePath value will be used during the SMTP process. Specifically is the value of the "MAIL FROM" command.

This is useful, because some mail servers will only allow a specific email address to be used, but you may want a different FROM value in the email seen by the end user. 

Here is a specific example.  Suppose you have a CRM application hosted by a provider that has a locked down mail server. The hosting provider may only allow email to be relayed through their mail server using a single MAIL FROM address. However, the CRM application needs to send out email from different users.  Using the ReversePath property allows this to happen.  The ReversePath property will be using as the MAIL FROM value, while the FromAddress value will be the actual value seen in the mail client. An added bonus to doing this is that all human replies can go back to the FromAddress mailbox, while NDR bounces can go back to the ReversePath mailbox.   You can then use something like ListNanny to process all of the bounces found in the ReversePath mailbox, without cluttering up someone's (FromAddress) personal mailbox.

As always, if you have any more questions about the ReversePath property, and how it works, please let me know.

Thanks!
Dave Wanta

DomainKeys and DKIM with aspNetEmail and SmarterMail

by Dave 5. October 2010 08:13

Note:This code example will only be valid until aspNetEmail v4.0 releases. Once it releases, the aspNetDkim will no longer be needed, as the DKIM and DomainKeys signing functionality will be baked into aspNetEmail.

I recently had a customer (thanks Noah!) email me and ask how to perform a DomainKeys and/or DKIM  signed mail merge against the SmarterMail queue directory.

Great Question!

It turns out its relatively easy. What you will need to do, is:

a)Tie into aspNetEmail's new Queuing namespace, that has a new SmarterMail class.
b)Tie into the new RenderEmailContents event
c)In that event, sign the message, and return the signed contents to be written to the queue folder.

Here is the code example that demonstrates this functionality.

 

private void SmarterMailTest()
{
	
	//create the EmailMessage object, and set some basic properties
	EmailMessage msg = new EmailMessage();
	msg.From = "me@mycompany.com";
	msg.AddTo( "##EmailAddress##" );
	msg.Subject = "Order Confirmation";

	//a very simple body for testing purposes
	msg.Body = "Hi ##FirstName## ##LastName##, here is your order total ##Amount##";
	
	//add the render event, so we can sign the message
	msg.RenderEmailContents += new RenderEmailContentsEventHandler( SignForSmartermail );

	//set the SmarterMail queuing			
	aspNetEmail.Queuing.SmarterMail sm = new aspNetEmail.Queuing.SmarterMail( msg );
	sm.SpoolDirectory = "c:\\temp\\";

	//GetDataTable() is a method that fetches our data, and returns a DataTable object
	DataTable dt = GetDataTable();
	sm.SendMailMerge( dt );

}
private void SignForSmartermail( object sender, RenderEmailContentsEventArgs e )
{
	string contents = e.Contents;

	//sign the contents with DomainKeys
	contents = SignDKForSmartermail( contents );
	
	//we can also sign with Dkim
	//contents = SignDkimForSmartermail( contents );

	//reset the contents
	e.Contents = contents;


}


private string SignDKForSmartermail( string contents )
{
	DomainKeys dkeys = new DomainKeys( contents );


	//parse the private rsa key that was generated by openSSL.exe
	
	//we can get it from the file
	dkeys.DKCertificate = DKCertificate.ParsePemFile( "testing\\rsa.private" );

	dkeys.Canonicalization = CanonicalizationType.Simple;

	//the dns record selector
	dkeys.Selector = "testing";
	
	//sign the email contents
	string signedContents = dkeys.SignMail();

	return signedContents;

}


private string SignDkimForSmartermail( string contents )
{
	Dkim dk = new Dkim( contents );
	
	dk.Identity = "@mycompany.com";

	//parse the private rsa key that was generated by openSSL.exe
	//we can get it from the file
	dk.DKCertificate = DKCertificate.ParsePemFile( "testing\\rsa.private" );

	dk.SendingDomain = "mycompany.com";

	//the dkim dns record selector (based upon our DNS server settings
	dk.Selector = "testing";

	dk.HeaderNamesOption = HeaderNamesOptions.AllMessageHeaders;

	//sign the email contents
	string signedContents = dk.SignMail();

	return signedContents;
}

As always, if anyone has any questions, comments, or feature requests, feel free to let me know.

Thanks!
Dave Wanta

DomainKeys and DKIM Beta Plugin Available

by Dave 4. October 2010 05:18

For those people that need to implement either DomainKeys or DKIM, I have a plug-in that is pubically available for aspNetEmail. This plug in has been in use by a number of customers over the past few years.  I’m now making it available to the public, and general users of aspNetEmail.

This functionality will be baked into aspNetEmail v4.0, and will then become part of aspNetEmail.

Currently, it’s a separate plug-in for those 3.x users.

If you would like to request a beta version of aspNetDkim, simply request it using the online comments form here.

Here’s some more information about using DomainKeys and DKIM taken directly from the Readme file

==========================
aspNetDkim
==========================
aspNetDkim supports both DomainKeys and DKIM standards for signing email. Although both of these standards are similar, and use the same basic techniques, they do produce different results.

DomainKeys (RFC link: http://rfc.net/rfc4870.html )
==========================
DomainKeys is the pre-cursor for DKIM (Domain Keys Identified Mail). Although DomainKeys does not have the flexibility of DKIM, it is still useful.

The DomainKeys standard basically takes a hash of the email, and embeds that hash as a special header at the top of the email. The hash is created using a Public and Private key pair. The recipient then verifies the hash, by using the public key of the sender.  The public key of the sender is stored in sender’s DNS server as a specially formatted TXT (text) record.


DKIM
==========================
DKIM has its history in DomainKeys, but it is basically an upgraded version, with more functionality.  Like DomainKeys, it also takes a hash of the email, and stores the hash in the header of the email.  This is based upon a Public and Private key pair.  The main differences between DomainKeys and DKIM, is that DKIM has more options for how the email content is hashed, and stored in the email header.


DNS
===========================
Both DomainKeys and DKIM depend upon a public key to be stored in a TXT DNS record. The same key can be used by both DomainKeys and DKIM.

These keys are generated (per the RFC) using the open source program called OpenSSL. OpenSSL can be downloaded from: http://www.openssl.org/


OpenSSL
==========================
Running the OpenSSL.exe will create a openssl prompt in a DOS window.

The following commands are used to generate a public and private key pair.

openssl> genrsa -out rsa.private 768

openssl> rsa -in rsa.private -out rsa.public -pubout -outform PEM

The first command generates a 768 bit key in a text file called rsa.private.

The second command takes that file (rsa.private) as input, and generates the public key in a text file called rsa.public. Both of these keys are in the PEM (Privacy Enhancement for Internet Electronic Mail)format. aspNetDkim can read these files natively, so there isn’t any need to convert to .pfx or .p12 type certificates.

See the RFC for more information on deploying the public key to the sender’s DNS server.

aspNetDkim -- DomainKeys code sample
==========================
aspNetDkim has a class called DomainKeys that is used for signing out going email using DomainKeys.

aspNetDkim has a class called Dkim that is used for signing out going email using DKIM.

*NOTE* It’s very important that the email contents are not altered, modified, or rearranged in any format, after they leave aspNetEmail. This includes added special headers to the content, or adding outgoing signatures to the body. Any changes to the email content will result in a different hash, than what was calculated by aspNetDkim, thereby breaking the DomainKeys signature. DKIM does allow limited modifications after the email is hashed. However, allowing these modifications to take place may compromise the integrity of your email.

The following is a code examples use aspNetEmail to send an email.

====================================================
  DOMAIN KEYS CODE EXAMPLE
====================================================

private static void DomainKeysTest()
{
	EmailMessage msg = new EmailMessage();
	msg.FromAddress = "dave@example.com";
	msg.FromName = "dave james";
	msg.To = "some_recipient@somecompany.com";
	msg.Subject = "this is a simple domainkeys testing message";
	msg.Body = "this is a test";

	//get the email contents from aspNetEmail
	string emailContents = msg.ToString();

	//sign the email
	string 	signedContents = SignDkim( emailContents, CanonicalizationType.Simple );

	//reset the SmtpData on the EmailMessage object
	//if the SmtpData property is set, aspNetEmail will send that data, and override any other settings
	msg.SmtpData = signedContents;

	//save to a file, just for testing purposes. We can open this file in notepad
	//or in something like Outlook Express.
	msg.SaveToFile( "c:\\temp\\" );

	//we can direct send
	//DirectSend.Send( msg );

	//use a relay server
	//however, the relay server cannot modify the content in any way, or it will break the DomainKeys signature
	//msg.Sever = "mail.mycompany.com";
	//msg.Send();

	//or write to a spool directory, such as MSPIckup
	//msg.SendToMSPickup();

}

Here is the method used for signing the email:

private static string SignDomainKeys( string emailContents, CanonicalizationType ct )
{
	DomainKeys dkim = new DomainKeys( emailContents );

	//parse the private rsa key that was generated by openSSL.exe
	//we can get it from the file
	dkim.DKCertificate = DKCertificate.ParsePemFile( "testing\\rsa.key.private" );

	dkim.SendingDomain = "test.com";

	dkim.Canonicalization = ct;
	
	//the dkim dns record selector (based upon our DNS server settings)
	dkim.Selector = "testing";

	//sign the email contents
	string signedContents = dkim.SignMail();
	
	//also, we can write the email directly to a file (as some queues will accept emails in their native RFC2822 format)
	dkim.SignMailToFile( "c:\\MyMailServer\\SomeQueue\\" );


	//this is the resulting DKIM header value. We won't do anything with it, just show it for
	//demo purposes
	string header = dkim.DomainKeysHeader();
	Console.WriteLine( header );


	return signedContents;

}

 

====================================================
  DKIM CODE EXAMPLE
====================================================

private static void DkimTest()
{

	EmailMessage msg = new EmailMessage("127.0.0.1");
	msg.FromAddress = "dave@example.com";
	msg.FromName = "dave james";
	msg.To = "some_recipient@somecompany.com";
	msg.Subject = "this is a simple Dkim  testing message";
	msg.Body = "this is a test";

	//get the email contents from aspNetEmail
	string emailContents = msg.ToString();

	//sign the email
	string signedContents = SignDkimRelaxed( emailContents );

	//reset the SmtpData on the EmailMessage object
	//if the SmtpData property is set, aspNetEmail will send that data, and override any other settings
	msg.SmtpData = signedContents;

	//save to a file, just for testing purposes. We can open this file in notepad
	//or in something like Outlook Express.
	msg.SaveToFile( "c:\\temp\\" );

	//we can direct send
	//DirectSend.Send( msg );

	//use a relay server
	//however, the relay server cannot modify the content in any way, or it will break the DKIM signature
	//msg.Sever = "mail.mycompany.com";
	//msg.Send();

	//or write to a spool directory, such as MSPIckup
	//msg.SendToMSPickup();

}

public static string SignDkimRelaxed( string contents )
{
	Dkim dk = new Dkim( contents );
	
	//parse the private rsa key that was generated by openSSL.exe
	//we can get it from the file
	dk.DKCertificate = DKCertificate.ParsePemFile( "testing\\rsa.key.private" );

	//relaxed headers
	dk.HeaderCanonicalization = CanonicalizationType.Relaxed;
	dk.BodyCanonicalization = CanonicalizationType.Relaxed;
	
	//the dkim dns record selector (based upon our DNS server settings)
	dk.Selector = "testing";


	//sign the email contents
	string signedContents = dk.SignMail();
	
	//we can optionally save to a file, if we want to inspect it
	dk.SignMailToFile( "c:\\temp\\" );
	
	//return the singed contents
	return signedContents;
}

Again, if you would like to request a beta version of aspNetDkim, simply request it using the online comments form here.

As always, I apprecate any feedback. If you have any, feel free to share.

Thanks!
Dave Wanta 

New aspNetEmail Build Update for 2010 Oct 04

by Dave 4. October 2010 03:29

I just wanted to post an update, to let everyone know that there has been a build update to aspNetEmail. It’s been a while since I’ve pushed one to the website. You can download the latest build update from.
http://www.advancedintellect.com/page/buildupdates.aspx

Some of the fixes, feature requests, and changes that made it into this push include:

Some of the major changes include:
1) An update to the internal Australian Timezone properties. This fixes a DST timezone issue.

2) I added some internal code to increase the speed of the SMTP response code checking.

3) The HtmlUtility class will better parse some invalid HTML tags, that have some improperly formatted attributes.

4)Increased the flexibility of the internal email address parser to catch some edge cases with unusually formatted addresses.

5)Exposed the InvalidPathChars property, for better control over file names. This property builds upon the underlying framework, and gives the developer better control.

6)I exposed the Sender header property. There was a word-around for this, but now the Sender header is official. This property does not break the work-around that customers are using.

7) Fixed a bug in the ForwardReplyEmail class.

There were some additional additions made. You can view the change history log in detail at
http://advancedintellect.com/page/ChangeLogaspNetEmail.aspx

As always, if you have any questions, comments, or  feature requests, I’d love to hear them.

Feel free to contact me using the Contact Us form here:
http://advancedintellect.com/contactus.aspx

Thanks!
Dave Wanta

 

Tags:

aspNetEmail

Cancel or Update Metting Requests

by Dave 1. October 2010 09:36

One question I often receive about meeting requests is how to update or cancel them.

Can this be done with aspNetEmail?

The short answer is YES! However, there is one small gotcha, you need to keep track of the unique id of the meeting request.

According to the iCalendar specifications, each meeting request needs to have a unique id. By default, aspNetEmail uses a Guid.  aspNetEmail also allows you to over ride this unique id. Whether you create your own, or use aspNetEmail’s, you must keep track of this unique id.

Once you have the unique id of the originally sent iCalendar, you can update or cancel the request at any time in the future. 

==============================
Updating an iCalendar
==============================
To update a meeting request you will need to do 2 things:
 
UniqueId:
1) Use the same UniqueId as the original. By default, aspNetEmail simply uses a guid for a UniqueId. If you want to, you can just create your own guid, and then record it for later use. For example:
 
   string uniqueId = Guid.NewGuid().ToString().Replace( "-", string.Empty );
   ical.Event.UniqueId.Value = uniqueId;

 
Then, just store the uniqueId for any future updates.
 
Sequence number
2)Youo must also increment the sequence number by 1.
 
The newer version of aspNetEmail's iCalendar class  has a Sequence property, so you can simply increment it like:
 
ical.Event.Sequence.Index++;
or
ical.Event.Sequence.Index = 1;
or
ical.Event.Sequence.Index = 2;

(depending upon how many updates you have issued)


=================================
CANCEL an iCalender
=================================
To cancel a meeting request, you will again need to do 2 things.
 
1) You will need to still use the original UniqueId value (just like above)
 
2)You will need to change the Method of the iCal to CANCEL. Here is what the code looks like:
 
First Request
==================
string uid = Guid.NewGuid().ToString();
iCalendar ical = new iCalendar();
ical.Event.UniqueId.Value = uid;
//set other properties, add attendees, set organizer...
ical...
EmailMessage m = new EmailMessage();
m.AddCalendar( ical );
m....
m.Send();
 

Cancelled request
=================
//reset the uid
iCalendar ical2 = new iCalendar();
ical2.Event.UniqueId.Value = uid;
 
//change the method to CANCEL
ical2.Method.Value = "CANCEL";

All Day Events in an iCalendar

by Dave 1. October 2010 09:06

By default, the RFC standard for the iCalendar specification does not support all day events.

However, both Outlook and Lotus Notes support this capability. Both do it a bit differently.

Below is a code example of how to use the iCalendar functionality of aspNetEmail to create all day events in both Lotus Notes and Outlook. 

static void AllDayEvent()
{
	//create the email message object
	EmailMessage m = new EmailMessage( "192.168.1.106" );
	m.From = "me@example.com";
	m.To = "you@blah.com";
	
	//create an all day event for next week
	DateTime eventDay = DateTime.Now.AddDays(7);

	m.Subject = "all day event for " + eventDay.ToShortDateString();

	//uncomment to create an iCal for Lotus Notes
	//iCalendar iCal= AllDayEventForLotus( eventDay );

	//create an iCal for Outlook
	iCalendar iCal = AllDayEventForOutlook( eventDay );

	//set some event properties
	//set the properties
	iCal.Event.Summary.Text = "Sales Meeting"; 
	iCal.Event.Location.Text = "100 main conf room"; 


	//when we add it to the EmailMessage object, all EmailMessage recipients will
	//be added to the iCalendar *if* the iCalendar does not have any recipients
	//if we wanted to add additional attendees we could use
	//ic.Event.Attendees.Add( ... )
	m.AddCalendar(iCal); 

	m.Logging = true;
	m.LogPath = "c:\\email.log";
	m.LogOverwrite = true;

	m.SaveToFile( "c:\\temp\\" );
	m.Send();


}
static iCalendar AllDayEventForLotus(DateTime eventDay)
{
	iCalendar iCal = new iCalendar(); 

	DateTime start = new DateTime( eventDay.Year, eventDay.Year, eventDay.Day, 4, 0, 0 );
	DateTime end = new DateTime( eventDay.Year, eventDay.Year, eventDay.Day, 20, 0, 0 );

	iCal.Event.DateStart.Date = start;
	iCal.Event.DateEnd.Date = end;
	iCal.Event.Priority.PriorityType = PriorityType.Normal; 

	return iCal;
}

static iCalendar AllDayEventForOutlook( DateTime eventDay)
{
	DateTime dayStart = eventDay;
	DateTime dayEnd = eventDay.AddDays( 1 );

	iCalendar iCal = new iCalendar(); 

	iCal.TimeZone.Format = TimeZoneFormat.SuppressTimeZoneRules;

	iCal.Event.DateStart.AddParameter( "VALUE", "DATE:" + dayStart.ToString("yyyyMMdd")  );
	iCal.Event.DateEnd.AddParameter( "VALUE", "DATE:" + dayEnd.ToString( "yyyyMMdd" ) );
	iCal.Event.TimeTransparency.TransparencyType = TransparencyType.Transparent; 

	iCal.Event.Priority.PriorityType = PriorityType.Normal; 

	//set various Outlook X-Headers, so Outlook will recognize it as an All Day Event.
	iCal.Event.Properties.Add( new CustomCalendarProperty( "X-MICROSOFT-CDO-BUSYSTATUS", "FREE" ) );
	iCal.Event.Properties.Add( new CustomCalendarProperty( "X-MICROSOFT-CDO-INSTTYPE", "0" ) );
	iCal.Event.Properties.Add( new CustomCalendarProperty( "X-MICROSOFT-CDO-INTENDEDSTATUS", "FREE" ) );
	iCal.Event.Properties.Add( new CustomCalendarProperty( "X-MICROSOFT-CDO-ALLDAYEVENT", "TRUE" ) );

	return iCal;
}

 

 

Testimonial

That [aspNetEmail] worked like a charm. :-) "

S. J. Arngrimsson | Atom

Read more testimonials
ListNanny aspNetDNS aspNetEmail aspNetPOP3 aspNetMX IPMuncher aspNetMIME aspNetPING aspNetTraceRoute aspNetIMAP aspNetMHT