Как создать тело сообщения ICS в формате HTML с помощью ical.net?

Мне нужно отправить напоминание пользователям веб-приложения.

Для этого я использую iCal.Net из пакетов nuget. Следуя инструкциям по использованию, я могу отправить электронное письмо с приложением, содержащим файл ics.

Можно ли отформатировать описание события в формате html и заставить его работать как на клиенте Office 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);

1 ответ

Решение

Форматирование HTML не является частью спецификации icalendar, поэтому приложения должны добавить поддержку для этого через нестандартные поля свойств, которые обозначены X- префикс. ( Дальнейшее чтение нестандартных свойств, если вам интересно.)

Гугл календарь

Похоже, что в календаре 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 из-за ошибки с 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");

Это создаст события календаря Outlook в формате HTML.

(Когда я исправлю ошибку, я обновлю этот ответ, чтобы удалить string.Replace вызов.)

Другие вопросы по тегам