I do quite a lot of work on Intranets, on which the only browser in use is Microsoft Internet Explorer. This often means that IE-specific tricks can be used safely on the Intranet. This specific trick is for using IE with Outlook.

read on MSDN about how to include line breaks in the body of an email created via a mailto: link, when opening the mailto using Outlook Express (and Outlook).

However, this was causing some problems for users with IE5.0. Turns out there’s a problem in IE 5.0 with this approach. IE 5.0 doesn’t correctly translate these line breaks into Outlook.

The solution, for IE5, is to qualify your carriage returns or line feeds with the %25 escape character, thus:

<A HREF="mailto:email1;email2&cc=email3?subject=My%20Subject&body=Line1%250DLine2"> Click Here To Invoke Mail </A>

But there’s a snag. IE5.5 fixes the problem, and moreover the escaping no longer works. So whilst the code above will make IE5 happy, IE5.5 or later will complain.

Although it’s not mentioned in the MSDN documents, I also found a problem when passing an encoded ampersand in a mailto: link. The solution is the same – prepend %25 for IE5.0, don’t prepend it anywhere else.

The solution, therefore, is to check which version of IE you are using in advance, and set the breaks accordingly. I used some code adapted from the Ultimate Javascript Client Sniffer:


// get the user agent (lowercase to make comparisons easier)
var agt = navigator.userAgent.toLowerCase();
// Note: On IE5, these return 4, so use is_ie5up to detect IE5.
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);
var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie3 = (is_ie && (is_major < 4));
var is_ie4 = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
var is_ie4up = (is_ie && (is_major >= 4));
var is_ie5 = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
var is_ie5_5 = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
var is_ie6 = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
var is_ie6up = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);

if (is_ie5_5 || is_ie6up) {
var EncodedLineBreak = "%0D";
var EncodedLineFeed = "%0A";
var EncodedAmpersand = "%26";
} else {
var EncodedLineBreak = "%250D";
var EncodedLineFeed = "%250A";
var EncodedAmpersand = "%2526";
}

Note: This approach hasn’t been tested with IE4 or earlier, or with IE7, or Outlook Express. It’s been tried successfully with IE5, IE5.5, and IE6, alongside Outlook 2002.