使用icalendar同步Google Calendar ; Sync Google Calendar By icalendar

  • 3176
  • 0
  • C#
  • 2013-07-28

摘要:[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標準