C# - Outlook levelek archiválása Word dokumentumba

forráskód letöltése
Cikkünkben elkészítünk egy komponenst, mely képes a Microsoft Outlook levelezőprogram mappáiban található leveleket egy Word dokumentumba menteni, archiválni. A komponens segítségével a Beérkezett üzenetek, a Postázandó üzenetek, valamint az Elküldött elemek mappák tartalmát tudjuk menteni külön-külön. Az egyes levelek mentésének eseményéhez a hívó alkalmazásban eseménykezelőt deklarálhatunk, így egy folyamatjelzővel is jelezhető, hogy éppen hol tart a mentés.
A komponensben létrehoztunk egy enumerátort a mappa típusának kiválasztását megkönnyítendő.
public enum MailFolder : int
{
  INBOXFOLDER = 0,
  OUTBOXFOLDER = 1,
  SENTMAILFOLDER = 2
}
Ezzel a típussal létrehoztunk egy property-t a beállítás elvégzéséhez. A komponens rendelkezik egy másik tulajdonsággal is, mely megadja, hogy a kiválasztott fiók hány elemet tartalmaz. Ezt az értéket a hívó alkalmazásban használjuk fel arra, hogy a folyamatjelző Maximum property-jének értékét meghatározzuk.
[Browsable(false)]
public int MailNumber
{
  get
  {
    return CountMails();
  }      
}
A CountMails metódusban megszámoljuk a leveleket attól függően, hogy mely mappát adtuk meg a hívó alkalmazásban.
private int CountMails()
{
  Outlook.Application oa = new Outlook.Application();
  Outlook.NameSpace on = oa.GetNamespace("MAPI");
  int count = 0;
  if (foldertype == MailFolder.SENTMAILFOLDER)
  {
    Outlook.MAPIFolder mf = on.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
    count = mf.Items.Count;
  }
  ...
  return count;
}
A komponens Archive metódusában végezzük el a levelek archiválását. Első lépésként létrehozunk egy Outlook példányt, hogy elérhessük leveleinket.
Outlook.Application oa = new Outlook.Application();
Fölvesszük a kapcsolatot a leveleket tároló mappával.
Outlook.NameSpace on = oa.GetNamespace("MAPI");
Miután meghatároztuk, hogy mely mappára van szükségünk, meghívjuk a DoProcess metódust, mely elvégzi a mappa mentését a Word dokumentumba, majd elmenti azt egy egyedi néven az alkalmazás mappájába.
if (foldertype == MailFolder.SENTMAILFOLDER)
{
  mf = on.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);                
  DoProcess(mf,wa,1,path);
}
A DoProcess metódusban létrehozunk egy új dokumentumot, majd egy levél objektumot, hogy lekérdezhessük minden levél adatait.
wa.Documents.Add(ref m, ref m, ref m, ref m);
Outlook.MailItem mi = null;
Szükségünk van a dokumentumon belül egy Selection objektumra is, melyben elhelyezzük a táblázato(ka)t.
Word.Selection ws = wa.Selection;
Ezt követően a mappa minden elemén végigmenve lekérdezzük az adott levél öt adatát: a feladót (vagy címzettet), a küldés/fogadás dátumát, a levél méretét, a tárgy mező és az üzenet mezők szövegét, és elhelyezzük ezeket egy táblázatban, üzenetenként külön-külön.
for (int i=1;i<=mf.Items.Count;i++)
{
  mi = (Outlook.MailItem)mf.Items.Item(i);
  Word.Table wt = wd.Tables.Add(wa.Selection.Range, 3, 2, ref dtb, ref afb);
  wt.Cell(1,1).Range.Font = f;
  wt.Cell(1,1).Range.Font.Bold = Convert.ToInt32(true);
  wt.Cell(1,1).Range.Font.Color = WdColor.wdColorGreen;
  wt.Cell(1,1).Range.Text = mi.SenderName;
  ...
Az egyes levelek mentésének végén kiváltjuk a komponens eseményét, mely csak egy paramétert tartalmaz.
  ...  
  ConvertItem(this);
}
A művelet végén elmentjük a dokumentumot egy adott néven, melyet a hívó alkalmazásban generáltunk, és bezárjuk a hívott alkalmazásokat.
wd.SaveAs(ref filename,ref m,ref m,ref m, ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m,ref m);
wa.Quit(ref m,ref m,ref m);
oa.Quit();
A hívó alkalmazásban egy ComboBox kontrolból kell kiválasztani a mentendő mappát, majd a művelet az ARCHIVÁLÁS gombbal indítható.