MAPI a spravovaný kód zkušenosti?

hlasů
10

Pomocí funkcí MAPI zevnitř spravovaný kód je oficiálně podporován. Zdá se, že MAPI používá vlastní správu paměti a dojde k chybě a hoří ve spravovaném kódu (viz zde a zde )

Všechno, co chci udělat, je spustit výchozí e-mailového klienta s výhradou, těla a jedna nebo více příloh .

Tak jsem se díval do MAPISendDocuments a zdá se do práce. Ale já jsem nebyl schopen shromáždit odvahy, aby skutečně použít funkci ve výrobním kódem.

Má někdo používá tuto funkci hodně? Máte nějaké hororové příběhy?

PS. Ne, nebudu ShellExecute Outlook.exe s argumenty příkazového řádku pro připoutání.

PPS. Podpora nástavec je požadavek , aby mailto: řešení nejsou rozseká ji pro mě.

Položena 07/08/2008 v 08:56
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
7

Mají samostatný pomocník EXE, který bere v příkazového řádku params (nebo potrubí na jeho StandardInput), který dělá to, co je nutné, a volat, že z vaší hlavní aplikace. To udržuje věci MAPI mimo prostoru procesu vaší hlavní app. OK, jste stále smíchání MAPI a .NET, ale ve velmi krátké trvání procesu. Předpokládá se, že MAPI a CLR začít působit problémy s delšími běžící procesy.

Používáme Dmitrije Streblechenko Jedinečné Vykoupení Data Objects knihovna, která nám umožňuje psát takový „podložky“ kód v JScript a vyvolat to, který udržuje světy CLR a MAPI v samostatných procesech, ale v podporované způsobem.

@Chris Fournier znovu. psaní neřízený DLL. To nebude fungovat, protože je problém smíchání MAPI a spravovaný kód ve stejném procesu .

Odpovězeno 01/09/2008 v 21:26
zdroj uživatelem

hlasů
2

MAPISendDocuments je zastaralé a mohou být odstraněny. Měli byste použít namísto MAPISendMail. Viz Simple MAPI

Odpovězeno 12/10/2009 v 15:51
zdroj uživatelem

hlasů
1

Udělal jsem to pomocí funkce MAPISendMail a několik vnitřních tříd zabalit některé z dalších souvisejících MAPI struktur. Tak dlouho, jak je to jediné využití, je možné, i když není triviální dělat bezpečně, jak to vyžaduje velkou pozornost na různé neřízené datové typy a paměť přidělení / deallocation a GC. I když ještě není podporován, já používám to v kódu výroby (i když to dosud dodáno).

Když jsem se zeptal se Matt Stehle o tom, odpověď jsem dostal bylo:

Já opravdu nevím, mnohem lepší způsob, jak to udělat a případné problémy jste narazila na tu by pravděpodobně reprodukovatelné v podporovaném scénáři (tj VB6 nebo neřízený C ++). Jen vím, že pokud se někdy dostali do scénáře byly problém byl způsoben zejména touto funkcí volána z .NET, že nebudeme mít jinou doporučení pro vás, pak nelze použít .NET.

Není zrovna požehnání na používání, ale také neříkám, existují i ​​jiné možnosti, aby skutečně to udělat z spravovaný kód.

Odpovězeno 31/08/2008 v 01:43
zdroj uživatelem

hlasů
1

Dalo by se také použít Outlook Redemption , který je podporován z spravovaný kód; Nejsem si hned jistý, jestli to má jednoduchý MAPISendDocuments výměnu, ale Dmitry je užitečné, pokud máte nějaké dotazy.

Pokud jde o „haváriích a popáleniny“, tady je další citát z podpůrného chlapa MS, zde

Je to jedna z těch věcí, které vám většinou pracují. Bude to fungovat, když jste ji psát. Pak to bude fungovat, když jste ji testovat. Bude to fungovat, když váš zákazník ji hodnotí. Potom, jakmile zákazník ji nasadí - BAM! To je, když to bude rozhodovat, kdo má problémy. A Microsoft se nebude vám pomůže s tím, co jsme vám řečeno, aby to v první řadě. :)

Odpovězeno 27/08/2008 v 16:26
zdroj uživatelem

hlasů
1

Měli byste být schopni provést nespravovaného DLL, která provádí operace, které chcete pomocí MAPI a pak vyvolat že DLL z spravovaný kód. Já bych napsat rovnou obal MAPI, ale něco, co vykonává všechny funkce, které potřebujete MAPI obsažené v tomto nespravovaném DLL. To by pravděpodobně nejbezpečnější způsob, jak používat MAPI z spravovaný kód.

Odpovězeno 20/08/2008 v 21:01
zdroj uživatelem

hlasů
1

Volání process.Start na mailto: protokol (viz níže) vám poskytne základní funkce, ale ne příloh.

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

Můžete to udělat tento přístup s připojovacími cestami, ale tato volba pracuje pouze s nějakou starou verzi, jako je 98. Předpokládám, že je to vzhledem k možnému riziku securty.

Pokud se někdo používat outlook.exe ní dá bezpečnostní varování v rámci aplikace Outlook 2003 (do roku 2007 v závislosti na nastavení).

Odpovězeno 07/08/2008 v 12:16
zdroj uživatelem

hlasů
0

Následující kód nepoužívá MAPI jako takový, ale to otevře okno „Nová zpráva“ libovolných příloh.

(Ve skutečnosti, to je zcela nevyzkoušený, ale já kopal ho v aplikaci, která podle mého názoru, že pracoval)

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);
Odpovězeno 10/12/2010 v 12:58
zdroj uživatelem

hlasů
-3

Že někdo zkušenosti s MAPI, trvalo by jim méně času chrlit kód dělat přesně to, co chcete z nespravovaný kód (číst prostý C ++) než psaní tohoto příspěvku a čtení odpověď (bez urážky).

Máte štěstí, že funkce, které potřebujete, je omezený. Vše, co potřebujete, je jednoduchý C ++ nástroj, aby params, které potřebujete na příkazové řádce a vydávat správné MAPI volání. Potom vše tento nástroj z spravovaný kód, stejně jako byste provést jakýkoli jiný postup.

HTH

Odpovězeno 04/04/2009 v 06:46
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more