会议提醒 (.ICS) 电子邮件附件不考虑时区,即使指定了 UTC 时间
Meeting reminder (.ICS) email attachment not taking time zones into account even though UTC time specified
我们有一个 C# 控制台应用程序,可以发送本地事件的注册确认电子邮件。
我刚刚添加了将 .ICS 日历约会提醒附加到电子邮件的逻辑,指定了 UTC 时间。
当用户收到电子邮件并将约会添加到 his/her 日历时,它应该调整为本地 PC 环境的时间,但没有这样做。
例如,在我的测试中,事件发生在圣地亚哥的 11:30 AM - 1:00 PM。
当我(在中部时区)打开电子邮件附件并添加到日历时,它应该在 1:30 PM - 3:00 PM 结束,但仍在做 11:30 - 1:00下午.
我看到 http://erics-notes.blogspot.com/2013/05/fixing-ics-time-zone.html 建议添加 VTIMEZONE 块和对 DTSTART & DTEND 的时区引用(例如“DTSTART;TZID=America/Los_Angeles:20130602T130000”)
但在那个例子中他没有使用 UTC 时间。
The.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# 控制台应用程序,可以发送本地事件的注册确认电子邮件。 我刚刚添加了将 .ICS 日历约会提醒附加到电子邮件的逻辑,指定了 UTC 时间。
当用户收到电子邮件并将约会添加到 his/her 日历时,它应该调整为本地 PC 环境的时间,但没有这样做。 例如,在我的测试中,事件发生在圣地亚哥的 11:30 AM - 1:00 PM。 当我(在中部时区)打开电子邮件附件并添加到日历时,它应该在 1:30 PM - 3:00 PM 结束,但仍在做 11:30 - 1:00下午.
我看到 http://erics-notes.blogspot.com/2013/05/fixing-ics-time-zone.html 建议添加 VTIMEZONE 块和对 DTSTART & DTEND 的时区引用(例如“DTSTART;TZID=America/Los_Angeles:20130602T130000”) 但在那个例子中他没有使用 UTC 时间。
The.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