摘要:[C#]使用icalendar同步Google Calendar
iCalendar是一個類似於 xml , json 的資料交換格式 , 它允許用戶透過電子郵件發送會議請求
而目前google calendar , live calendar , outlook 等廠商都支援 ,
當我們透過電子郵件發出一個會議或者活動的邀請時,接收人會收到一封電子郵件(如下圖,以gmail為例),
當使用者確認後就會加入到自己的行事曆
//以下程式碼將會寄送一封活動的邀請信到gmail
MailMessage msg = new MailMessage("Account@gmail.com", "Account6@gmail.com", "test", "test");
msg = GetCalanderInviteMsg3(msg);
SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
smtp.Credentials = new NetworkCredential("Account", "password");
smtp.EnableSsl = true;
smtp.Send(msg);
public static MailMessage GetCalanderInviteMsg3(MailMessage msg){
StringBuilder sb = new StringBuilder();
sb.AppendLine("BEGIN:VCALENDAR");
sb.AppendLine("PRODID:-//Google Inc//Google Calendar 70.9054//EN");
sb.AppendLine("VERSION:2.0");
sb.AppendLine("METHOD:REQUEST");
sb.AppendLine("BEGIN:VEVENT");
sb.AppendLine("DTSTART:20130227T040705Z");
sb.AppendLine("DTEND:20130227T040705Z");
sb.AppendLine("DTSTAMP:20130127T040705Z");
sb.AppendLine("UID:" + Guid.NewGuid());
sb.AppendLine("CREATED:20130624T082605Z");
sb.AppendLine("DESCRIPTION:");
sb.AppendLine("LOCATION:");
sb.AppendLine("END:VEVENT");
sb.AppendLine("END:VCALENDAR");
//content type 必須設定成 text/calendar
System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType("text/calendar");
ct.Parameters.Add("method", "REQUEST");
AlternateView avCal = AlternateView.CreateAlternateViewFromString(sb.ToString(), ct);
msg.AlternateViews.Add(avCal);
return msg;
}
Icalendar Format (上面的程式碼將會包含下面的資訊)
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20130227T040705Z
DTEND:20130227T040705Z
DTSTAMP:20130127T040705Z
UID:c6cf1c22-01a9-40e4-ba9f-d42790cc5d83
CREATED:20130624T082605Z
DESCRIPTION:
LOCATION:
END:VEVENT
END:VCALENDAR
上面只包含了一個事件,事件的資訊將被包含在 BEGIN:VEVENT 和 END:VEVENT 裡面 , 因此這個標籤可以有多個 ,
並且包含在 BEGIN:VCALENDAR 和 END:VCALENDAR 標籤裡面
p.s 若要透過這個方式寄送一封含有多個事件的邀請 , 將會無法成功 , 使用者收到的信件仍然只會看到一封邀請,就算按下參加,
加入的行事曆仍然只有會一個事件,因此若要實作加入多個事件的方式,google calendar可以藉由其calendar API達到要求,而Outlook
可以透過將method改成publish來達到類似要求
其屬性規範可以參考RFC2445標準