MAPI e experiências de código gerenciado?

votos
10

Usando funções MAPI de dentro do código gerenciado é oficialmente suportado. Aparentemente, MAPI usa seu próprio gerenciamento de memória e deixa de funcionar e queima dentro de código gerenciado (ver aqui e aqui )

Tudo o que eu quero fazer é iniciar o cliente de e-mail padrão com o assunto, corpo, e um ou mais anexos .

Então, eu estive olhando para MAPISendDocuments e parece funcionar. Mas eu não tenho sido capaz de reunir coragem para realmente usar a função no código de produção.

Alguém tem usado esta função muito? Você tem alguma história de terror?

PS. Não, eu não vou shellexecute Outlook.exe com argumentos de linha de comando para anexos.

PPS. Suporte de fixação é uma exigência , então mailto: soluções não cortá-la para mim.

Publicado 07/08/2008 em 08:56
fonte usuário
Em outras línguas...                            


8 respostas

votos
7

Tenha um EXE ajudante separado que leva parâmetros de linha de comando (ou tubo para a sua standardInput) que faz o que é necessário e chamar isso de seu aplicativo principal. Isso mantém as coisas MAPI fora do espaço de processo do seu aplicativo principal. OK, você ainda está misturando MAPI e .NET, mas em um processo muito curta duração. O pressuposto é que MAPI eo CLR começar a causar problemas com processos mais longos duração.

Usamos soberba de Dmitry Streblechenko Redemption Data Objects biblioteca que nos permite escrever tal código "calço" no JScript e invocar que, o que mantém os mundos CLR e MAPI em processos separados, mas de uma forma apoiada.

@ Chris Fournier re. escrevendo uma DLL não gerenciada. Isso não vai funcionar porque a questão é a mistura de MAPI e código gerenciado no mesmo processo .

Respondeu 01/09/2008 em 21:26
fonte usuário

votos
2

MAPISendDocuments é substituído e pode ser removido. Você deve usar MAPISendMail vez. Veja Simple MAPI

Respondeu 12/10/2009 em 15:51
fonte usuário

votos
1

Eu fiz isso usando a função MAPISendMail e várias classes internas para embrulhar alguns dos outros estruturas relacionadas MAPI. Enquanto este é o único uso, é possível, embora não trivial para fazer com segurança, pois requer uma atenção muito perto os vários tipos de dados não gerenciados e alocação de memória / desalocação e GC. Embora ainda não é suportado, estou usando isso no código de produção (embora não tenha ainda enviado).

Quando perguntei Matt Stehle sobre isso, a resposta que recebi foi:

Eu realmente não sei de uma maneira muito melhor de fazer isso e quaisquer questões você correu para aqui seria provavelmente reprodutível em um cenário com suporte (ou seja, VB6 ou não gerenciado C ++). Só sei que, se você nunca correu para um cenário eram um problema foi causado especificamente por esta função a ser chamado a partir do .NET que não teria qualquer outra recomendação para você, então não usar .NET.

Não é exatamente uma bênção em usá-lo, mas também não dizendo que há outras opções para realmente fazer isso a partir do código gerenciado.

Respondeu 31/08/2008 em 01:43
fonte usuário

votos
1

Você também pode usar Redenção Outlook , que é suportado a partir do código gerenciado; Eu não sou imediatamente certeza se ele tem um substituto MAPISendDocuments simples, mas Dmitry de útil se você tiver dúvidas.

Quanto a "falhas e queimaduras", aqui está outra citação de um cara suporte MS, aqui

É o tipo de coisa que vai trabalhar principalmente. Ele vai trabalhar enquanto você está escrevendo. Em seguida, ele vai trabalhar enquanto você está testando. Ele vai trabalhar, enquanto o seu cliente está avaliando isso. Então, assim que o cliente implanta - BAM! Isso é quando ele vai decidir começar a ter problemas. E a Microsoft não vai ajudá-lo com isso, uma vez que lhe disse para não fazê-lo em primeiro lugar. :)

Respondeu 27/08/2008 em 16:26
fonte usuário

votos
1

Você deve ser capaz de fazer uma DLL não gerenciado que executa as operações que deseja usando MAPI e, em seguida, chamar essa DLL do seu código gerenciado. Eu não iria escrever um wrapper MAPI reta, mas algo que executa todas as funcionalidades que você precisa de MAPI contida nessa DLL não gerenciado. Isso provavelmente seria a forma mais segura de usar MAPI a partir do código gerenciado.

Respondeu 20/08/2008 em 21:01
fonte usuário

votos
1

Chamando Process.Start sobre o mailto: protocolo (como mostrado abaixo) lhe dará funcionalidade básica, mas não anexos.

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

Você pode fazer essa abordagem com caminhos de fixação, mas esta opção só funciona com alguma versão antiga do Outlook, como 98. Suponho que isso é devido ao potencial risco securty.

Se alguém usa outlook.exe ele vai dar avisos de segurança em Outlook 2003 (e 2007 Dependente da configuração).

Respondeu 07/08/2008 em 12:16
fonte usuário

votos
0

O código a seguir não usa MAPI como tal, mas ele faz abrir a janela "Escrever e-mail" com anexos arbitrárias.

(Na verdade, é inteiramente testado, mas eu cavei-lo em um aplicativo que eu acredito ter trabalhado)

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);
Respondeu 10/12/2010 em 12:58
fonte usuário

votos
-3

Para alguém experiente com MAPI, levaria menos tempo para pôr em marcha o código para fazer exatamente o que você quer de código não gerenciado (leia-se: plain C ++) do que escrever este post e ler a resposta (sem ofensa).

Você tem sorte a funcionalidade que você precisa é limitado. Tudo que você precisa é um utilitário simples C ++ para levar os parâmetros que você precisa na linha de comando e emitir as chamadas MAPI certas. Então, tudo isso utilitário do código gerenciado da mesma forma que tinha de executar qualquer outro processo.

HTH

Respondeu 04/04/2009 em 06:46
fonte usuário

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