Hallo,
ich möchte Anhänge aus dem zweiten Postfach in Outlook speichern, Mails verschieben und nutze folgenden Code:
{
Outlook.Application o = new Outlook.Application();
Outlook._NameSpace ns = (Outlook._NameSpace)o.GetNamespace("MAPI");
Outlook.MAPIFolder f = ns.Folders["xxxxx@yyy.de"].Folders["Posteingang"];
Outlook.MAPIFolder subFolder = f.Folders["Sicherung"];
Outlook.MailItem item = null;
if (f.Items.Count > 0) //Mails vorhanden??
{
for (int i = 1; i <= f.Items.Count; i++) //alle Mails durchgehen
{
item = (Outlook.MailItem)f.Items[i];
if (item.Attachments.Count > 0 && item.SenderName.Contains("FAXG3") )//Anhang vorhanden??
{
item.Attachments[1].SaveAsFile(@"\\server\daten\eingang\" + item.Attachments[1].FileName);
item.UnRead = false;
item.Move(subFolder);
}
}
}
}
Funktioniert so weit, jedoch geht er nicht alle Mails durch sondern immer nur eine willkürliche Anzahl.
Ich muss diese Funktion immer mehrfach aufrufen, bis alle mails abgearbeitet sind.
Hat jemand eine Idee??
Deine if Anweisung kannst du dir sparen.
Wenn er keine Items hat überspringt er die Schleife eh.
Ansonsten bin ich verwundert, dass du in der Schleife schon mit i = 1 angängst.
Ist der Zugriff auf Items[0] verboten? Damit überspringst du dich direkt die ersten Items.
Ebenfalls speicherst du nur den ersten Anhang.
Wenn es mehr als einen geben sollte, darfst du ebenfalls wieder Fehler suchen.
Ebenfalls dürfte es bei deiner "i ≤ f.Items.Count" beim Zugriff auf f.Items_ am Ende knallen oder läuft das auch sauber?
Egentlich bist du doch dann über dem Array hinaus.
Ansonsten sieht der Rest ganz brauchbar aus.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Hallo T-Virus,
danke für die Antwort.
Ja mit der If haste vollkommen recht, ist mir nicht mal aufgefallen 😃
Ich fange in der Schleife mit 1 an, weil 0 nicht funktioniert. Da kommt immer ne exception..(Array außerhalb gültiger Bereich)
Ebenso ist es mit den Anhängen - alle haben definitiv nur einen Anhang.
In dieses spezielle Postfach kommen nur derlei Mails.
Wie gesagt: der Code funzt eigentlich, nur macht er eben nicht alle mails auf einmal, sondern muss den Button mehrmals klicken bis er durch ist..
EDIT: jeder klick auf den Button arbeitet knapp die Hälfte aller vorhandenen Mails ab ?!?
f.Items.Count stimmt mit den vorhandenen Mails überein.
EDIT: omfg
so wird ien Schuh draus:
...
for (int i = f.Items.Count; i >= 1; i--)
...
Der "resettet" in obigen Code ja den Index nach dem Move, deswegen immer die Hälfte..
Deine Aussage zum Array Index macht keinen Sinn.
Array gehen immer von 0 bis Length - 1.
Entsprechend sollte dein Index immer bei 0 anfangen :p
Dein neues Konstrukt kann ich leider mangels Code und Know-How auch nicht ganz verstehen.
Eigentlich sollte es kein Problem sein von 0 bis Count - 1 zugehen.
Dann gehst du auch das "Array" bzw. hier die Collection sauber durch.
Aktuell läufst du ja Quasi vom Ende bis runter zu 1.
Entsprechend wirst du in deinem jetzigen Code wohl mit i - 1 auf den Eintrag zugreifen.
Finde ich immer sehr unschön so durch Collections/Array durchzugehen.
Oder geht es hier nicht anders?
Wenn möglich sollte es für bessere Lesbarkeit immer von 0 bis X gehen.
Dann kannst du auch deinen eigenen Code nach X Jahren noch gut nachvollziehen,
Am besten solche Entscheidungen auch gut im Code kommentieren, sonst fragst du dich irgendwann warum du das so gelöst hast und musst schlimmsten Falls erst wieder rumtesten bis du es weißt 😃
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Sollte, stimmt schon, nur das hier ist wohl anders ?!?
Der 0-Index ist nicht zu gebrauchen..
Was die Schleife angeht:
MailItem hat ein bestimmten Index, deswegen MUSS man von hintne anfangen, denn nach dem ersten .Move ist das zweite Item dann das erste..usw..
{
Outlook.Application o = new Outlook.Application();
Outlook._NameSpace ns = (Outlook._NameSpace)o.GetNamespace("MAPI");
Outlook.MAPIFolder f = ns.Folders[mailName].Folders["Posteingang"]; //funktioniert
Outlook.MAPIFolder subFolder = f.Folders["Sicherung"];
Outlook.MailItem item = null;
try
{
for (int i = f.Items.Count; i >=1; i--) //alle Mails durchgehen
{
item = (Outlook.MailItem)f.Items[i];
if (item.Attachments.Count > 0 && item.Subject.Contains("FAXG3") )//Anhang vorhanden??
{
item.Attachments[1].SaveAsFile(ZielPfad + i.ToString() + "_" + item.Attachments[1].FileName);
item.UnRead = false;
item.Move(subFolder);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
So sieht das jetzt aus und funzt..
Dann mach doch einfach
f.Items.Select( item => ( item as Outlook.MailItem) ).Where( item => item != null);
und geh mit nem foreach drüber...
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@T-Virus
Bei Office ist schon immer das Problem, daß die Arrays nicht 0-basiert, sondern 1-basiert sind. Die Entwickler von Office kannten wohl eine 0 😃.