2009-05-14 23 views
14

¿Sabes si hay una manera?Acceso intercambio de correo electrónico en C#

He usado this library para acceder a un servidor pop3, pero no funciona con un servidor de intercambio.

¿Conoces alguna otra biblioteca o código que me muestre cómo hacerlo?

No puedo cambiar ninguna configuración en el servidor.

+0

¿Qué versión de Intercambio? Si está usando 2007, podría darle un código de muestra para los servicios web de Exchange ... –

+0

Es Exchange 2003 – juan

Respuesta

1

Debe usar Exchange SDK si POP3 no está habilitado en el servidor de Exchange. Otra opción es usar WebDAV.

1

usted podría utilizar esta biblioteca: http://www.dimastr.com/redemption/

+0

Que busca acceder a Outlook, no a Exchange. Diferencia sutil (pero importante). –

+0

Redemption tiene un contenedor CDO llamado RDO y objetos Safe * Item que funcionan junto con OOM – 76mel

+0

No, también es compatible con Exchange. Puede usar ProfMan para construir un perfil temporal para acceder a una tienda de Exchange – Christian

1

Otra opción es configurar Exchange para habilitar IMAP4. Existen bibliotecas de terceros IMAP4 para .NET, p. rebex.

+0

No puedo cambiar ninguna configuración en el servidor – juan

1

Puede usar EWS (Exchange webservices) a partir de Exchange 2007. Parecen estar siempre instalados y son mejor compatibles que Webdav.

Puede importar el servicio web desde su Exchangeserver (busque un archivo asmx en el directorio de instalación). ¡Puede descargar archivos EML de sus correos y hacer muchas más cosas!

17

Si usa Exchange 2007 y tiene servicios web habilitados, esto es bastante fácil. He añadido un clásico de referencia Web 2.0 al estilo de mi proyecto VS2008, y puedo conseguir los mensajes de correo de esta manera:

// exchange 2007 lets us use web services to check mailboxes. 
using (ExchangeServiceBinding exchangeServer = new ExchangeServiceBinding()) 
{ 
    ICredentials creds = new NetworkCredential("user","password"); 
    exchangeServer.Credentials = creds; 
    exchangeServer.Url = "https://myexchangeserver.com/EWS/Exchange.asmx"; 
    FindItemType findItemRequest = new FindItemType(); 
    findItemRequest.Traversal = ItemQueryTraversalType.Shallow; 

    // define which item properties are returned in the response 
    ItemResponseShapeType itemProperties = new ItemResponseShapeType(); 
    itemProperties.BaseShape = DefaultShapeNamesType.AllProperties; 
    findItemRequest.ItemShape = itemProperties; 

    // identify which folder to search 
    DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1]; 
    folderIDArray[0] = new DistinguishedFolderIdType(); 
    folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox; 

    // add folders to request 
    findItemRequest.ParentFolderIds = folderIDArray; 

    // find the messages 
    FindItemResponseType findItemResponse = exchangeServer.FindItem(findItemRequest); 

    // read returned 
    FindItemResponseMessageType folder = (FindItemResponseMessageType)findItemResponse.ResponseMessages.Items[0]; 
    ArrayOfRealItemsType folderContents = new ArrayOfRealItemsType(); 
    folderContents = (ArrayOfRealItemsType)folder.RootFolder.Item; 
    ItemType[] items = folderContents.Items; 

    // if no messages were found, then return null -- we're done 
    if (items == null || items.Count() <= 0) 
     return null; 

    // FindItem never gets "all" the properties, so now that we've found them all, we need to get them all. 
    BaseItemIdType[] itemIds = new BaseItemIdType[items.Count()]; 
    for (int i = 0; i < items.Count(); i++) 
     itemIds[i] = items[i].ItemId; 

    GetItemType getItemType = new GetItemType(); 
    getItemType.ItemIds = itemIds; 
    getItemType.ItemShape = new ItemResponseShapeType(); 
    getItemType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties; 
    getItemType.ItemShape.BodyType = BodyTypeResponseType.Text; 
    getItemType.ItemShape.BodyTypeSpecified = true; 

    GetItemResponseType getItemResponse = exchangeServer.GetItem(getItemType); 
    ItemType[] messages = new ItemType[getItemResponse.ResponseMessages.Items.Count()]; 

    for (int j = 0; j < messages.Count(); j++) 
     messages[j] = ((ItemInfoResponseMessageType)getItemResponse.ResponseMessages.Items[j]).Items.Items[0]; 

    return messages; 
} 

