如何使用iCal.net创建HTML形式的ICS消息主体



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

为此,我使用了Nuget软件包中的ial.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规格的一部分,因此,通过非标准属性字段来添加对此的支持,该应用程序用X-前缀指定。(如果您有兴趣,请进一步阅读非标准属性。)

Google日历

看来Google日历对HTML格式的事件有任何支持,所以我认为您在那里不幸。

Outlook

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 -->nn<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>nn</BODY>n</HT
    ML>

您也许可以使用更简单的HTML逃脱,您必须测试以查看Outlook的支持/允许。上面的HTML块是使用Outlook 2013生成的。我已经成功地使用了该块并通过iCal.net的序列化往返行程运行,并且Outlook在没有任何大惊小怪的情况下打开它。

ical.net

不幸的是,由于CalendarProperty序列化的错误,您不能完全在iCal.net中执行此操作,但是解决方法只是一行。

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

最新更新