c# - session 提醒 (.ICS) 电子邮件附件不考虑时区,即使指定了 UTC 时间

标签 c# email icalendar reminders

我们有一个 C# 控制台应用程序,可以为本地事件发送注册确认电子邮件。 我刚刚添加了逻辑以将 .ICS 日历约会提醒附加到电子邮件,指定 UTC 时间。

当用户收到电子邮件并将约会添加到他/她的日历时,它应该调整为本地 PC 环境的时间,但实际上并没有这样做。 例如,在我的测试中,事件发生在圣地亚哥的上午 11:30 - 下午 1:00。 当我(在中部时区)打开电子邮件附件并添加到日历时,它应该在下午 1:30 - 3:00 结束,但仍在 11:30 - 1:00 结束。

我看过http://erics-notes.blogspot.com/2013/05/fixing-ics-time-zone.html建议添加一个 VTIMEZONE block 和对 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");
    }

最佳答案

您需要在 VEVENT 之前指定您将使用 UTC 时间:

TZ:+00 

BEGIN:VEVENT

关于c# - session 提醒 (.ICS) 电子邮件附件不考虑时区,即使指定了 UTC 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45176448/

相关文章:

c# - 当后台有大量代码时,如何让表单刷新?

c# - 正则表达式分割换行符 - 在匹配结束时保留捕获的换行符

python-3.x - Airflow : wait to receive email and process data contained in attached file

c++ - 如何使用 MAPI 发送邮件?

java - 使用 java 编写 .ics iCal 文件

c# - TDD 中的命名测试与单元测试命名

c# - 使用 Dapper 将字符串映射到 guid

python - 电子邮件标题中的顺序重要吗?

vb.net - 如何以编程方式创建 .ics 文件?

java - 某些 Outlook 客户端中的 ical 事件延迟显示 2 小时