简介
我经常使用Exchange Server 2003的事件接收器。其中大部分是写在VB6中,我要开始迁移至。Net和使用的Visual Studio 2005作为开发工具。在搜索编码的帮助,我遇到{A}这里的代码项目的文章。虽然C#编写的,它是非常需要过程的启发。在VB.Net做这个项目的步骤不显着不同,但他们确实需要一定的差异。当我搜索了其他地区的代码示例,我从来没有发现任何Logu克里希南与他的文章,没有一个良好的工作。外汇存储事件
本文重点介绍异步事件。具体的事件OnSyncSave和OnSyncDelete。 Logu克里希南前面提到的文章有一个优秀的外汇存储事件描述。水槽的目的
这种下沉的目的是要对邮件启用公用文件夹执行。火灾保存或删除文件夹中的每一个消息的时间。代码提取从邮件的任何附件,并将它们保存到一个目标网络位置,副本消息的一个子文件夹名为"; Processedquot;,然后从原始文件夹中删除它。我没有实际处理附件的代码,但它是相当简单的,我做了各种任务与基于文件夹的目的的附件。我有详细的步骤,以建立和实施水槽。创建项目
使用Windows类库模板创建项目。我有一个名为这个项目EventSinkNet。标记为COM Interop
标记通过点击菜单项目比赛的Interop注册的项目,选择EventSinkNet属性,在左边选择"编译"选项卡,点击底部的COM Interop的注册。
复制必需的文件到项目复制adodb.dll(文件版本7.10.3077.0)从\ Program Files文件\ Microsoft.NET \小学Interop.Assemblies项目目录。复制codex.dll(微软CDO为Microsoft Exchange图书馆 - 文件版本6.5.7650.29)从\ Program Files文件\共同文件\微软共享\ CDO \ cdoex.dll。这是我的Exchange服务器上。复制exoledb.dll(微软Exchange OLEDB服务器 - 文件版本6.5.7651.60)\ EXCHSRVR \ BIN \ exoledb.dll)。这是我的Exchange服务器上。复制exevtsnk.tlb(类型库 - 大小11976字节)从\ Program Files文件\交易所SDK \ SDK \ SUPPORT \ OLEDB \ exevtsnk.tlb创建强名称密钥
使用Visual Studio命令提示符并导航到项目文件夹。用下面的命令创建强名称密钥。SN.EXE - k adodb.keySN.EXE - k cdoex.keySN.EXE - k exoledb.keySN.EXE - k exevtsnk.key创建互操作程序集打开Visual Studio 2005命令提示符并导航到项目文件夹。重点在以下命令中创建EXOLEDB大会
命令的输出可能反映了以下错误,但可以忽略不计
{S2}重点在以下命令中创建CDOEX大会{C}
命令的输出应体现以下
重点在以下命令中创建exevtsnk大会tlbimp exevtsnk.dll /keyfile:exevtsnk.key /out:interop.exevtsnk.dll
命令的输出可能反映了以下错误,但可以忽略不计
引用添加到您的项目
四个DLL的,在你的项目目录中添加引用。
{五}
添加一个参考的System.EnterpriseServices
{中六}
您在您的解决方案资源管理器的参考部分应显示如下
{七}修改AssemblyInfo.vb文件
文件的顶部添加以下
进口的System.EnterpriseServices
插入以下行
"守则"
[Assembly: AssemblyKeyFile(
"EventSinkNet.snk")]
[Assembly: AssemblyKeyName(
"EventSinkNet")]
[Assembly: ApplicationActivation(ActivationOption.Server)>
[Assembly: ApplicationName(
"EventSinkDLL")>
下沉后,它被保存到商店的行为对每个消息。打开每封邮件,网络共享上的文件,并提取每个附件。然后,它的消息复制到子文件夹名为quot; Processedquot;删除原始消息。
为DLL创建一个密钥对Option Explicit On
Option Strict On
'Add project references to the System.EnterpriseServices,
'ADODB, Interop.Exoledb, and SignedExevtsnk .NET components.
Imports System.IO
Imports System.EnterpriseServices
Imports Exoledb = Interop.Exoledb
Imports ExevtsnkLib = Interop.Exevtsnk
Imports CDO = Interop.cdoex
Imports ADODB
Namespace EvSink
Public Class ASyncEvents
Inherits ServicedComponent
Implements Exoledb.IExStoreAsyncEvents
' Logfile path.
Private Const LOGFILE As String = "C:\\evtlog.txt"
Private Const WORKPATH As String = "\\apps00\
shared$\SSWork\"
Public Sub OnDelete(ByVal pEventInfo As interop
.exoledb.IExStoreEventInfo, _
ByVal bstrURLItem As String, ByVal lFlags
As Integer) _
Implements interop.exoledb.IExStoreAsyncEvents
.OnDelete
' do something here
End Sub
Public Sub OnSave(ByVal pEventInfo As interop
.exoledb.IExStoreEventInfo, _
ByVal bstrURLItem As String, ByVal lFlags
As Integer) _
Implements interop.exoledb.IExStoreAsyncEvents
.OnSave
Dim sr As StreamWriter
Dim msg As CDO.IMessage = New CDO.Message
Dim atch As CDO.IBodyPart
Dim rec As ADODB.Record
Dim i As Integer
Dim sURLSuffix As String
Dim sURLPrefix As String
Dim sURLItemTo As String
Dim sAtch As String
' Open the log file, append text to file.
sr = File.AppendText(LOGFILE)
sr.WriteLine("In onsave")
' Parse out the components of the URL
i = InStrRev(bstrURLItem, "/", -1,
CompareMethod.Text)
sURLSuffix = Right(bstrURLItem, Len(
bstrURLItem) - i)
sURLPrefix = Left(bstrURLItem, i)
sURLItemTo = sURLPrefix & "processed/" &
sURLSuffix
' Get the message
Try
msg.DataSource.Open(bstrURLItem, _
Nothing, _
ConnectModeEnum.adModeRead, _
RecordCreateOptionsEnum
.adFailIfNotExists, _
RecordOpenOptionsEnum
.adOpenSource, _
Nothing, Nothing)
sr.WriteLine("Opened message")
' process it
If msg.Attachments.Count > 0 Then
For Each atch In msg.Attachments
sAtch = atch.FileName
atch.SaveToFile(WORKPATH & sAtch)
sr.WriteLine("Saved as: " & sAtch)
Next
End If
' save it to processed folder
msg.DataSource.SaveTo(sURLItemTo)
sr.WriteLine("Saved to: " & sURLItemTo)
atch = Nothing
msg = Nothing
' delete it
rec = New ADODB.Record
rec.Open(sURLPrefix, , ConnectModeEnum
.adModeReadWrite)
rec.DeleteRecord(sURLSuffix)
sr.WriteLine("Deleted record")
rec.Close()
Catch ex As Exception
sr.WriteLine("Record Delete Exception
message: " & ex.Message)
End Try
sr.Close()
End Sub
End Class
End Namespace
编译和复制sn -k EventSinkNet.snk
我手动复制到我的Debug文件夹adodb.dll。现在,从您的Debug或Release文件夹,在Exchange服务器上的文件夹复制文件。注册大会
在Exchange服务器上,打开一个命令提示符中的文件夹中包含的水槽。运行Regasm.exe命令如下所示。该命令应说明quot;类型注册successfullyquot。
创建组件服务Regasm.exe EventSinkNet.dll /codebase
打开管理工具/组件服务安装的DLL。我创建了一个空的应用程序名为"EventSinkNetquot,并通过点击默认选项。我分配一个用户应用程序标识帐户运行下沉。
安装组件
然后我选择组件文件夹下一个名为quot新组件安装的组件; EventSinkNetquot;选择quot;在属性选项; Newquot。我选择了quot;导入组件(S)已经registeredquot;和位于组件命名EventSinkNet.EvSink.ASyncEvents。
注册下沉
水槽可以注册到任何Exchange文件夹。可以使用一个类似下面的脚本文件,登记水槽或外汇资源管理器,您可以使用Exchange SDK中都配备。