Consistentemente recuperar “de” endereços de email através de versões do Outlook

StackOverflow https://stackoverflow.com/questions/112227

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando um autônomo aplicativo C # ambiente de trabalho que envia documentos e, em seguida, os importa a partir do Outlook quando eles são enviados de volta. As escolhas de aplicação até os e-mails de uma pasta especificada processa-los e, em seguida, salva o nome de remetentes além de outras coisas para um banco de dados.

Isso funciona bem para o Outlook 2003 e 2007 que tem a propriedade SenderEmailAddress. No entanto Outlook 2000 e XP não têm essa propriedade e não consistentemente retornar name@domain.com. Eu estou fornecendo suporte para essas versões.

Eu descobri que uma biblioteca chamada Redenção Outlook vai resolver isso, mas eu estou desenvolvendo no .net e realmente quer para evitar a escrita de registros de clientes. Eu também achei MAPI33 um .Net invólucro em torno MAPI mas não está claro a partir dos fóruns se ele ainda está sendo suportados.

Gostaria de receber quaisquer indicações quanto a uma alternativa .Net para a dll de resgate ou uma abordagem para ser capaz de recuperar de forma consistente um endereço de e-mail em todas as versões do Outlook.

Muitos agradecimentos

AbsFabs

Epílogo: Acabei usando uma solução a partir deste artigo http://support.microsoft.com/kb/324530. É composta por criar uma resposta e, em seguida, extrair a resposta ao endereço do MailItem criado. Funcionou bem para e-mails enviados através da internet e está atualmente passando por testes Exchange Server.

Também achei essa mensagem em minhas viagens http://anoriginalidea.wordpress.com/2008/01/11/getting-the-smtp-email-address-of- um de troca-remetente-de-um-MailItem-de-outlook-in-VBNET-vsto / parece ser um toque envolvidos. Isso pode incluir o meu plano B se a minha implementação existente não sobrevive teste.

Obrigado por seu feedback

AbsFabs

I última instância acabou usando Redenção. Excelente ferramenta para o trabalho. Meu problema foi com ter que registrar a dll quando meu aplicativo foi instalado. Desde meu aplicativo é escrito em dotnet ele não precisa registrar nada. Eu era capaz de contornar o problema de registro dll usando o registro livre de COM.

Muito obrigado pela sua inspiração.

Foi útil?

Solução

Eu estou usando a solução Redemption Outlook em um código de produção C #. Ele funciona muito bem. Com ele, você pode obter o SenderID de uma mensagem de correio (IRDOMail), e de lá, você pode usar o método GetAddressEntryFromID () do objeto IRDOSession.

Outras dicas

Apesar de ter um problema semelhante no trabalho, decidimos ir a rota netMAPI, o que tem causado alguns problemas.

O principal problema com ele é que MAPI conseguiu sua própria memória, como faz .NET o que significa que, ocasionalmente, (nós temos cerca de 300 pessoas que usam nosso software em casa) que causaria o nosso aplicativo falhar, gerando 'erro relatório' as janelas diálogo em vez de nosso próprio diálogo de rastreamento de bugs. Isto foi causado por dois sobrescrevendo cada montões outros memória.

Como nós temos que usar um servidor de troca, fizemos algumas pesquisas e descobriram que se você escreveu o código MAPI em um aplicativo VB6, ele teria o seu próprio espaço de memória e, portanto, não substituir o .NET heap.

É uma forma bastante prolixo de fazer as coisas, mas, até agora, não tivemos problemas, e centenas (se não milhares) de e-mails são enviados por nossa equipe todos os dias.

A boa notícia é que a OU está no caminho certo com rastrear as interfaces adequadas. A má notícia é que 2000 e XP são muito mal suportados no .NET porque eles vieram antes de .NET e apenas com 2003 foi seu um esforço real para obter o COM trabalhando em .NET.

Você solução para estas versões 2000 e XP vai consistir de você rastrear as interfaces COM direita e envolvê-los a si próprio. Eu tive que fazer isso muitas vezes para estes versão do Outlook e nunca é bonita. Então, boa sorte.

A redenção pode ser usado sem instalá-lo no Registro - você pode usar RedemptionLoader em C #, VB.Net, Delphi e C ++.

//tell the app where the 32 and 64 bit dlls are located
//by default, they are assumed to be in the same folder as the current assembly and be named 
//Redemption.dll and Redemption64.dll.  
//In that case, you do not need to set the two properties below
RedemptionLoader.DllLocation64Bit = @"c:\SourceCode\Redemption\redemption64.dll";
RedemptionLoader.DllLocation32Bit = @"c:\SourceCode\Redemption\redemption.dll";
//Create a Redemption object and use it
RDOSession session =  RedemptionLoader.new_RDOSession();
session.Logon(Missing.Value, Missing.Value,  Missing.Value, Missing.Value, Missing.Value,  Missing.Value);

Eu nunca realmente usou essas, mas você pode tentar o Outlook Collaboration Data Objects (CDO). Eles costumavam ser um add-on que você pode instalar com o Outlook, mas agora eles estão sendo fornecidos separadamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top