Hea*_*ore 9 vb.net sql-server exchange-server sql-server-2008
我们有一个旧的遗留SQL 2000服务器(最后的农场) -我们一直无法摆脱这个服务器的,因为它使用xp_findnextmsg,xp_readmail等来监控邮箱(通过MAPI)和导入所有邮件到该地址到数据库.数据库包含存储"从","到","主题","正文","发送日期"等的简单表.
您可能知道,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:我刚刚在这里发现了一个不错的代码示例,它使用了交换2007+中的新Web服务:http://social.msdn.microsoft.com/forums/en-US/sqltools/thread/dd2b465b-b1d2- 4c0d-82ec-c36c6c482d5d - 正在进行实验(有没有人使用过SQL和Exchange Web服务?)
编辑3:全部完成!我敲了一个.net服务,它位于我们的Exchange服务器上并监视邮箱并将任何新邮件推送到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
Run Code Online (Sandbox Code Playgroud)
我首先想到的是 SQL CLR。尽管有解决办法,.net 中并没有专门支持MAPI (至少据我所知)。幸运的是,在许多情况下都支持从交换邮箱中读取数据。
顺便说一句,我发现在 .net 中使用电子邮件相对轻松。