2012-04-02 163 views
9

我們有一箇舊的傳統SQL 2000服務器(農場中的最後一個) - 我們一直無法擺脫此服務器,因爲它使用xp_findnextmsg,xp_readmail等來監控郵箱(通過mapi)並將所有電子郵件導入到該數據庫中。該數據庫包含存儲「從」,「至」,「主題」,「主體」,「發送日期」等的簡單表格。從AD郵箱導入電子郵件

正如你可能知道,上面的特效不再使用SQL 2005+

此表由幾十個內部系統,例如電子郵件,此郵箱可以通過我們的服務支持系統可以自動拾取閱讀&建立呼叫等

我的問題是這樣的:它在SQL 2008+這樣做的最簡單的/現代的方式?是否會編寫一個.net二進制/服務,它將使用smtp或某些東西來連接到郵箱並將數據插入到SQL中,或者有更簡單的方法來執行此操作嗎? (SSIS /第三方工具/預先存在的代碼/項目?)

只是覺得我開始寫東西之前,我會問 - 沒有點重新發明輪子,因爲它是。

PS:有問題的郵箱是Exchange 2010郵箱。

編輯:此功能已暗示將重新引入2008年& dbmail:http://connect.microsoft.com/SQLServer/feedback/details/126167/xp-readmail-replacement-for-sql-2005但它看起來像它未能兌現!

編輯2:我剛剛在這裏找到一個體面的代碼示例,利用新的Web服務,以換取2007+: - (?有沒有人用SQL和Exchange Web服務的工作)http://social.msdn.microsoft.com/forums/en-US/sqltools/thread/dd2b465b-b1d2-4c0d-82ec-c36c6c482d5d正在進行試驗

編輯3:全部完成!我打開了一個位於我們的Exchange服務器上的.net服務,並監視一個郵箱&將任何新郵件推送到SQL中。 Incase others有一個類似的問題,需要一些示例代碼來開始 - 這裏有一些粗略的代碼(從我的服務中刪除 - 用基本的動態SQL替換參數化的SQL以方便閱讀):(注意:您需要EWS API 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

很高興爲您準備好了。您應該將編輯3移動到答案中,以便人們可以對其進行投票:-) – EBarr 2012-04-14 12:24:56

回答

3

首先想到的是SQL CLR。 MAPI是not specifically supported in .net(至少據我所知),雖然有work arounds。 幸運的是,在的host中支持從交換郵箱中讀取數據。

BTW,我發現在.NET中使用電子郵件是相對自由的痛苦。

+0

EWS絕對似乎是要走的路 - 將您的答案設置爲答案。 – HeavenCore 2012-04-02 11:59:30