2012-04-02 104 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

相关问题