Gegeben:
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 recipient
im 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 recipient
auszulesen?
Zitat von dannoe
Ist der
recipient
im 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é