2012-04-02 13 views
9

Abbiamo un vecchio server SQL 2000 legacy (l'ultimo nella farm) - Non è stato possibile eliminare questo server poiché utilizza xp_findnextmsg, xp_readmail ecc. Per monitorare una cassetta postale (tramite mapi) e importa tutte le email a quell'indirizzo in un database. Il database contiene semplici tabelle che memorizzano "da", "a", "oggetto", "corpo", "Data di invio" & così via.Importa email dalla casella postale AD

Come forse sapete, i procs di cui sopra non sono più in uso in SQL 2005 +

Questa tabella viene letta da decine di sistemi interni, per le email di istanza per questa cassetta postale possono essere raccolti automaticamente dai nostri sistemi di helpdesk & creare chiamate ecc.

La mia domanda è questa: qual è il modo più semplice/moderno per farlo in SQL 2008+? Sarà un caso di scrittura di un .net binario/servizio che utilizzerà smtp o qualcosa per connettersi a una casella di posta e inserire i dati in SQL o c'è un modo più semplice per farlo? (SSIS/strumenti di terze parti/codice/progetti preesistenti?)

Ho solo pensato di chiedere prima di iniziare a scrivere qualcosa - nessun punto di reinventare la ruota per così dire.

PS: La cassetta postale in questione è una cassetta postale di scambio 2010.

Edit: Questa funzionalità è stata accennata per essere reintrodotto nel 2008 & dbmail: http://connect.microsoft.com/SQLServer/feedback/details/126167/xp-readmail-replacement-for-sql-2005 ma sembra che non si è concretizzato!

Edit 2: Ho appena trovato un esempio di codice decente qui che utilizza i nuovi servizi web in cambio 2007+: - (? Qualcuno ha mai lavorato con SQL ei Servizi Web Exchange) http://social.msdn.microsoft.com/forums/en-US/sqltools/thread/dd2b465b-b1d2-4c0d-82ec-c36c6c482d5d la sperimentazione in corso

Modifica 3: tutto fatto! Ho interrotto un servizio .net che si trova sul nostro server di scambio e controlla una casella di posta & inserisce qualsiasi nuova posta in SQL. Incassare altri hanno una domanda simile e hanno bisogno di un codice di esempio per iniziare - ecco un codice approssimativo (tagliato fuori dal mio servizio - sostituito SQL parametrizzato con SQL dinamico di base per una facile lettura): (Nota: avrete bisogno dell'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

Felice tutto ha funzionato per voi. Dovresti spostare la modifica 3 in una risposta in modo che le persone possano votarla :-) – EBarr

risposta

3

La prima cosa che viene in mente per me è SQL CLR. MAPI è not specifically supported in .net (almeno per quanto ne so), anche se ci sono work arounds. La lettura da una cassetta postale di scambio, per fortuna, è supportata in host di situations.

BTW, ho trovato che lavorare con la posta elettronica in .net è relativamente privo di dolore.

+0

EWS sembra essere decisamente la strada da percorrere: impostare la risposta come risposta. – HeavenCore

Problemi correlati