我需要向网络应用程序的用户发送提醒。
为此,我使用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);
答案 0 :(得分:3)
HTML格式不是icalendar规范的一部分,因此应用程序可以通过非标准属性字段添加对此的支持,这些字段用X-
前缀指定。 (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支持/允许的内容。上面的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
来电。)