使用X-ALT-DESC /将HTML应用于Outlook中的日历邀请

时间:2015-07-06 20:35:34

标签: c# outlook icalendar

我是C#的初学者(和任何网络代码一样诚实)。我正在尝试发送日历邀请,当您单击公司网站上的按钮时,该邀请将被连线。这是一个典型的n层系统,使用asp.net/C#和SQL。

我们过去只是简单地生成一个用户必须知道用Outlook打开的ics,但我已经学会了如何手动编写VCALENDAR代码,以便它立即显示在Outlook中,并且整洁。

这一切都进行得相当顺利,但我现在希望日历邀请函的主体能够接受HTML,特别是附加链接。我已经尝试过AlternateViews,但似乎VCALENDAR中的“X-ALT-DESC”属性应该完全符合我的要求。但是,请尝试我可能会忽略它并使用说明。显然我缺少一些东西。

(澄清一下,除了HTML alt描述外,一切正常和编译)

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;

在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>

来自测试: 如果我离开Msg.body,它只使用了“DESCRIPTION”。 如果我把它与HTML相等,我会得到上面的结果。

谢谢!

6 个答案:

答案 0 :(得分:2)

对于未来的人: 问题是使用     .AppendLine。 简单地使用     .Append

答案 1 :(得分:2)

我发现HTML字符串必须全部在一行。如果HTML被多行分解,则不符合Vcalendar编码,并且描述要么呈现为空白页,要么呈现为纯文本,所有HTML标记都可见。

我见过其他人声称必须在&#34; X-ALT-DESC之前使用DESCRIPTION标签; FMTTYPE = text / html:&#34;。这完全是错误和错误的。如果&#34; DESCRIPTION&#34;存在,它优先,&#34; X-ALT-DESC; FMTTYPE = text / html:&#34; Outlook完全忽略该行,并呈现纯文本描述。因此,&#34; X-ALT-DESC; FMTTYPE = text / html:&#34;必须站在自己的立场上,并坚持自己的路线。

工作示例:

   ...
   X-ALT-DESC;FMTTYPE=text/html:<html><body><a href="http://bing.com">Bing</a></body></html>
   ...

错:

   ...
   DESCRIPTION;X-ALT-DESC;FMTTYPE=text/html:<html><body><a href="http://bing.com">Bing</a></body></html>
   ...

再次错了:

   ...
   X-ALT-DESC;FMTTYPE=text/html:<html>
   <body>
   <a href="http://bing.com">Bing</a>
   </body>
   </html>
   ...

答案 2 :(得分:2)

你可以在多行上使用X-ALT-DESC,你只需要在它后面的每一行的开头添加一个空格。

  

文本行不应超过75个八位字节,不包括换行符。长内容线应该使用线“折叠”技术分成多行表示。也就是说,通过插入紧接着单个线性空白字符(即SPACE或HTAB)的CRLF,可以在任意两个字符之间分割长行。处理内容类型时,忽略(即删除)任何紧接着单个线性空格字符的CRLF序列。

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

答案 3 :(得分:0)

我正在加载的ics文件没有使用大于75个八位位组的适当空间创建,如果我手动添加空间并将其加载到Ical.net.Calendar则工作正常。但是我想通过c#代码执行相同的操作,例如在加载之前处理日历文件,以避免解析错误。

答案 4 :(得分:0)

作为参考,这是https://icalendar.org/

的解释

“原始iCalendar标准仅将纯文本作为事件描述的一部分。在文本描述字段中不允许使用HTML标记,例如字体属性(粗体,下划线)和布局(div,表格)。在在Microsoft Outlook中,X-ALT-DESC参数提供了一种将HTML添加到事件描述中的方法,“ X-”字段允许用于非标准的实验性参数。 。使用HTML时,必须同时包含两个字段,以便不支持X-ALT-DESC字段的iCalendar阅读器仍可以读取文本版本。“

答案 5 :(得分:0)

...,看起来Outlook 2016对此不再提供支持。在大多数情况下,仅使用html描述生成ics文件是不可行的,因为过去的Thunderbird / Lightning无法处理这种情况,从而导致日历邀请的内容空白。

https://answers.microsoft.com/en-us/msoffice/forum/msoffice_outlook/outlook-2016-ics-description-shows-no-html/08d06cba-bfe4-4757-a052-adab64ea75a2?page=1