Вложение электронной почты с напоминанием о встрече (.ICS) без учета часовых поясов, даже если указано время UTC

У нас есть консольное приложение C #, которое отправляет электронные письма с подтверждением регистрации для локальных событий. Я просто добавил логику, чтобы прикрепить к электронному письму напоминание о встрече в календаре .ICS, указав время в формате UTC.

Когда пользователь получает электронное письмо и добавляет встречу в свой календарь, она должна соответствовать времени локальной среды ПК, но не делает этого. Например, в моем тесте мероприятие проводится с 11:30 до 13:00 в Сан-Диего. Когда я (в центральном часовом поясе) открываю вложение электронной почты и добавляю в календарь, оно должно появиться как 13:30 - 15:00, но все еще 11:30 - 13:00.

Я видел http://erics-notes.blogspot.com/2013/05/fixing-ics-time-zone.html советует добавить блок VTIMEZONE и ссылку на часовой пояс для DTSTART и DTEND (например, «DTSTART; TZID = America / Los_Angeles: 20130602T130000»), но в этом примере он не использует время UTC.

Прикрепленный файл .ICS содержит это; извините за лишние разрывы строк, но когда их нет, он запускает все вместе. Обратите внимание на указанное универсальное время DTSTART & DTEND «Z»:

BEGIN:VCALENDAR

PRODID:-//Save to my Calendar

VERSION:2.0

METHOD:PUBLISH

BEGIN:VEVENT

DTSTART:20170622T163000Z

DTEND:20170622T180000Z

DTSTAMP:20170718T134127Z

UID:6f59cf3b-99b5-4935-8f7c-3cb4c2e7a53f

CREATED:20170718T134127Z

LAST-MODIFIED:20170718T134127Z

X-ALT-DESC;FMTTYPE=text/html:<a href="http://mycompany.net/Events/12345">Party<a>
DESCRIPTION:mycompany.net/Events/12345
LOCATION:Restaurant name, 123 Elm, San Diego CA

SEQUENCE:0

STATUS:CONFIRMED

SUMMARY:My company’s event

END:VEVENT

END:VCALENDAR

Я ценю любой совет ... спасибо!

Мой код ... довольно ничем не примечательный, но обратите внимание, что я конвертирую время начала и окончания в UTC:

    private static Attachment CreateEventCalendarReminder(DataRow dr)
    {
        var sb = new StringBuilder();
        string nowUTCString = DateTime.Now.ToUniversalTime().ToString("yyyyMMddTHHmmssZ");

        sb.AppendLine("BEGIN:VCALENDAR");
        sb.AppendLine("PRODID:-//Save to my Calendar");
        sb.AppendLine("VERSION:2.0");
        sb.AppendLine("METHOD:PUBLISH");             
        //sb.AppendLine("TZ:+00");

        sb.AppendLine("BEGIN:VEVENT");
        sb.AppendLine("DTSTART:" + DateTime.Parse(dr["StartDate"].ToString()).ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));
        sb.AppendLine("DTEND:" + DateTime.Parse(dr["EndDate"].ToString()).ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));
        sb.AppendLine("DTSTAMP:" + nowUTCString);
        sb.AppendLine("UID:" + Guid.NewGuid());
        sb.AppendLine("CREATED:" + nowUTCString);
        sb.AppendLine("LAST-MODIFIED:" + nowUTCString);


        sb.AppendLine("X-ALT-DESC;FMTTYPE=text/html:"
                + "Thank you for registering for our event. Click "
                + (string)dr["EventDescHyperlink"]
                + " DetermineWhichEmailsToSend view the event details. We look forward to seeing you Attachment the EventArgs and appreciate your support.");

        sb.AppendLine("DESCRIPTION:" + (string)dr["EventDescURL"]);
        sb.AppendLine("LOCATION:" + (string)dr["VenueCombinedInfo"]);

        sb.AppendLine("SEQUENCE:0");
        sb.AppendLine("STATUS:CONFIRMED");
        sb.AppendLine("SUMMARY:" + "My Company" + (string)dr["OfficeName"] + " Event");
        sb.AppendLine("END:VEVENT");
        sb.AppendLine("END:VCALENDAR");

        var calendarBytes = Encoding.UTF8.GetBytes(sb.ToString());
        MemoryStream ms = new MemoryStream(calendarBytes);
        return new System.Net.Mail.Attachment(ms, "EventReminder.ics", "text/calendar");
    }

person Amorphous Blob    schedule 18.07.2017    source источник


Ответы (1)


Вам необходимо указать перед VEVENT, что вы будете использовать время UTC:

TZ:+00 

BEGIN:VEVENT
person Alexander Higgins    schedule 18.07.2017