los "mensajes" variable será una serie de ItemType objetos devueltos de intercambio que tiene todas las propiedades esperarías un mensaje de correo (cuerpo, archivos adjuntos, etc.). ¡Espero que esto ayude!

+0

¡Gran muestra! Gracias :-) –

3

Supongo que su problema es que su servidor de intercambio solo es compatible con la autenticación NTLM y no permite la autenticación de texto sin formato. O tal vez no estés usando la convención de nombre de usuario adecuada. Por ejemplo, puede intentar usar el formato nombredeusuario @ dominio, donde el dominio es el dominio NT interno que podría no ser el mismo que su dominio de Internet.

Si ese es el caso, busque una biblioteca que admita NTLM.

fases de ensayo a través de telnet

comando Ir a pronta tipo : my.server.com telnet 110 debería obtener una respuesta de su servidor de intercambio como éste + OK Microsoft Exchange Server 2003 versión 6.5 servidor POP3 .7638.1 (my.server.com) listo.Tipo

: CAPA esto debe devolver la lista de las capacidades de su servidor de Exchange es compatible. CAPA + lista de capacidades OK sigue TOP USUARIO PIPELINING TERMINA NUNCA UIDL SASL NTLM .

en cuenta que la mina no muestra NORMAL

Aquí es una respuesta de un servidor de correo electrónico que hace + OK Palomar listo. CAPA + OK CAPA SUPERIOR UIDL PRAE-CÓDIGOS PIPELINING STLS USUARIO SASL NORMAL .

Si su respuesta no incluye NORMAL y luego se detiene a medida que necesita una biblioteca que soporta SPA

Tipo: usuario usuario O Tipo: [email protected] usuario reemplazar domain.corp con su dominio

a continuación, debe recibir + OK

Tipo: pasar mypass

debe obtener una respuesta + O K tipo

: Lista

debe obtener una lista de correos electrónicos. Esto podría ayudar a ver si su problema es un problema de formato de nombre de usuario.

5

