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

问题描述:

我需要发送提醒给Web应用程序的用户。如何使用ical.net创建HTML格式的ICS消息主体?

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

是否可以将事件描述格式化为html,并使其可以在Outlook办公室客户端和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); 
+0

只是一种猜测,但会发生什么,如果你的HTMLEncode的事件描述? – Crowcoder

HTML格式不是的iCalendar规范的一部分,所以它的应用程序通过非标准属性字段,它被指定与添加这种支持前缀为X-。 (Further reading on non-standard properties如果你有兴趣。)

谷歌日历

它看起来并不像谷歌日历对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

可惜你不能相当CalendarProperty系列化为此在ical.net due a bug,但解决办法是只有一行。

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电话。)

+0

非常感谢您的回答。 – Barax

+0

在Outlook 2016上,这是正确的替代操作 X-ALT-DESC; FMTTYPE = text/html – Barax

+1

是:'serialized.Replace(“X-ALT-DESC:FMTTYPE = text/html”,“X-ALT- DESC; FMTTYPE = text/html的“);' – rianjs