返回首页

简介
我经常使用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;删除原始消息。
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

为DLL创建一个密钥对
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中都配备。

回答

评论会员:baburman 时间:2011/12/07
非常好的文章。帮助我到最后一件事除外... ...我需要知道如何,我会从我的Exchange服务器,如文件://./ backofficestorage / MYDOMAIN /?的公共文件夹的确切的路径?是否有任何工具或命令在Exchange服务器上,在那里我可以得到它,所以我将我的组件绑定?请帮助。将就资源管理器提供我这个信息,我有安装在Exchange服务器
:安迪McNiece
评论会员:游客 时间:2011/12/07
是在Exchange2003
?baburman
评论会员:游客 时间:2011/12/07
。ExchangeServer2007的
安迪McNiece
评论会员:游客 时间:2011/12/07
对于2007年打开Exchange管理控制台。展开"服务器配置",点击邮箱。您应该看到的存储组和数据库文件路径。我不知道如果真的是你问的。我以前只在Exchange2003事件接收器。在Exchange2007上,我写了一个ExchangeWeb服务提供相同的功能
。baburman
评论会员:游客 时间:2011/12/07
感谢您的答复。事实上,我必须抓住"每"从Exchange存储邮箱的邮件,所以,我会得到的电子邮件信息,并发送到Web服务和我在这里卡住:"CSCRIPTregevent.vbs添加..."{BR}特别是这部分:"文件://./backofficestorage/YOURDOMAIN.COM..."{BR}我跟你说什么,但我无法找到这样的路径从Exchange管理控制台。我必须有在MS交换的具体权限,得到这个吗?某处我读到这样的路径-M任何"应该工作。这是正确的吗?如果有的话,我将如何找到系统邮箱的GUID{EB3244444-2343-23423-8506-123455677}?对不起,深拖
baburman
评论会员:游客 时间:2011/12/07
我想我已经得到了该文件的路径应该是这样:一切似乎是建造,安装和注册的罚款。现在的问题是,该行:msg.DataSource.Open(bstrURLItem,没什么,ConnectModeEnum.adModeRead,RecordCreateOptionsEnum.adFailIfNotExists,RecordOpenOptionsEnum.adOpenSource,没什么,没什么)给"访问被拒绝。"例外。我捕获和读取日志文件。请注意,我在C#版本http://www.codeproject.com/KB/cs/csmanagedeventsinkshooks.aspx。语言选择似乎并不在这个典型案例的问题,我想请帮助
!安迪McNiece
评论会员:游客 时间:2011/12/07
语言不应该的问题。你确定你有消息存储正确的权限吗?我记得您试图阅读所有邮箱中的邮件存储
?baburman
评论会员:游客 时间:2011/12/07
是的,我很努力读消息存储的所有邮箱,我想我有持有它虽然我还不能确定。不管怎么说这个问题,我觉得它的信息存储和设置权限?我有使用交换命令Shell或ActiveDirectory中
?baburman
评论会员:游客 时间:2011/12/07
我使用同步事件,OnSyncSave可能是其代码将略高于异步对口。可能的地步开放bstrURLItem不好。是否有任何OnSyncSave文章
?ranjitcherian
评论会员:游客 时间:2011/12/07
我添加了新的定期会议和更新occurance.I试图获得该事件的细节,我occurances.I一系列的细节更新事件sink.But我使用下面的代码 CDO.AppointmentAPP=新CDO.AppointmentClass app.DataSource.Open(bstrURLItem,空,ADODB.ConnectModeEnum.adModeRead,ADODB.RecordCreateOptionsEnum.adFailIfNotExistsADODB.RecordOpenOptionsEnum.adOpenSource",""");{BR}app.StartTime;我需要一个发生更新。请帮我???????????修订于2009年7月1日(星期三),7:46AM
eyanson
评论会员:游客 时间:2011/12/07
?在你的折轴,你的脚本附加到公用文件夹,但我怎么附加脚本,以交换存在任何邮箱{BR}我特罗whith此命令,但事件不会触发,因为的SystemMailbox不更新在发送邮件。regevent.vbs添加"的OnSave;ondelete"ExchangeServerExtension.Monitor米深感谢
eyanson
评论会员:游客 时间:2011/12/07
我解决了这个问题我需要更换IExStoreAsyncEventsIExStoreSyncEvents以注册我使用这个命令:regevent.vbs添加"OnSyncSave;OnSyncDelete"ExchangeServerExtension.Monitor-M任何更多信息:登记店铺范围内的事件imgsrc=http://www.orcode.com/upimg/2011_12_07_11_25_31_2.jpg
会员210133
评论会员:游客 时间:2011/12/07
。嗨,我需要获得msg元素,但我并不需要更改邮箱的权限我明白,如果运行丝毫交互式用户,为什么不能访问msg元素?感谢
。安迪McNiece
评论会员:游客 时间:2011/12/07
我不明白你的问题。我访问的msg元素
。MIRo2k
评论会员:游客 时间:2011/12/07
您好,我需要获得的消息元素,但邮箱只有有权限的用户的邮箱
会员2919009
评论会员:游客 时间:2011/12/07
微软DOCO国"当使用一个组件对象模型(COM)的处理程序处理异步事件,这是最好的处理程序,以创建一个新线程来处理该事件,并立即返回S_PENDING的处理程序已完成处理后,然后调用回存储与IAsyncNotify:完成"我可以看到如何使用新的线程上的Interop.Exevtsnk.IAsyncNotify.completed完成时。我不明白如何返回S_PENDING。谢谢你这个奇妙的例子。它已经给我很大的帮助。
Dabu1
评论会员:游客 时间:2011/12/07
您好,以上的EventSink我已经实现在用户的收件箱和它的伟大工程!(代码)EventSink的作品不错,但有时它会停止,我要重新注册,和我得到的唯一的消息在evtlog.txt的文件,该文件说:在的OnSave打开的消息记录删除异常消息:文件名,目录名或卷标语法不正确,。感谢您的回应/丹尼尔
安迪McNiece
评论会员:游客 时间:2011/12/07
不知道什么你实际上是试图做你的代码,我也不会增加太多。我没有你提到的问题。如果你想发送更多的代码,我会看一看。
jch0001
评论会员:游客 时间:2011/12/07
我eror打开记录,访问被拒绝的消息。我有一个方法来解决这个问题?我按照所有的文件,除"用户"设置为本地服务,我有必要设立"互动模式"让我知道我会非常欣赏它关于
安迪McNiece
评论会员:游客 时间:2011/12/07
您好我从这里的代码,并改装成为C#注册事件CSCRIPTRegEvent.vbs添加"OnSyncSave;OnSyncDelete"abc.test任何事件注册的罚款(再次感谢您的帮助,imgsrc=http://www.orcode.com/upimg/2011_12_07_11_26_20_21.gif)我开始发送邮件出于某种原因,它不会记录甚至试图断点它......但没有是什么?感谢提前
安迪McNiece
评论会员:游客 时间:2011/12/07
检查您的组件。您使用的是什么身份?它是否有足够的权利?您的事件日志可能会显示的东西重新您的组件。你做任何记录?我通常会添加测井测试。你能确认该事件是射击?
Aximili
评论会员:游客 时间:2011/12/07
整个程序是纯收到的邮件记录多数民众赞成它我认为它doesnt火...我如何验证呢?registerd组件的名称是相同的......我在regvents命令给一个右侧compponent的用户,我用TTO注册下沉他是管理员组的成员还能有什么锄我可以检查,如果真的是加载的COM?感谢
安迪McNiece
评论会员:游客 时间:2011/12/07
如果你是记录到一个文本文件的收据,我会添加一个消息事件开始的那一刻。这将至少发射确认事件。我可能会为组件搜索我的注册表,以确保它不是在有多次。我也删除组件,检查注册表以确保它是走了。然后我会添加组件。