2012-04-02 19 views
9

Tenemos un antiguo servidor SQL 2000 heredado (el último en la granja) - No hemos podido deshacernos de este servidor ya que usa xp_findnextmsg, xp_readmail etc. para monitorear un buzón (a través de mapi) e importar todos los correos electrónicos a esa dirección en una base de datos. La base de datos contiene tablas simples que almacenan "de", "a", "sujeto", "cuerpo", "Fecha de envío" & y así sucesivamente.Importar correo electrónico del buzón de AD

Como usted sabe, los procsos anteriores ya no están en uso en SQL 2005 +

Esta tabla se lee de docenas de sistemas internos, por ejemplo, mensajes de correo electrónico a este buzón pueden ser recogidos automáticamente por nuestros sistemas de helpdesk & crear llamadas, etc.

Mi pregunta es esta: ¿cuál es la forma más fácil/moderna de hacer esto en SQL 2008+? ¿Va a ser un caso de escribir un servicio/binario .net que usará smtp o algo así para conectarse a un buzón e insertar los datos en SQL o hay una forma más sencilla de hacerlo? (SSIS/herramientas de terceros/código/proyectos preexistentes?)

Sólo pensé en preguntar antes de comenzar a escribir algo: no tiene sentido reinventar la rueda como estaba.

PD: El buzón en cuestión es un buzón de intercambio 2010.

Editar: Esta funcionalidad se dio a entender que ser re-introducido en 2008 & dbmail: http://connect.microsoft.com/SQLServer/feedback/details/126167/xp-readmail-replacement-for-sql-2005 pero parece que no se materializó!

Editar 2: Acabo de encontrar un ejemplo de código decente aquí que utiliza los nuevos servicios web a cambio 2007+: - (? Alguien ha trabajado con SQL y los servicios web de Exchange) http://social.msdn.microsoft.com/forums/en-US/sqltools/thread/dd2b465b-b1d2-4c0d-82ec-c36c6c482d5d experimentación en curso

Editar 3: ¡listo! Cogí un servicio .net que se encuentra en nuestro servidor de intercambio y supervisa un buzón & empuja cualquier correo nuevo en SQL. En caso de que otros tengan una pregunta similar y necesiten algún código de muestra para empezar, aquí hay un código aproximado (cortado de mi servicio) SQL reemplazado y parametrizado con SQL dinámico básico para facilitar la lectura: (Nota: necesitarás la API EWS 1.1 dll)

Imports Microsoft.Exchange.WebServices.Data 

Dim ExchangeUrl As String = "https://DOMAIN.co.uk/ews/exchange.asmx" 
Dim service As New ExchangeService(ExchangeVersion.Exchange2010_SP1) 
service.Url = New Uri(ExchangeUrl) 
service.Credentials = New WebCredentials("[email protected]", "PASSWORD") 
Dim findResults As FindItemsResults(Of Item) = service.FindItems(WellKnownFolderName.Inbox, New ItemView(1000)) 
If findResults.Count > 0 Then 
    service.LoadPropertiesForItems(findResults.Items, New PropertySet(BasePropertySet.FirstClassProperties)) 
End If 

For Each item As Item In findResults.Items 
    Dim CurrentEmail As EmailMessage = item 

    '#### Grab Email Information 
    E_ID = CurrentEmail.InternetMessageId.ToString() 
    If CurrentEmail.Sender.Address.ToString() <> "" Then 
     E_From = Replace(CurrentEmail.Sender.Address, "'", "''") 
    Else 
     E_From = Replace(CurrentEmail.Sender.Name, "'", "''") 
    End If 
    E_From = Replace(CurrentEmail.Sender.Address, "'", "''") 
    E_To = Replace(CurrentEmail.DisplayTo, "'", "''") 
    E_CC = Replace(CurrentEmail.DisplayCc, "'", "''") 
    E_Subject = Replace(CurrentEmail.Subject, "'", "''") 
    E_Body = Replace(CurrentEmail.Body.Text, "'", "''") 
    E_Received = CurrentEmail.DateTimeReceived.ToString("dd/MM/yyyy HH:mm:ss") 
    E_Sent = CurrentEmail.DateTimeSent.ToString("dd/MM/yyyy HH:mm:ss") 

    '#### Save the email into SQL 
    If SqlQuery("INSERT INTO tbl_Emails ([MessageID], [From], [To], [CC], [Subject], [Body], [Received], [Sent]) VALUES ('" & E_ID & "', '" & E_From & "', '" & E_To & "', '" & E_CC & "', '" & E_Subject & "', '" & E_Body & "', CONVERT(DATETIME, '" & E_Received & "', 103), CONVERT(DATETIME, '" & E_Sent & "', 103))") = True Then 
     item.Delete(DeleteMode.HardDelete) 
    End If 
Next 
+2

Me alegro de todo lo que funcionó para usted. Debes mover la edición 3 a una respuesta para que la gente pueda votarla :-) – EBarr

Respuesta

3

Lo primero que me viene a la mente es SQL CLR. MAPI es not specifically supported en .net (al menos que yo sepa), aunque hay work arounds. Leyendo desde un buzón de intercambio, afortunadamente, es compatible con host de situations.

Por cierto, he encontrado que trabajar con el correo electrónico en .net es relativamente sencillo.

+0

EWS definitivamente parece ser el camino a seguir, configurando tu respuesta como respuesta. – HeavenCore

Cuestiones relacionadas