Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从广告邮箱导入电子邮件_Sql Server_Vb.net_Sql Server 2008_Exchange Server - Fatal编程技术网

Sql server 从广告邮箱导入电子邮件

Sql server 从广告邮箱导入电子邮件,sql-server,vb.net,sql-server-2008,exchange-server,Sql Server,Vb.net,Sql Server 2008,Exchange Server,我们有一台旧式SQL 2000服务器(服务器场中的最后一台)——我们无法摆脱这台服务器,因为它使用xp\u findnextmsg,xp\u readmail等来监视邮箱(通过mapi)并将所有电子邮件导入该地址到数据库中。数据库包含存储“from”、“to”、“subject”、“body”、“Sent Date”等的简单表 您可能知道,上述过程在SQL 2005中不再使用+ 此表是从几十个内部系统读取的,例如,发送到此邮箱的电子邮件可以由我们的帮助台系统和创建呼叫等自动拾取 我的问题是:在S

我们有一台旧式SQL 2000服务器(服务器场中的最后一台)——我们无法摆脱这台服务器,因为它使用
xp\u findnextmsg
xp\u readmail
等来监视邮箱(通过mapi)并将所有电子邮件导入该地址到数据库中。数据库包含存储“from”、“to”、“subject”、“body”、“Sent Date”等的简单表

您可能知道,上述过程在SQL 2005中不再使用+

此表是从几十个内部系统读取的,例如,发送到此邮箱的电子邮件可以由我们的帮助台系统和创建呼叫等自动拾取

我的问题是:在SQL 2008+中,最简单/最现代的方法是什么?是编写一个.net二进制/服务,使用smtp或其他方式连接到邮箱并将数据插入SQL,还是有更简单的方法?(SSI/第三方工具/预先存在的代码/项目?)

我只是想在我开始写东西之前问一下——没有必要重新发明原来的轮子

PS:问题中的邮箱是exchange 2010邮箱

编辑:这项功能曾暗示将在2008年重新推出&dbmail:但它似乎没有实现

编辑2:我在这里找到了一个不错的代码示例,它使用了exchange 2007+中的新web服务:-正在进行试验(有人使用过SQL和exchange web服务吗?)

编辑3:全部完成!我启动了一个位于exchange服务器上的.net服务,它监视邮箱并将任何新邮件推送到SQL中。如果其他人有类似的问题,需要一些示例代码来开始-这里是一些粗略的代码(从我的服务中删去-用基本动态SQL替换参数化SQL以便于阅读):(注意:您需要EWS API 1.1 dll)

导入Microsoft.Exchange.WebServices.Data
Dim ExchangeUrl作为字符串=”https://DOMAIN.co.uk/ews/exchange.asmx"
Dim服务作为新的ExchangeService(ExchangeVersion.Exchange2010\u SP1)
service.Url=新Uri(ExchangeUrl)
service.Credentials=新的WebCredentials(“USER@DOMAIN.CO.UK“,“密码”)
Dim findResults As FindItemsResults(项目的)=service.FindItems(WellKnownFolderName.Inbox,新项目视图(1000))
如果findResults.Count>0,则
服务.LoadPropertiesForItems(findResults.Items,新属性集(BasePropertySet.FirstClassProperties))
如果结束
对于findResults.Items中的每个项目作为项目
Dim CurrentEmail As EmailMessage=项目
“#####抓取电子邮件信息
E_ID=CurrentEmail.InternetMessageId.ToString()
如果CurrentEmail.Sender.Address.ToString()“”则
E_From=Replace(CurrentEmail.Sender.Address,“”,“”)
其他的
E_From=Replace(CurrentEmail.Sender.Name,“”,“”)
如果结束
E_From=Replace(CurrentEmail.Sender.Address,“”,“”)
E_To=替换(CurrentEmail.DisplayTo,“,”)
E_CC=Replace(currentmail.DisplayCc,“”,“”)
E_Subject=Replace(currentmail.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”)
“#####将电子邮件保存到SQL中
如果SqlQuery(“插入tbl_电子邮件([MessageID]、[From]、[To]、[CC]、[Subject]、[Body]、[Received]、[Sent])值(“&E_ID&”、“&E_From&”、“&E_To&”、“&E_CC&”、“&E_Subject&”、“&E_Body&”、转换(DATETIME)、“&E_Received&”、”103)、转换(DATETIME)、“&E_Sent&”、”103))=True,则为True
item.Delete(DeleteMode.HardDelete)
如果结束
下一个

我首先想到的是SQL CLR。MAPI在.net中(至少据我所知),尽管有。 幸运的是,在的中支持从exchange邮箱读取


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

EWS似乎绝对是一种选择——将您的回复设置为答案。很高兴您一切顺利。您应该将“编辑3”移动到一个答案,以便人们可以对其进行投票:-)
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