Entwickler-Ecke

WinForms - Outlook Kalender Attatchments auslesen


acdc - Mi 15.12.10 14:27
Titel: Outlook Kalender Attatchments auslesen
Hallo,
Ich habe ein kleines Programm, mit dem ich den öffenlichen Kalender in eine Textdatei schreiben kann. Nun besteht jedoch die Möglichkeit auch Attatchments zu einem Eintrag im Kalender hinzuzufügen und diese wird dann nicht kopiert. Ich möchte aber den Anhang mit herauskopieren.

Hier ein Teil des Codes:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
      object oNameSpace = oApp.GetType().InvokeMember("GetNamespace", BindingFlags.InvokeMethod, null, oApp, new object[1] { "MAPI" });

      for (int i = 0; i < 30; i++) //Druchsucht die Ordnerstruktur in Outlook
      {

        try
        {
          object objDefaultFolder = oNameSpace.GetType().InvokeMember("GetDefaultFolder", BindingFlags.InvokeMethod, null, oNameSpace, new object[] { i });
          object objFolderItems = objDefaultFolder.GetType().InvokeMember("Folders", BindingFlags.InvokeMethod, null, objDefaultFolder, null);

          int numofentries = (int)objFolderItems.GetType().InvokeMember("Count", BindingFlags.InvokeMethod, null, objFolderItems, null);

          try
          {
            string parentFoldername = (String)objDefaultFolder.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, objDefaultFolder, null);
            if (parentFoldername.Contains("Alle Öffentlichen"))
            {
              System.Collections.IEnumerable items = (System.Collections.IEnumerable)objFolderItems;
              foreach (object cItem in items)
              {
                string foldername = (String)cItem.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, cItem, null);
                if (foldername.Contains("Termine Schule"))
                {
                  string folderpath = (String)cItem.GetType().InvokeMember("FolderPath", BindingFlags.GetProperty, null, cItem, null);  //Outlookpfad des Ordners
                  try
                  {
                    itemsToFile(cItem) //Einzelne Element in Datei speichern
                    break;
                  }
                  catch (Exception ex)
                  {
                    errorcode = 0;
                    
                  }
                }                
              }
            }

          }
          catch
          {
          }

        }
        catch (Exception ex)
        {

        }
      }
    
    //summery ist nur eine ausgabe am Bildschirm zum Debuggen!
    public int itemsToFile(Object curObj)
    {
        FileHandling file = new FileHandling();
        file.WriteFile(dateiPfad, "BillingInformation;Body;CreationTime;Duration;Location;Subject;Start;End\n");
        StringBuilder outString = new StringBuilder();


        object objCalendarItems = curObj.GetType().InvokeMember("Items", BindingFlags.InvokeMethod, null, curObj, null);

        int numofItems = (int)objCalendarItems.GetType().InvokeMember("Count", BindingFlags.InvokeMethod, null, objCalendarItems, null);
        System.Collections.IEnumerable items = (System.Collections.IEnumerable)objCalendarItems;
        foreach (object cItem in items)
        {
            outString.Append((string)cItem.GetType().InvokeMember("BillingInformation", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append((string)cItem.GetType().InvokeMember("Body", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append(((DateTime)cItem.GetType().InvokeMember("CreationTime", BindingFlags.GetProperty, null, cItem, null)).ToString() + ";");
            outString.Append(((int)cItem.GetType().InvokeMember("Duration", BindingFlags.GetProperty, null, cItem, null)).ToString() + ";");
            outString.Append((string)cItem.GetType().InvokeMember("Location", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append((string)cItem.GetType().InvokeMember("Subject", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append(((DateTime)cItem.GetType().InvokeMember("Start", BindingFlags.GetProperty, null, cItem, null)).ToShortDateString() + " " +
              ((DateTime)cItem.GetType().InvokeMember("Start", BindingFlags.GetProperty, null, cItem, null)).ToShortTimeString() + ";");
            outString.Append(((DateTime)cItem.GetType().InvokeMember("End", BindingFlags.GetProperty, null, cItem, null)).ToShortDateString() + " " +
              ((DateTime)cItem.GetType().InvokeMember("Start", BindingFlags.GetProperty, null, cItem, null)).ToShortTimeString() + "\n");
            
            object attatchments=cItem.GetType().InvokeMember("Attachments", BindingFlags.GetProperty, null, cItem, null);


            int attatchmentcount = (int)attatchments.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, attatchments, null);
            if (attatchmentcount > 0)
            {
              summery.Append((string)cItem.GetType().InvokeMember("Subject", BindingFlags.GetProperty, null, cItem, null) + "\n");
                //object item==cItem.GetType().InvokeMember("Attachments", BindingFlags.GetProperty, null, cItem, null);
              //attatchments.GetType().InvokeMember("WriteToFile", BindingFlags.InvokeMethod, null, attatchments, new object[1] { "test.txt" });
              //summery.Append((string)attatchments.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, attatchments, null));

              object item = attatchments.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, attatchments, new object[1] {0});
              
        item.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, item, null);


hier kommt der Fehler: "Ein Aufrufziel hat einen Ausnahmefehler verursacht"

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        
        
        //summery.Append((string)item.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, item, null));

             

            }
        }

        file.Append(dateiPfad, outString.ToString());
        return numofItems;
    }


Wie schaffe ich es nun mittels Late Binding diese Datei unter einem beliebeigen Pfad zu speichern?

Danke
acdc


acdc - Do 16.12.10 08:10

oder hat jemand eine andre (bessere) Idee wie ich den öffentlichen Kalender inclusieve Attatchments in eine Datei speichere? Mit Hilfe von Google finde ich leider nicht das Richitge.

Danke für die Vorschläge
acdc


Trashkid2000 - Do 16.12.10 20:57

Hallo,

habe mal ein bisschen mit den Interop-Klassen von Outlook rumgespielt. Und das könnte dann so in etwa aussehen:

C#-Quelltext
1:
using Outlook = Microsoft.Office.Interop.Outlook;                    


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Outlook.Application olApp = new Outlook.ApplicationClass();
Outlook.NameSpace olNS = olApp.GetNamespace("MAPI");
Outlook.MAPIFolder oFolder = olNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items oCalendarItems = oFolder.Items;
foreach (Outlook.AppointmentItem oCalendarItem in oCalendarItems)
{
  Outlook.Attachments oAttachments = oCalendarItem.Attachments;
  foreach (Outlook.Attachment oAttachment in oAttachments)
  {
    oAttachment.SaveAsFile(Path.Combine("c:\\temp\\test", oAttachment.FileName));
  }
}
Der Code ist getestet und funktioniert für einen privaten Kalender. Wie es sich mit öffentlichen Ordnern, speziell öffentlichen Kalendern verhält, konnte ich leider nicht testen. Abder da müsstest Du warscheinlich den Code so verändern:

C#-Quelltext
1:
2:
Outlook.MAPIFolder oPublicFolders = olNS.GetDefaultFolder(Outlook.OlDefaultFolders.olPublicFoldersAllPublicFolders);
Outlook.Folders oFolders = oPublicFolders.Folders;


LG, Marko


Ich1986 - Mi 11.01.12 12:08

Hallo,

Ich bin neu im Forum und hoffe ich darf das Thema nochmal aufgreifen?!

Ich versuche meine freigegebenen Kalender auszulesen und habe schon die Codeänderungen,
welche du vorgeschlagen hast, vorgenommen.

Leider bekomme ich einen Fehler, der wie folgt lautet:

Der Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden.

Aber ich habe einen freigegebenen Kalender