Question

L’utilisation des fonctions MAPI à partir du code managé n’est officiellement pas prise en charge.Apparemment, MAPI utilise sa propre gestion de mémoire et plante et brûle dans le code managé (voir ici et ici)

Tout ce que je veux faire c'est lancer le client de messagerie par défaut avec sujet, corps, ET une ou plusieurs pièces jointes.

J'ai donc étudié MAPISendDocuments et ça semble fonctionner.Mais je n'ai pas réussi à trouver le courage d'utiliser réellement la fonction dans le code de production.

Quelqu'un a-t-il beaucoup utilisé cette fonction ?Avez-vous des histoires d'horreur ?

PS.Non, je ne vais pas shellExecute Outlook.exe avec des arguments de ligne de commande pour les pièces jointes.

PP.La prise en charge des pièces jointes est un exigence , donc Mailto :les solutions ne me suffisent pas.

Était-ce utile?

La solution

Ayez un EXE d'assistance distinct qui prend les paramètres de ligne de commande (ou dirigez vers son StandardInput) qui fait ce qui est requis et appelez-le depuis votre application principale.Cela maintient les éléments MAPI en dehors de l'espace de processus de votre application principale.OK, vous mélangez toujours MAPI et .NET mais dans un processus de très courte durée.L'hypothèse est que MAPI et CLR commencent à causer des problèmes avec les processus à exécution plus longue.

Nous utilisons le superbe Objets de données de rachat bibliothèque qui nous permet d'écrire un tel code "shim" en JScript et de l'invoquer, ce qui maintient les mondes CLR et MAPI dans des processus séparés, mais de manière prise en charge.

@Chris Fournier concernant.écrire une DLL non gérée.Cela ne fonctionnera pas car le problème réside dans le mélange de MAPI et de code managé. dans le même processus.

Autres conseils

MAPISendDocuments est obsolète et pourrait être supprimé.Vous devriez plutôt utiliser MAPISendMail.Voir MAPI simple

Processus d'appel. Démarrez sur le Mail à :protocole (comme indiqué ci-dessous) vous offrira des fonctionnalités de base mais pas de pièces jointes.

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

Vous pouvez utiliser cette approche avec les chemins de pièces jointes, mais cette option ne fonctionne qu'avec certaines anciennes versions d'Outlook telles que 98.Je suppose que cela est dû au risque potentiel pour la sécurité.

Si quelqu'un utilise Outlook.exe, il affichera des avertissements de sécurité sous Outlook 2003 (et 2007, en fonction des paramètres).

Vous devriez pouvoir créer une DLL non gérée qui effectue les opérations souhaitées à l'aide de MAPI, puis appeler cette DLL à partir de votre code managé.Je n'écrirais pas un wrapper MAPI direct, mais quelque chose qui exécute toutes les fonctionnalités dont vous avez besoin de MAPI contenues dans cette DLL non gérée.Ce serait probablement le moyen le plus sûr d'utiliser MAPI à partir de code managé.

Vous pouvez également utiliser Rédemption Outlook, qui est pris en charge à partir du code managé ;Je ne suis pas immédiatement sûr qu'il s'agisse d'un simple remplacement de MAPISendDocuments, mais Dmitry est utile si vous avez des questions.

En ce qui concerne les "plantages et brûlures", voici une autre citation d'un responsable du support MS : ici

C'est le genre de chose qui fonctionnera la plupart du temps.Cela fonctionnera pendant que vous l'écrivez.Ensuite, cela fonctionnera pendant que vous le testerez.Cela fonctionnera pendant que votre client l'évaluera.Puis dès que le client le déploie – BAM !C'est à ce moment-là qu'il décidera de commencer à avoir des problèmes.Et Microsoft ne va pas vous aider, puisque nous vous avons dit de ne pas le faire en premier lieu.:)

Je l'ai fait en utilisant la fonction MAPISendMail et plusieurs classes internes pour envelopper certaines des autres structures liées à MAPI.Tant qu'il s'agit de la seule utilisation, il est possible, bien que non trivial, de le faire en toute sécurité car cela nécessite une attention très particulière aux différents types de données non gérés, à l'allocation/désallocation de mémoire et au GC.Bien qu'il ne soit toujours pas pris en charge, je l'utilise dans le code de production (bien qu'il n'ait pas encore été livré).

Lorsque j'ai interrogé Matt Stehle à ce sujet, la réponse que j'ai reçue a été :

Je ne connais vraiment pas de meilleure façon de procéder et tous les problèmes que vous rencontrerez ici seraient probablement reproductibles dans un scénario pris en charge (c'est-à-direVB6 ou C++ non managé).Sachez simplement que si jamais vous rencontriez un scénario dans lequel un problème était spécifiquement causé par l'appel de cette fonction à partir de .NET, nous n'aurions aucune autre recommandation à vous faire de ne pas utiliser .NET.

Ce n’est pas vraiment une bénédiction de l’utiliser, mais cela ne dit pas non plus qu’il existe d’autres options pour le faire à partir du code managé.

Le code suivant n'utilise pas MAPI en tant que tel, mais il ouvre la fenêtre « Compose Mail » avec des pièces jointes arbitraires.

(en fait, ce n'est pas du tout testé mais je l'ai déterré dans une application qui, je crois, a fonctionné)

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);

Pour quelqu'un expérimenté avec MAPI, il lui faudrait moins de temps pour générer le code afin de faire exactement ce que vous voulez à partir du code non géré (lire :C++ simple) que de taper ce message et de lire la réponse (sans vouloir vous offenser).

Vous avez de la chance que les fonctionnalités dont vous avez besoin soient limitées.Tout ce dont vous avez besoin est un simple utilitaire C++ pour prendre les paramètres dont vous avez besoin sur la ligne de commande et émettre les bons appels MAPI.Ensuite, vous utilisez tout cet utilitaire à partir de votre code managé comme vous le feriez pour exécuter n’importe quel autre processus.

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top