如何使用 ical.net 创建 HTML 格式的 ICS 消息正文?

How do I create an HTML-formatted ICS message body using ical.net?

我需要向 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);

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

Google 日历

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 supports/allows。上面的 HTML 块是使用 Outlook 2013 生成的。我已经成功地使用了那个块,并且 运行 通过与 ical.net 的序列化往返成功地使用了它,Outlook 毫不费力地打开了它。

ical.net

不幸的是,您不能 完全 在 ical.net due a bug 中使用 CalendarProperty 序列化执行此操作,但解决方法只是一行。

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 调用。)