MAPI și experiențele codului gestionat?

Utilizarea funcțiilor MAPI din cadrul codului gestionat este oficial nesuportată. Aparent, MAPI utilizează propriile gestionări ale memoriei și se blochează și se arde în cadrul codului gestionat (a se vedea aici și aici )

All I want to do is launch the default e-mail client with subject, body, AND one or more attachments.

Deci, am căutat MAPISendDocuments și pare să funcționeze. Dar nu am reușit să adun curajul să folosesc funcția în codul de producție.

A folosit cineva această funcție mult? Aveți povești de groază?

PS. Nu, nu voi expune Outlook.exe cu argumentele liniei de comandă pentru atașamente.

PPS. Attachment support is a requirement , so Mailto: solutions do not cut it for me.

0
fr hi bn
Vă mulțumim pentru întrebare și link-uri! Aflați despre chestiunea MAPI / Codul Gestionat mi-a ajutat să salvez ceva timp dev.
adăugat autor SkullDuggerT, sursa

8 răspunsuri

Procesul de apelare.Start pe Protocolul Mailto: (după cum se arată mai jos) vă va oferi funcții de bază, dar nu atașamente.

Process.Start("mailto:[email protected]?subject=TestCode&Body=Test Text");

Puteți face această abordare cu căi de atașare, dar această opțiune funcționează numai cu o versiune veche a Outlook, cum ar fi 98. presupun acest lucru se datorează riscul potențial securty.

Dacă cineva folosește outlook.exe, va oferi avertismente de securitate în Outlook 2003 (și 2007 Dependent on settings).

0
adăugat

Următorul cod nu utilizează MAPI ca atare, dar deschide fereastra "Compose Mail" cu atașamente arbitrare.

(de fapt, este complet netestat, dar l-am săpat într-o aplicație pe care cred că am lucrat)

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);
0
adăugat

Am făcut acest lucru folosind funcția MAPISendMail și mai multe clase interne pentru a înfășura unele dintre celelalte structuri legate de MAPI. Atâta timp cât aceasta este singura utilizare, este posibil, deși nu este banal să faceți în siguranță, deoarece necesită o atenție foarte aproape de diferitele tipuri de date neadministrate și alocarea / dealocarea memoriei și GC. În timp ce încă nu este acceptat, utilizez acest lucru în codul de producție (deși nu a fost expediat încă).

Când l-am întrebat pe Matt Stehle despre acest lucru, răspunsul pe care l-am primit a fost:

Nu știu într-adevăr despre o modalitate mult mai bună de a face acest lucru și toate problemele pe care le-ați întâlnit aici ar fi probabil reproductibile într-un scenariu acceptat (adică VB6 sau C ++ neangajat). Doar stiu ca daca ai fugit vreodata intr-un scenariu, o problema a fost cauzata in mod special de aceasta functie fiind chemata din .NET ca nu am avea nici o recomandare pentru tine atunci sa nu folosesti .NET.

Nu este chiar o binecuvântare în ceea ce privește utilizarea acestuia, dar, de asemenea, nu spun că există alte opțiuni pentru a face acest lucru din codul gestionat.

0
adăugat

Aveți un EXE auxiliar separat, care ia paramuri de linii de comandă (sau conducte la standardul său de intrare) care fac ceea ce este necesar și îl apelează din aplicația principală. Acest lucru păstrează chestiile MAPI în afara spațiului de procesare al aplicației principale. Încă mai amesteci MAPI și .NET, dar într-un proces foarte scurt. Presupunerea este că MAPI și CLR încep să provoace probleme cu procese care rulează mai mult timp.

Folosim biblioteca superbă Redemption Data Objects a lui Dmitry Streblechenko, care ne permite să scriem un astfel de cod "shim" în JScript și invocați acest lucru, care păstrează lumile CLR și MAPI în procese separate, dar într-un mod susținut.

@Chris Fournier re. scrierea unui DLL neangajat. Acest lucru nu va funcționa, deoarece problema este amestecarea MAPI și a codului gestionat în același proces .

0
adăugat

De asemenea, puteți utiliza Outlook Redemption , care este suportat din codul gestionat; Nu sunt sigur imediat dacă are un înlocuitor simplu MAPISendDocuments, dar Dmitriu este util dacă aveți întrebări.

As for "crashes and burns", here's another quote from an MS support guy, here

Este genul de lucru care va funcționa cel mai mult. Va funcționa în timp ce o scrieți. Atunci va funcționa în timp ce îl testați. Va funcționa în timp ce clientul dvs. o evaluează. Apoi, de îndată ce clientul o pune în funcțiune - BAM! Atunci va decide să înceapă să aibă probleme. Și Microsoft nu te va ajuta cu asta, din moment ce ți-am spus să nu faci asta în primul rând. :)

0
adăugat
Cred că posterul se referă la aplicații gestionate care pun o sarcină substanțială pe MAPI. Apelarea MAPISendMail doar la cererea utilizatorului nu va duce probabil la aceleași probleme.
adăugat autor Yuhong Bao, sursa

Pentru cineva cu experiență în MAPI, le-ar lua mai puțin timp pentru a determina codul să facă exact ceea ce doriți din codul neangajat (citiți: C ++ simplu) decât să tastați acest mesaj și să citiți răspunsul (fără infracțiune).

Sunteți norocos că funcționalitatea de care aveți nevoie este limitată. Tot ce aveți nevoie este un simplu utilitar C ++ pentru a lua paramalele de care aveți nevoie pe linia de comandă și pentru a emite apelurile corecte MAPI. Apoi, tot acest utilitar din codul dvs. gestionat la fel cum ați fi executat orice alt proces.

HTH

0
adăugat
Orice șansă ați putea să scoți codul și să îl postați aici?
adăugat autor JoshL, sursa

Ar trebui să puteți să creați un DLL neangajat care să efectueze operațiile pe care doriți să le utilizați utilizând MAPI și apoi să invoca acel DLL din codul gestionat. Nu aș scrie un pachet MAPI drept, dar ceva care îndeplinește toate funcționalitățile necesare de MAPI conținute în acel DLL neangajat. Aceasta ar fi probabil cea mai sigură metodă de a utiliza MAPI din codul gestionat.

0
adăugat

MAPISendDocuments is deprecated and might be removed. You should use MAPISendMail instead. See Simple MAPI

0
adăugat