Search code examples
c#outlookicalendar

Using X-ALT-DESC / Applying HTML to calendar invites in Outlook


I'm a beginner in C# (and any networking code to be honest). I'm trying to send a calendar invite, that will be wired when you click a button on the company's website. This is a typical n-tier system, using asp.net/C# and SQL.

We used to simply generate an ics that the user would then have to know to open with Outlook, but I've since learned how to manually code a VCALENDAR so it shows up right away in Outlook nice and neat.

It's all been going fairly smoothly, but I would now like the body of the calendar invite to be able to accept HTML, to attach links in particular. I've experimented with AlternateViews, but it seems that the "X-ALT-DESC" attribute inside of VCALENDAR should do exactly what I want. However, try as I may Outlook ignores it and uses the description. There is clearly something I am missing.

(To clarify, everything works & compiles, except for the HTML alt description)

private Guid? CreateEmail()
{

        Guid eventGuid = Guid.NewGuid();

        MailMessage msg = new MailMessage();
        msg.IsBodyHtml = true;
        msg.From = new MailAddress("fromemail", "From Name");
        msg.To.Add(toEmail);
        msg.Subject = subject;

        StringBuilder s = new StringBuilder();
        s.AppendLine("BEGIN:VCALENDAR");
        s.AppendLine("VERSION:2.0");
        s.AppendLine("PRODID:-//My Product//Outlook MIMEDIR//EN");
        s.AppendLine("METHOD:" + method); //In this case, "REQUEST"
        s.AppendLine("STATUS:" + status.status);  //"CONFIRMED"
        s.AppendLine("BEGIN:VEVENT");
        s.AppendLine("UID:" + eventGuid.ToString()); 
        s.AppendLine("PRIORITY" + status.priority); //3
        s.AppendLine("X-MICROSOFT-CDO-BUSYSTATUS:" + ShowAs.ToString()); //"BUSY"
        s.AppendLine("SEQUENCE:" + UpdateNumber);//0
        s.AppendLine("DTSTAMP:" + DateTime.Now.ToUniversalTime().ToString());
        s.AppendLine("DTSTART:" + DateTimetoCalTime(startTime));  
        s.AppendLine("DTEND:" + DateTimetoCalTime(endTime));
        s.AppendLine("SUMMARY:" + subject);
        s.AppendLine("LOCATION: " + location);
        s.AppendLine("DESCRIPTION: " + "Plain simple description"

 string html_begin = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">" +
            "\n<html>" +
            "\n<head>" +
            "\n<title></title>" +
            "\n</head>" +
            "\n<body>" +
            "\n<!-- Converted from text/rtf format -->\n\n<P DIR=LTR><SPAN LANG=\"en-us\">" +
            "\n<Font face=\"Times New Roman\"";

        body = "I simply <b> want some bold </b> here 555";

        string html_end = "</font></span></body>\n</html>";
        string html_body = html_begin + body + html_end;

        msg.Body = html_body;
        s.AppendLine("X-ALT-DESC;FMTTYPE=text/html:" + html_body);

        msg.Body = html_body;
        s.AppendLine("X-ALT_DESC;FMTTYPE=text/html:" + html_body);

        s.AppendLine("STATUS:" + status.status); //"CONFIRMED"
        s.AppendLine("BEGIN:VALARM");
        s.AppendLine("TRIGGER:-PT1440M");
        s.AppendLine("ACTION:Accept");
        s.AppendLine("DESCRIPTION:Reminder");
        s.AppendLine("END:VALARM");

        s.AppendLine("END:VEVENT");

        s.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", msg.To[0].DisplayName, msg.To[0].Address));
        s.AppendLine("END:VCALENDAR");

        System.Net.Mime.ContentType type = new System.Net.Mime.ContentType("text/calendar");
        type.Parameters.Add("method", method);
        type.Parameters.Add("name", "meeting.ics");
        msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(s.ToString(), type));

SMTP.send(msg);
return EventGuid;

Produces this body in outlook:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 3.2//EN”>
<html>
<head>
<title></title>
</head>
<body>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG=”en-us”>
<Font face=”Times New Roman”I simply <b> want some bold </b> here 555</font></span></body>
</html>

From testing: If I leave Msg.body out, it just used the "DESCRIPTION". If I make it equal the HTML, I get the above result.

Thank You!


Solution

  • You can have X-ALT-DESC on multiple lines, you just need to add a space on the beginning of each lines following it.

    Lines of text SHOULD NOT be longer than 75 octets, excluding the line break. Long content lines SHOULD be split into a multiple line representations using a line "folding" technique. That is, a long line can be split between any two characters by inserting a CRLF immediately followed by a single linear white-space character (i.e., SPACE or HTAB). Any sequence of CRLF followed immediately by a single linear white-space character is ignored (i.e., removed) when processing the content type.

    https://icalendar.org/iCalendar-RFC-5545/3-1-content-lines.html