Laden...

alle Mails in zweitem Postfach abarbeiten

Erstellt von Torni vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.543 Views
T
Torni Themenstarter:in
50 Beiträge seit 2014
vor 9 Jahren
alle Mails in zweitem Postfach abarbeiten

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??

T
2.224 Beiträge seit 2008
vor 9 Jahren

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.

T
Torni Themenstarter:in
50 Beiträge seit 2014
vor 9 Jahren

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..

T
2.224 Beiträge seit 2008
vor 9 Jahren

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.

T
Torni Themenstarter:in
50 Beiträge seit 2014
vor 9 Jahren

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..

16.842 Beiträge seit 2008
vor 9 Jahren

Dann mach doch einfach

f.Items.Select( item => ( item as Outlook.MailItem) ).Where( item => item != null);

und geh mit nem foreach drüber...

S
93 Beiträge seit 2008
vor 9 Jahren

@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 😃.