Outlook ical exporter

Description

L'API .NET d'Outlook fournit une méthode standard "ForwardAsVCal" qui transmet un mail avec en pièce jointe un fichier ics qui par contre ne contient pas l'élément CATEGORIES de la spécication ical v2.0 des VEVENT

Cette Source fait un upload du calendrier et des tâches outlook de l'odrinateur local vers le serveur FTP de votre choix. Il y a un fichier *.ics par categorie Outlook ou * est le nom de la categorie.

<i>The .NET Outlook API does provide a standard method ForwardAsVcal which does send a mail with attached ics file that perhaps does not contains CATEGORIES component in VEVENT ITEMS

This source does an upload of the main local computer outlook calendar as well as todo tasks. There is one *.ics upload per Outlook Category where * is the category name.
</i>

Source / Exemple :


 Imports Microsoft.Office.Interop.Outlook Imports System.IO Imports System.Text Imports System.Array Imports CalExporter.FTPclient Module CalItem     Sub Main()         Dim objOL As Object         Dim s As New OutlookAddIn.GetApplication         objOL = s.GetApplicationObject()         Dim MyNameSpace As Microsoft.Office.Interop.Outlook.NameSpace         MyNameSpace = objOL.GetNameSpace("MAPI")         Dim cats As Microsoft.Office.Interop.Outlook.Categories         cats = MyNameSpace.Categories         If (cats.Count > 1) Then             For Each cat As Microsoft.Office.Interop.Outlook.Category In cats                 CatOutPut(MyNameSpace, cat)             Next         End If     End Sub     Sub CatOutPut(ByRef MyNameSpace As Microsoft.Office.Interop.Outlook.NameSpace, ByVal category As Microsoft.Office.Interop.Outlook.Category)         Dim out As String         out = "BEGIN:VCALENDAR" & Chr(10)         out += "PRODID:-//hacksw/handcal//NONSGML v1.0//EN" & Chr(10)         out += "VERSION:2.0" & Chr(10)         Dim myFolder As Object         myFolder = MyNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar)         Dim myTaskFolder As Object         myTaskFolder = MyNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderTasks)         Dim myTaskItems As Object         myTaskItems = myTaskFolder.Items         Dim myItems As Object         myItems = myFolder.Items         Dim e As Microsoft.Office.Interop.Outlook.AppointmentItem         For Each e In myItems             If e.Categories <> String.Empty Then                 If e.Categories.Contains(category.Name) Then                     out += "BEGIN:VEVENT" & Chr(10)                     out += "UID:" & e.EntryID & Chr(10)                     If e.Categories <> "" Then                         out += "CATEGORIES:" & NoSpac(e.Categories.Replace(";"c, ","c)) & Chr(10)                     End If                     out += "DTSTAMP:" & ToDate69(e.CreationTime.ToUniversalTime) & Chr(10)                     out += "DTSTART:" & ToDate69(e.Start.ToUniversalTime) & Chr(10)                     out += "DTEND:" & ToDate69(e.End.ToUniversalTime) & Chr(10)                     out += "SUMMARY:" & RFC5545_TEXT(e.Subject) & Chr(10)                     'out += "DESCRIPTION:" & RFC5545_TEXT(e.Body) & Chr(10)                     out += "LOCATION:" & RFC5545_TEXT(e.Location) & Chr(10)                     If e.RecurrenceState = OlRecurrenceState.olApptMaster Then                         out += ("RECURRENCE-ID:") & ToDate69(e.StartUTC) & Chr(10)                         out += "RRULE:"                         Dim f As Microsoft.Office.Interop.Outlook.RecurrencePattern                         f = e.GetRecurrencePattern()                         'Console.WriteLine("VALUES:monthofyear" & f.MonthOfYear & "dayofmonth:" & f.DayOfMonth & "daysofweekmask:" & f.DayOfWeekMask & "interval:" & f.Interval & "instance:" & f.Instance & "type:" & f.RecurrenceType)                         Select Case f.RecurrenceType                             Case OlRecurrenceType.olRecursYearNth                                 out += "FREQ=YEARLY;"                                 out += "INTERVAL=" & f.Interval & ";"                                 out += "BYMONTH=" & f.MonthOfYear & ";"                                 out += "BYDAY=" & GetDays(f.DayOfWeekMask) & ";"                                 out += "BYMONTHDAY=" & GetMonthDays(f.Instance) & ";"                             Case OlRecurrenceType.olRecursMonthNth                                 out += "FREQ=MONTHLY;"                                 out += "INTERVAL=" & f.Interval & ";"                                 out += "BYDAY=" & GetDays(f.DayOfWeekMask) & ";"                                 out += "BYMONTHDAY=" & GetMonthDays(f.Instance) & ";"                             Case OlRecurrenceType.olRecursYearly                                 out += "FREQ=YEARLY;"                                 out += "INTERVAL=" & f.Interval & ";"                                 out += "BYMONTH=" & f.MonthOfYear & ";"                                 out += "BYMONTHDAY=" & f.DayOfMonth & ";"                             Case OlRecurrenceType.olRecursMonthly                                 out += "FREQ=MONTHLY;"                                 out += "INTERVAL=" & f.Interval & ";"                                 out += "BYMONTHDAY=" & f.DayOfMonth & ";"                             Case OlRecurrenceType.olRecursWeekly                                 out += "FREQ=WEEKLY;"                                 out += "INTERVAL=" & f.Interval & ";"                                 out += "BYDAY=" & GetDays(f.DayOfWeekMask) & ";"                             Case OlRecurrenceType.olRecursDaily                                 out += "FREQ=DAILY;"                                 out += "INTERVAL=" & f.Interval & ";"                         End Select                         If f.NoEndDate Then                             out += "UNTIL=45001231235900Z"                         Else                             Dim endDate As Date                             endDate = f.PatternEndDate.ToUniversalTime                             out += "UNTIL=" & ToDate69(endDate.ToUniversalTime)                         End If                         out += Chr(10)                         If f.Exceptions.Count > 1 Then                             out += "EXDATE:"                             Dim isLast = False                             Dim enumerator As IEnumerator                             enumerator = f.Exceptions.GetEnumerator()                             enumerator.MoveNext()                             While Not isLast                                 out += ToDate69(enumerator.Current.OriginalDate.ToUniversalTime)                                 If Not enumerator.MoveNext Then                                     isLast = True                                 Else                                     out += ","                                 End If                             End While                             out += Chr(10)                         End If                     ElseIf e.RecurrenceState = OlRecurrenceState.olApptOccurrence Then                         'treat exception cases                         out += ("RECURRENCE-ID:") & ToDate69(e.StartUTC) & Chr(10)                         'Console.WriteLine("OCCURRENCE")                     End If                     out += "END:VEVENT" & Chr(10)                 End If             End If         Next         Dim task As Microsoft.Office.Interop.Outlook.TaskItem         For Each task In myTaskItems             If task.Categories <> String.Empty Then                 If task.Categories.Contains(category.Name) Then                     out += "BEGIN:VTODO" & Chr(10)                     out += "UID:" & task.EntryID & Chr(10)                     out += "DTSTAMP:" & ToDate69(task.CreationTime) & Chr(10)                     If task.Status = OlTaskStatus.olTaskComplete Then                         out += "COMPLETED:" & ToDate69(task.DateCompleted.ToUniversalTime) & Chr(10)                     End If                     If Date.Compare(task.StartDate, New Date(4499, 12, 31)) < 0 Then                         out += "DTSTART:" & ToDate69(task.StartDate.ToUniversalTime)                     End If                     If task.Status = OlTaskStatus.olTaskInProgress Then                         out += "STATUS:IN-PROGRESS" & Chr(10)                     ElseIf task.Status = OlTaskStatus.olTaskWaiting Then                         out += "STATUS:NEEDS-ACTION" & Chr(10)                     End If                     out += "SUMMARY:" & task.Subject & Chr(10)                     If Date.Compare(task.DueDate, New Date(4499, 12, 31)) < 0 Then                         out += "DUE:" & ToDate69(task.DueDate.ToUniversalTime) & Chr(10)                     End If                     out += "CATEGORIES:" & NoSpac(task.Categories.Replace(";"c, ","c)) & Chr(10)                     out += "END:VTODO" & Chr(10)                 End If                 End If         Next         out += "END:VCALENDAR" & Chr(10)         File.WriteAllText("C:\Program1\" & category.Name & ".ics", out, System.Text.Encoding.UTF8)         Dim ftp As FTPclient         Dim localFile As String = "C:\Program1\" & category.Name & ".ics"         Dim remoteFile As String = "www/cal/calendars/" & category.Name & ".ics"         Const host As String = "[ftp://FTPSITE.COM/]"         Const username As String = "USERNAME"         Const password As String = "<PASSWORD>"         ftp = New FTPclient(host, username, password)         ftp.Upload(localFile, remoteFile)     End Sub     Public Function ToDig(ByVal value As Integer) As String         If value <= 9 Then             Dim a As String             a = "0" & value             ToDig = a         Else             ToDig = value.ToString         End If         Exit Function     End Function     Public Function NoSpac(ByVal value As String) As String         Dim str As String         str = ""         For Each ch As Char In value.ToCharArray             If ch <> " "c Then                 str += ch             End If         Next         NoSpac = str         Exit Function     End Function     Public Function ToDate69(ByVal d As Date) As String         Dim str As String         str = d.Year & ToDig(d.Month) & ToDig(d.Day) & ToDig(d.Hour) & ToDig(d.Minute) & "00Z"         ToDate69 = str         Exit Function     End Function     Public Function GetDays(ByVal d As Integer) As String         Dim out As String         out = ""         Dim once As Boolean         once = False         If (d And OlDaysOfWeek.olSunday) Then             out += "SU"             once = True         End If         If (d And OlDaysOfWeek.olMonday) Then             If (once) Then                 out += ","             End If             out += "MO"             once = True         End If         If (d And OlDaysOfWeek.olTuesday) Then             If (once) Then                 out += ","             End If             out += "TU"             once = True         End If         If (d And OlDaysOfWeek.olWednesday) Then             If (once) Then                 out += ","             End If             out += "WE"             once = True         End If         If (d And OlDaysOfWeek.olThursday) Then             If (once) Then                 out += ","             End If             out += "TH"             once = True         End If         If (d And OlDaysOfWeek.olFriday) Then             If (once) Then                 out += ","             End If             out += "FR"             once = True         End If         If (d And OlDaysOfWeek.olSaturday) Then             If (once) Then                 out += ","             End If             out += "SA"         End If         GetDays = out         Exit Function     End Function     Public Function GetMonthDays(ByVal xieme As Integer) As String         Select Case xieme             Case 1                 GetMonthDays = "1,2,3,4,5,6,7"             Case 2                 GetMonthDays = "8,9,10,11,12,13,14"             Case 3                 GetMonthDays = "15,16,17,18,19,20,21"             Case 4                 GetMonthDays = "22,23,24,25,26,27,28"             Case 5                 GetMonthDays = "29,30,31"             Case Else                 GetMonthDays = "0"         End Select         Exit Function     End Function     Public Function RFC5545_TEXT(ByVal s As String) As String         If s <> String.Empty Then             s = s.Replace("\", "\\")             s = s.Replace(";", "\;")             s = s.Replace(",", "\,")             s = s.Replace(vbNewLine, "\n")         End If         RFC5545_TEXT = s         Exit Function     End Function End Module 

Conclusion :


La méthode pour obtenir un "Handle" sur Outlook peut varier selon que vous utilisiez exchange ou non, je conseille cet excellent site : outlookcode.com

Aussi ai-je publié une page de démonstration avec ce programme : http://www.xsimo.com/cal.htm

Codes Sources

A voir également