Frage

Die Verwendung von MAPI-Funktionen innerhalb verwalteten Codes wird offiziell nicht unterstützt.Anscheinend verwendet MAPI seine eigene Speicherverwaltung und es stürzt ab und brennt innerhalb des verwalteten Codes (siehe Hier Und Hier)

Ich möchte lediglich den Standard-E-Mail-Client starten mit Subjekt, Körper, UND ein oder mehrere Anhänge.

Also habe ich nachgeschaut MAPISendDocuments und es scheint zu funktionieren.Aber ich konnte nicht den Mut aufbringen, die Funktion tatsächlich im Produktionscode zu verwenden.

Hat jemand diese Funktion schon oft genutzt?Habt ihr irgendwelche Horrorgeschichten?

PS.Nein, ich werde Outlook.exe nicht mit Befehlszeilenargumenten für Anhänge ausführen.

PPS.Bindungsunterstützung ist eine Erfordernis , also Mailto:Lösungen reichen für mich nicht aus.

War es hilfreich?

Lösung

Verfügen Sie über eine separate Hilfs-EXE-Datei, die Befehlszeilenparameter entgegennimmt (oder über eine Pipe an ihren StandardInput weiterleitet), um die erforderlichen Aufgaben auszuführen, und rufen Sie diese von Ihrer Haupt-App aus auf.Dadurch bleiben die MAPI-Inhalte außerhalb des Prozessraums Ihrer Haupt-App.OK, Sie mischen immer noch MAPI und .NET, aber in einem sehr kurzlebigen Prozess.Es wird davon ausgegangen, dass MAPI und CLR beginnen, Probleme bei länger laufenden Prozessen zu verursachen.

Wir verwenden Dmitry Streblechenkos Hervorragendes Einlösungsdatenobjekte Bibliothek, die es uns ermöglicht, solchen „Shim“-Code in JScript zu schreiben und ihn aufzurufen, wodurch die CLR- und MAPI-Welten in getrennten Prozessen gehalten werden, jedoch auf unterstützte Weise.

@Chris Fournier bezüglich.Schreiben einer nicht verwalteten DLL.Dies wird nicht funktionieren, da das Problem darin besteht, MAPI und verwalteten Code zu vermischen im selben Prozess.

Andere Tipps

MAPISendDocuments ist veraltet und wird möglicherweise entfernt.Sie sollten stattdessen MAPISendMail verwenden.Sehen Einfaches MAPI

Aufrufvorgang. Beginnen Sie mit dem Mailto:Protokoll (wie unten gezeigt) bietet Ihnen grundlegende Funktionen, jedoch keine Anhänge.

Process.Start("mailto:name@domain.com?subject=TestCode&Body=Test Text");

Sie können diesen Ansatz mit Anhangspfaden durchführen, diese Option funktioniert jedoch nur mit einigen alten Outlook-Versionen wie 98.Ich gehe davon aus, dass dies auf das potenzielle Sicherheitsrisiko zurückzuführen ist.

Wenn jemand outlook.exe verwendet, werden unter Outlook 2003 (und 2007, abhängig von den Einstellungen) Sicherheitswarnungen angezeigt.

Sie sollten in der Lage sein, eine nicht verwaltete DLL zu erstellen, die die gewünschten Vorgänge mithilfe von MAPI ausführt, und diese DLL dann über Ihren verwalteten Code aufzurufen.Ich würde keinen reinen MAPI-Wrapper schreiben, sondern etwas, das alle in dieser nicht verwalteten DLL enthaltenen MAPI-Funktionen ausführt, die Sie benötigen.Das wäre wahrscheinlich die sicherste Möglichkeit, MAPI aus verwaltetem Code zu verwenden.

Sie könnten auch verwenden Outlook-Einlösung, das von verwaltetem Code unterstützt wird;Ich bin mir nicht sofort sicher, ob es einen einfachen MAPISendDocuments-Ersatz gibt, aber Dmitry ist hilfreich, wenn Sie Fragen haben.

Was „Abstürze und Verbrennungen“ betrifft, hier ist ein weiteres Zitat eines MS-Supportmitarbeiters: Hier

So etwas wird meistens funktionieren.Es wird funktionieren, während Sie es schreiben.Dann funktioniert es, während Sie es testen.Es funktioniert, während Ihr Kunde es bewertet.Sobald der Kunde es dann einsetzt – BAM!Dann wird es entscheiden, Probleme zu bekommen.Und Microsoft wird Ihnen dabei nicht helfen, da wir Ihnen von vornherein gesagt haben, dass Sie es nicht tun sollen.:) :)

Ich habe dies mit der MAPISendMail-Funktion und mehreren internen Klassen getan, um einige der anderen MAPI-bezogenen Strukturen zu umschließen.Solange dies die einzige Verwendung ist, ist dies möglich, wenn auch nicht trivial und sicher, da es eine sehr genaue Beachtung der verschiedenen nicht verwalteten Datentypen sowie der Speicherzuweisung/-freigabe und GC erfordert.Obwohl es immer noch nicht unterstützt wird, verwende ich es im Produktionscode (obwohl es noch nicht ausgeliefert wurde).

Als ich Matt Stehle danach fragte, erhielt ich folgende Antwort:

Ich kenne wirklich keine viel bessere Möglichkeit, dies zu tun, und alle Probleme, auf die Sie hier gestoßen sind, wären wahrscheinlich in einem unterstützten Szenario reproduzierbar (d. h.VB6 oder nicht verwaltetes C++).Bedenken Sie jedoch, dass wir Ihnen keine andere Empfehlung geben würden, als .NET nicht zu verwenden, falls Sie jemals auf ein Szenario stoßen, in dem ein Problem speziell durch den Aufruf dieser Funktion aus .NET verursacht wurde.

Nicht gerade ein Segen bei der Verwendung, aber ich sage auch nicht, dass es andere Möglichkeiten gibt, dies tatsächlich mit verwaltetem Code zu tun.

Der folgende Code verwendet MAPI nicht als solches, öffnet aber das Fenster „Mail verfassen“ mit beliebigen Anhängen.

(Eigentlich ist es völlig ungetestet, aber ich habe es in einer Anwendung ausgegraben, von der ich glaube, dass sie funktioniert hat)

using Microsoft.Office;
using Microsoft.Office.Core;

...

Outlook.Application outlook = new Outlook.Application();
Outlook.MailItem mail = (Outlook.MailItem) outlook.CreateItem(Outlook.OlItemType.olMailItem);

mail.BodyFormat = Outlook.OlBodyFormat.olFormatRichText;
mail.HTMLBody = "stuff";
mail.Subject = "more stuff";
string file = File.ReadAllBytes(...);
mail.Attachments.Add(file, Outlook.OlAttachmentType.olByValue, 1, file)

mail.Display(false);

Für jemanden, der Erfahrung mit MAPI hat, würde es weniger Zeit in Anspruch nehmen, den Code so zu erstellen, dass er genau das tut, was Sie von nicht verwaltetem Code erwarten (lesen Sie:einfaches C++), als diesen Beitrag zu schreiben und die Antwort zu lesen (nichts für ungut).

Sie haben Glück, dass die von Ihnen benötigte Funktionalität begrenzt ist.Sie benötigen lediglich ein einfaches C++-Dienstprogramm, um die benötigten Parameter in der Befehlszeile zu übernehmen und die richtigen MAPI-Aufrufe auszuführen.Dann nutzen Sie dieses Dienstprogramm aus Ihrem verwalteten Code, so wie Sie es auch bei der Ausführung jedes anderen Prozesses tun würden.

HTH

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top