Vra

Die gebruik van MAPI funksies van binne daarin geslaag kode is amptelik nie ondersteun word. Blykbaar, MAPI gebruik sy eie geheue bestuur en dit omval en brandwonde in beheer kode (sien hier en hier )

Al wat ek wil doen, is die bekendstelling van die standaard e-pos kliënt met onderwerp, liggaam, en een of meer aanhegsels .

Ek is op soek na MAPISendDocuments en dit blyk te werk. Maar ek is nie in staat om moed bymekaar om die funksie eintlik gebruik in die produksie-kode nie.

Het enigiemand gebruik hierdie funksie 'n baie? Het jy enige horror stories?

PS. Nee, ek sal nie Execute Outlook.exe met command line argumente vir aanhegsels.

PPS. Attachment ondersteuning is 'n vereiste , sodat mailto:. Oplossings hoef dit nie te sny vir my

Was dit nuttig?

Oplossing

'n aparte helper EXE dat command-line params neem (of pyp aan sy StandardInput) wat doen wat nodig is en noem dat van jou hoof app. Dit hou die MAPI dinge buite proses ruimte jou hoof app se. OK, jy nog steeds meng MAPI en NET maar in 'n baie korte duur proses. Die veronderstelling is dat MAPI en die CLR begin veroorsaak probleme met langer loop prosesse.

Ons gebruik Dmitri Streblechenko se uitstekende Redemption Data Objects biblioteek wat ons toelaat om so 'n "shim" kode te skryf in JScript en roep dat, wat die CLR en MAPI wêrelde in afsonderlike prosesse hou, maar in 'n gesteun mode.

@Chris Fournier re. skryf 'n onbeheerde DLL. Dit sal nie werk nie, want die probleem is die vermenging van MAPI en bestuur kode in dieselfde proses .

Ander wenke

MAPISendDocuments is afgekeur en kan verwyder word. Jy moet MAPISendMail plaas gebruik. Sien Simple MAPI

Oproep process.Start op die mailto: protokol (soos hieronder getoon) sal jy basiese funksies, maar nie aanhegsels gee.

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

Jy kan hierdie benadering met beslaglegging paaie te doen, maar hierdie opsie werk net met 'n paar ou weergawe van Outlook soos 98. Ek neem aan dit is te danke aan die potensiaal securty risiko.

As iemand gebruik Outlook.exe dit sal sekuriteit waarskuwings onder vooruitsigte 2003 (en 2007 Afhangende van instellings) gee.

Jy moet in staat wees om 'n onbeheerde DLL dat die bedrywighede wat jy wil met behulp van MAPI voer maak, en dan roep dat DLL uit jou beheer kode. Wou ek dit nie 'n reguit MAPI wrapper, maar iets wat al die funksies wat jy nodig het van MAPI vervat in daardie onbeheerde DLL voer. Dit sou waarskynlik die veiligste manier om MAPI gebruik van bestuurde kode wees.

Jy kan ook gebruik Outlook Redemption , wat ondersteun van beheer kode, Ek is nie onmiddellik seker of dit 'n eenvoudige MAPISendDocuments vervanging, maar Dmitri se nuttig as jy vrae het.

As vir "ineenstort en brandwonde", hier is nog 'n aanhaling uit 'n MS ondersteuning man, hier

  

Dit is die soort van ding wat meestal sal werk. Dit sal werk terwyl jy dit skryf. Dan is dit sal werk terwyl jy dit toets. Dit sal werk terwyl jou kliënt is te evalueer. Dan so gou as die kliënt ontplooi dit - BAM! Dis toe dat dit sal besluit om te begin met probleme. En Microsoft is nie gonna help jy met dit, aangesien ons vir julle gesê om dit nie te doen in die eerste plek. :)

Ek het dit gedoen met behulp van die MAPISendMail funksie en verskeie interne klasse aan 'n paar van die ander MAPI verwante strukture draai. Solank as wat dit is die enigste gebruik, is dit moontlik hoewel nie triviaal om veilig te doen as dit 'n baie baie aandag aan die verskillende onbeheerde datatipes en geheuetoekenning / deallocation en GC vereis. Terwyl dit nog nie ondersteun nie, gebruik ek dit in produksie-kode (alhoewel dit nog nie het gestuur).

Wanneer ek Matt Stehle gevra oor hierdie, die antwoord wat ek ontvang het was:

  

Ek weet regtig nie van 'n baie beter manier om dit te doen en enige probleme wat jy het in hier waarskynlik reproduceerbare in 'n gesteun scenario (maw VB6 of onbeheerde C ++) sou wees. weet net dat as jy ooit gehardloop in 'n scenario is 'n kwessie is spesifiek veroorsaak deur hierdie funksie genoem van NET dat ons enige ander aanbeveling vir jou nie dan sou hê om nie te gebruik NET.

Nie juis 'n seën op die gebruik daarvan nie, maar ook nie te sê daar is geen ander opsies om hierdie werklikheid te doen van beheer kode.

Die volgende kode nie gebruik MAPI as sodanig nie, maar dit maak die venster "Nuwe boodskap" met arbitrêre aanhegsels.

(eintlik, dis heeltemal ongetoets maar ek grawe it up in 'n program wat ek glo aan gewerk het)

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

Vir iemand wat ondervind word met MAPI, dit sal hulle minder tyd in beslag neem om crank uit die kode om presies wat jy wil uit onbeheerde kode doen (lees: plain C ++) as tik hierdie post en lees die reaksie (geen oortreding)

Jy is gelukkig die funksies wat jy nodig het is beperk. Al wat jy nodig het is 'n eenvoudige C ++ program om die params wat jy nodig het op die command-line neem kennis en reik die reg MAPI oproepe. Dan, jy al hierdie program uit jou beheer kode, net soos jy wil met enige ander proses uit te voer.

HTH

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top