El uso de sistemas de alerta temprana directamente en código administrado (VB.net/C#) es torpe decir la mejor.

He estado buscandolo algunos días y he llegado a la conclusión de que es mejor crear mis propias clases de contenedor en torno a la API, haciendo que los servicios se puedan utilizar en una o dos líneas de código, no la página con la implementación actual.

adivina qué? Microsoft me ha convencido: el primer Candidato de lanzamiento de la API administrada de Exchange Web Services está disponible para descargar here.

Instalar, registrar la referencia dll (\ Archivos de programa \ Microsoft \ Exchange \ Web Services \ 1.0 \ Micorosft.Exchange.WebServices.dll), e importar el espacio de nombres (Microsoft.Exchange.WebServices.Data) y usted listo para rodar.

2

escribí esto para obtener correo electrónico de mi bandeja de entrada. Tengo una tarea tediosa que hacer todas las mañanas si hay un correo electrónico, así que escribí este fragmento de código para consultar mi título de correo electrónico en la carpeta. Agregué un poco de creación xml para mostrar las posibilidades. No es intercambio, pero funciona en mi caso. XCData codifica cualquier char especial en el cuerpo. supongo que debería señalar que asunto del correo electrónico que estoy buscando es [entradas - Soporte # 12345]

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Outlook = Microsoft.Office.Interop.Outlook; 
using Microsoft.Office; 
using System.Xml.Linq; 

namespace ProcessEmail 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Outlook.Application outlook = new Outlook.Application(); 
      Outlook.NameSpace ns = outlook.GetNamespace("Mapi"); 
      object _missing = Type.Missing; 
      ns.Logon(_missing, _missing, false, true); 

      Outlook.MAPIFolder inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 

      int unread = inbox.UnReadItemCount; 
      XElement xmlMail = new XElement("Mail"); 
      foreach (Outlook.MailItem mail in inbox.Items) 
      {    
       string s = mail.Subject; 

       if (s != null) 
       { 
        if (s.Contains("Tickets") || (s.Contains("Support"))) 
        { 
         string[] splitter = s.Split('#'); 
         string[] split = splitter[1].Split(']');      
         string num = split[0].Trim(); 

         XElement mailrow = new XElement("MailRow", 
          new XElement("Ticket_Number",num), 
          new XElement("Subject", mail.Subject), 
          new XElement("Body", new XCData(mail.Body)), 
          new XElement("From", mail.SenderEmailAddress) 
          ); 
         xmlMail.Add(mailrow); 
        } 
       } 

      } 
      xmlMail.Save("E:\\mailxml.xml"); 


     } 
    } 
} 

Matt

1

Puede utilizar Exchange Web Services (Exchange 2007 o 2010) o WebDav (Intercambio de hasta hasta 2007, 2010 no es compatible con WebDAV), pero la API y la implementación pueden ser un poco engorrosas si desea hacer un desarrollo rápido.

He utilizado las bibliotecas de IndependentSoft para WebDav y Exchange Web Services con éxito en el pasado, que proporcionan un envoltorio alrededor de las API de Exchange y son mucho más simples de usar. Se encargan de analizar el mensaje y MIME bastante bien también.

0
  1. El API actualmente preferido (en Exchange 2013 y 2016) es EWS. Está basado exclusivamente en HTTP y se puede acceder desde cualquier idioma, pero hay .Net y Java bibliotecas específicas.

    Puedes usar EWSEditor para jugar con la API.

  2. Extended MAPI. Esta es la API nativa utilizada por Outlook. Termina utilizando el proveedor MSEMS Exchange MAPI, que puede hablar con Exchange utilizando RPC (Exchange 2013 ya no lo admite) o RPC-over-HTTP (Exchange 2007 o posterior) o MAPI-over-HTTP (Exchange 2013 y posteriores).

    La API en sí misma solo se puede acceder desde C++ no administrado o Delphi. También puede usar Redemption (cualquier idioma) - su familia de objetos RDO es un contenedor MAPI extendido. Para utilizar MAPI extendido, necesita instalar Outlook o standalone (Exchange) version of MAPI (en soporte extendido, y no admite archivos Unicode PST y MSG y no puede acceder a Exchange 2016). MAPI extendido se puede usar en un servicio.

    Puedes jugar con la API usando OutlookSpy o MFCMAPI.

  3. Outlook Object Model - No es específico de Exchange, pero permite el acceso a todos los datos disponibles en Outlook en la máquina donde se ejecuta el código. No se puede usar en un servicio.

  4. Exchange Active Sync. Microsoft ya no invierte recursos significativos en este protocolo.

  5. Outlook utilizado para instalar la biblioteca CDO 1.21 (ajusta MAPI extendido), pero Microsoft lo desaprobó y ya no recibe ninguna actualización.

  6. Solía ​​haber un contenedor .NET MAPI de terceros llamado MAPI33, pero ya no se está desarrollando ni admitiendo.

  7. WebDAV: obsoleto.

  8. Objetos de datos en colaboración para Exchange (CDOEX): obsoleto.

  9. Exchange OLE DB Provider (EXOLEDB): obsoleto.

Cuestiones relacionadas