Laden...

Outlook: Ermittlung des Standardordners (InBox) für ein Postfach schlägt fehl.

Letzter Beitrag vor einem Jahr 3 Posts 623 Views
Outlook: Ermittlung des Standardordners (InBox) für ein Postfach schlägt fehl.

Gegeben:

  • Konsoleanwendung, .NET 7
  • Microsoft 365, Desktopapplikation von Outlook, Exchange-Online
  • Microsoft.Office.Interop.Outlook
    C:\Program Files (x86)\Microsoft Visual Studio\Shared\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Outlook.dll
    Version 15.0.4420.1017

Hallo,

heute habe ich folgendes Problem: Ich muss aus dem Posteingang eines bestimmten Exchange-Postfaches über Outlook bestimmte E-Mails ermitteln, die Excel-Dateianhänge enthalten – diese sollen an einem bestimmten Ort gespeichert werden. Dazu habe ich das unten aufgeführte Testprogramm erstellt, welches das macht, was es auch soll, bis auf einwr Ausnahme.

Ich habe das Testprogramm mit verschiedenen Postfächern getestet, wobei bei einem davon ich nachfolgenden Fehler beim Ausführen der Zeile

MAPIFolder  inbox = outlookNamespace.GetSharedDefaultFolder(recipient, OlDefaultFolders.olFolderInbox);

erhalte:

Dieser Vorgang konnte wegen eines Registrierungs- oder Installationsproblems nicht ausgeführt werden. Starten Sie Outlook neu, und versuchen Sie es erneut. Falls das Problem weiterhin besteht, installieren Sie Outlook erneut.

Dieses Postfach habe ich auf verschiedenen Rechnern getestet, immer mit demselben Misserfolg.

Ich habe die anderen Postfächer mit dem fehlerverursachenden sowohl client- als auch serverseitig verglichen. Ich konnte dabei keine Unterschiede feststellen: Gleiche Einstellungen (eigentlich alles Standardeinstellungen), gleiche Berechtigungen (auch alles auf Standard), gleicher Server.

Bisher konnte ich keine Spur des Fehlers finden und tappe etwas im Dunkeln.

Ich werde selbstverständlich weiter nach der Ursache suchen, dennoch hoffe ich, dass jemand dieses Verhalten kennt und mir einen Tipp geben kann.

Vielen Dank und liebe Grüße

René

using Microsoft.Office.Interop.Outlook;

namespace SaveAttachments;

class Program
{
    static void Main(string[] args)
    {
        List<MailItem>? Emails;

        try
        {
            Emails = new List<MailItem>();

            // args[0]: Postfach (E-Mail-Adresse)
            LoadEmails(Emails, args[0]);

            // args[1]: Ausgabeordnenr
            ExtractXlsxAttachments(Emails, args[1]);
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex?.InnerException?.Message ?? string.Empty);
            Console.WriteLine();
            Console.WriteLine("SaveAttachments Postfach Ausgabeordner");
            Console.WriteLine();
            Console.WriteLine("Beispiel:");
            Console.WriteLine("\tSaveAttachments mailbox@example.com C:\\Test");
        }
    }

    static private void LoadEmails(List<MailItem> emails, string emailAddress)
    {
        Application outlookApp       = new Application();
        NameSpace   outlookNamespace = outlookApp.GetNamespace("MAPI");
        Recipient   recipient        = outlookNamespace.CreateRecipient(emailAddress);
        MAPIFolder  inbox            = outlookNamespace.GetSharedDefaultFolder(recipient, OlDefaultFolders.olFolderInbox);

        foreach (object item in inbox.Items)
        {
            if (item is MailItem email && HasXlsxAttachment(email))
            {
                emails.Add(email);
            }
        }
    }

    static private bool HasXlsxAttachment(MailItem email)
    {
        foreach (Attachment attachment in email.Attachments)
        {
            if (attachment.FileName.EndsWith(".xlsx"))
            {
                return true;
            }
        }

        return false;
    }

    static private void ExtractXlsxAttachments(List<MailItem> emails, string targetFolder)
    {
        foreach (var email in emails)
        {
            foreach (Attachment attachment in email.Attachments)
            {
                // Pfad definieren, wohin der Anhang gespeichert werden soll.
                string savePath = Path.Combine(targetFolder, attachment.FileName);

                // Prüfen und ggf. den Dateinamen anpassen, um Überschreibungen zu verhindern
                int counter = 1;
                while (File.Exists(savePath))
                {
                    string   fileNameWithoutExtension = Path.GetFileNameWithoutExtension(attachment.FileName);
                    string   extension                = Path.GetExtension(attachment.FileName);
                    savePath                          = Path.Combine(targetFolder, $"{fileNameWithoutExtension}_{counter}{extension}");
                    counter++;
                }

                // Anhang speichern
                attachment.SaveAsFile(savePath);
                Console.WriteLine($"Anhang gespeichert unter: {savePath}");
            }
        }
    }

}

René

Ist der recipientim globalen Addressbuch versteckt? (siehe https://stackoverflow.com/a/45980562/1627022)

Hat der Benutzer der das Programm ausführt auch wirklich die Berechtigung das Postfach des recipientauszulesen?

Zitat von dannoe

Ist der recipientim globalen Addressbuch versteckt? (siehe https://stackoverflow.com/a/45980562/1627022)

Du bist mein Held. Vielen Dank! Wie oft habe ich die Einstellungen überprüft und diese jedes Mal übersehen.

Du hast meinen Abend gerettet.

LG René

René