从AD邮箱导入电子邮件



我们有一台旧的旧式SQL 2000服务器(服务器场中的最后一台)-我们无法摆脱此服务器,因为它使用xp_findnextmsgxp_readmail等来监控邮箱(通过mapi)并将该地址的所有电子邮件导入数据库。数据库包含存储"from"、"to"、"subject"、"body"、"Sent Date"&等等。

如您所知,SQL 2005+中不再使用上述proc

该表是从数十个内部系统中读取的,例如,发送到此邮箱的电子邮件可以由我们的服务台系统自动提取;创建呼叫等

我的问题是:在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:我刚刚在这里找到了一个不错的代码示例,它利用了exchange 2007+中的新web服务:http://social.msdn.microsoft.com/forums/en-US/sqltools/thread/dd2b465b-b1d2-4c0d-82ec-c36c6c482d5d-正在进行试验(有人使用过SQL和Exchange web服务吗?)

编辑3:全部完成!我在我们的交换服务器上启动了一个.net服务,它监视一个邮箱&将任何新邮件推送到SQL中。如果其他人有类似的问题,需要一些示例代码才能开始-这里是一些粗略的代码(从我的服务中截取-用基本的动态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("USER@DOMAIN.CO.UK", "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

我首先想到的是SQL CLR。虽然有一些解决方法,但.net并不特别支持MAPI(至少据我所知)。幸运的是,在许多情况下都支持从exchange邮箱进行读取。

顺便说一句,我发现在.net中使用电子邮件相对来说比较轻松。

最新更新