【问题标题】:How do I create an HTML-formatted ICS message body using ical.net?如何使用 ical.net 创建 HTML 格式的 ICS 消息正文?
【发布时间】:2017-05-09 08:43:08
【问题描述】:

我需要向 Web 应用程序的用户发送提醒。

为此,我使用 nuget 包中的 iCal.Net。按照使用说明,我可以发送一封电子邮件,其中包含 ics 文件的附件。

是否可以将事件描述格式化为 html 并使其同时在 Outlook Office 客户端和 Chrome 日历上运行?

在这些客户端上,我看到带有所有 html 标记的纯文本表示。我还在 Windows 10 日历上进行了测试,其中事件描述正确显示为 html。我需要设置更多内容吗?

这是我的日历字符串生成

var now = DateTime.Now;
var later = scadenza.Value;

var e = new Event
{
    DtStart = new CalDateTime(later),
    DtEnd = new CalDateTime(later),
    Description = mailText,
    IsAllDay = true,
    Created = new CalDateTime(DateTime.Now),
    Summary = $"Reminder for XYZ",

};

var attendee = new Attendee
{
    CommonName = "…..",
    Rsvp = true,
    Value = new Uri("mailto:" + ConfigurationManager.AppSettings["ReminderReceiver"])
};
e.    Attendees = new List<IAttendee> { attendee };

var calendar = new Calendar();
calendar.Events.Add(e);

var serializer = new CalendarSerializer(new SerializationContext());
var icalString = serializer.SerializeToString(calendar);

【问题讨论】:

  • 只是一个猜测,但是如果您对事件描述进行 HtmlEncode 会发生什么?

标签: outlook google-calendar-api icalendar rfc5545 ical-dotnet


【解决方案1】:

HTML 格式不是 icalendar 规范的一部分,因此应用程序可以通过使用 X- 前缀指定的非标准属性字段来添加对此的支持。 (Further reading on non-standard properties 如果你有兴趣。)

谷歌日历

Google 日历似乎不支持 HTML 格式的事件,所以我认为你不走运。

展望

Outlook 使用许多 X- 字段来处理各种事情;对于 HTML 格式的描述,它使用X-ALT-DESC 并像这样指定FMTTYPE=text/html

X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//E
    N">\n<HTML>\n<HEAD>\n<META NAME="Generator" CONTENT="MS Exchange Server ve
    rsion rmj.rmm.rup.rpr">\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n<!-- Converted 
    from text/rtf format -->\n\n<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Cali
    bri">This is some</FONT></SPAN><SPAN LANG="en-us"><B> <FONT FACE="Calibri"
    >HTML</FONT></B></SPAN><SPAN LANG="en-us"><FONT FACE="Calibri"></FONT></SP
    AN><SPAN LANG="en-us"><U> <FONT FACE="Calibri">formatted</FONT></U></SPAN>
    <SPAN LANG="en-us"><FONT FACE="Calibri"></FONT></SPAN><SPAN LANG="en-us"><
    I> <FONT FACE="Calibri">text</FONT></I></SPAN><SPAN LANG="en-us"><FONT FAC
    E="Calibri">.</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>\n\n</BODY>\n</HT
    ML>

您可能能够摆脱更简单的 HTML,您必须进行测试以查看 Outlook 支持/允许的内容。上面的 HTML 块是使用 Outlook 2013 生成的。我已成功使用该块并通过 ical.net 的序列化往返运行它,Outlook 毫不费力地打开它。

ical.net

不幸的是,您不能完全在 ical.net due a bugCalendarProperty 序列化中做到这一点,但解决方法只有一行。

const string formatted = //the text block from above starting with FMTTYPE=text/html:

var start = DateTime.Now;
var end = start.AddHours(1);
var @event = new Event
{
    Start = new CalDateTime(start),
    End = new CalDateTime(end),
    Description = "This is a description",
};
var property = new CalendarProperty("X-ALT-DESC", formatted);
@event.AddProperty(property);
var calendar = new Calendar();
calendar.Events.Add(@event);

var serialized = new CalendarSerializer().SerializeToString(calendar);

//Workaround for the bug:
serialized = serialized.Replace("X-ALT-DESC:FMTTYPE=text/html", "X-ALT-DESC;FMTTYPE=text/html");

这将产生 HTML 格式的 Outlook 日历事件。

(当我修复错误时,我将更新此答案以删除 string.Replace 调用。)

【讨论】:

  • 在 Outlook 2016 上,这是操作 X-ALT-DESC 的正确替换;FMTTYPE=text/html
  • 是:serialized.Replace("X-ALT-DESC:FMTTYPE=text/html", "X-ALT-DESC;FMTTYPE=text/html");
  • 尝试像这样设置属性:var property = new CalendarProperty("X-ALT-DESC;FMTTYPE=text/html", formatted );formatted 应该从 &lt;!DOCTYPE ... 开始。这应该会使解决方法过时。
猜你喜欢
  • 2023-02-25
  • 2018-02-12
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2019-06-10
  • 2011-09-24
相关资源
最近更新 更多