以下的过程,使用的依然都是PROPPATCH和MOVE/COPY方法,具体构造以及调用过程,请参照之前的文章。
接受会议邀请
接受会议邀请是一个复杂的过程。对已一个受邀者来说,他接受到的是Inbox中的一份邀请的EML.要接受邀请,首先要在Calendar中,产生一个会议,同时,还要发出一份Accpeted的邮件。这是两个独立的过程。
1.查找到Inbox中对应指定会议的邮件,得到它的url。
在之前的文章中,我们将一个文件移动到##DavMailSubmissionURI##中以发送会议邀请。那时的文件名,在接受者的Inbox中,并没有任何改变。所以可以直接得到它的url 当然,这个文件的名字就是我们最初创建这个会议时所取的。这是在我们知道eml的名字的条件下。如果我们不知道这个eml具体的文件名,就需要通过SEARCH的方法来获取。具体SEARCH的方法我没有使用,但是网上可以找到具体材料,请自行研究。
同时,我们还要从中取出它的发送者,因为我们还要重写MailHeader里面的内容,换成正确的收件人。无论是接受还是拒绝,收件人都是这个会议邀请的发送者。
2.复制该EML到Calendar中
3.修改Calendar中的该会议使之变成Confirmed状态
-
<?xml version="1.0" ?>
-
<a:propertyupdate
-
xmlns:a="DAV:"
-
xmlns:e=""
-
xmlns:cal="urn:schemas:calendar:"
-
xmlns:mapi="" >
-
<a:set>
-
<a:prop>
-
<e:outlookmessageclass>IPM.Appointment</e:outlookmessageclass>
-
<a:contentclass>urn:content-classes:appointment</a:contentclass>
-
<cal:dtstamp>2007-08-22T16:14:30.492Z</cal:dtstamp>
-
<cal:meetingstatus>CONFIRMED</cal:meetingstatus>
-
<cal:method>REQUEST</cal:method>
-
<mapi:responsestatus>3</mapi:responsestatus>
-
</a:prop>
-
</a:set>
-
</a:propertyupdate>
4.移动该EML到Drafts中
5.修改Drafts中的EML,然后移动到##DavMailSubmissionURI##中。
这里要注意mailheader中的from 结点。这个结点的值,如果不改为当前用户的话,那么虽然接受邮件是当前用户发出的,也就是sender是当前用户,但是from值仍然为原来的的会议的组织者。那么发出的邮件,并不是当前用户接受会议邀请,而是当期用户,代表会议组织者,接受会议,接受会议的是组织者。即是当前用户 be half on 组织者accept。
-
<?xml version="1.0" ?>
-
<a:propertyupdate
-
xmlns:a="DAV:"
-
xmlns:e=""
-
xmlns:cal="urn:schemas:calendar:"
-
xmlns:mapi="urn:schemas:httpmail:"
-
xmlns:mailheader="urn:schemas:mailheader:"
-
xmlns:mapi="" >
-
<a:set>
-
<a:prop>
-
<e:outlookmessageclass>IPM.Schedule.Meeting.Resp.Pos</e:outlookmessageclass>
-
<a:contentclass>urn:content-classes:calendarmessage</a:contentclass>
-
<cal:dtstamp>2007-08-22T16:18:07.532Z</cal:dtstamp>
-
<cal:meetingstatus>CONFIRMED</cal:meetingstatus>
-
<cal:method>REPLY</cal:method>
-
<mapi:subject>Accepted: yourOriginalSubjectHere</mapi:subject>
-
<mailheader:to>to_Email@this_is_the_from_property_value_of_the_received_meeting_request</mailheader:to>
-
whoacceptmeeting@this_is_the_from_property_value_of_the_received_meeting_request
-
<mapi:responsestatus>3</mapi:responsestatus>
-
</a:prop>
-
</a:set>
-
</a:propertyupdate>
6.对于以上2个PROPPATCH的方法,我们都打了时间戳,其格式是:
-
public static String ConvertToTimeStamp(DateTime dt)
-
{
-
return dt.ToString("yyy-MM-ddThh:mm:ss.fffZ");
-
}
拒绝会议邀请:
相比接受,我们只需要将邀请eml修改之后发送即可,无需其他操作。
1.查找到Inbox中对应指定会议的邮件,得到它的url
2.移动该EML到Drafts中
3.修改Drafts中的EML,然后移动到##DavMailSubmissionURI##中。
-
<?xml version="1.0" ?>
-
<a:propertyupdate
-
xmlns:a="DAV:"
-
xmlns:e=""
-
xmlns:cal="urn:schemas:calendar:"
-
xmlns:mapi="urn:schemas:httpmail:"
-
xmlns:mailheader="urn:schemas:mailheader:"
-
xmlns:mapi="" >
-
<a:set>
-
<a:prop>
-
<e:outlookmessageclass>IPM.Schedule.Meeting.Resp.Neg</e:outlookmessageclass>
-
<a:contentclass>urn:content-classes:calendarmessage</a:contentclass>
-
<cal:dtstamp>2007-08-22T15:36:52.696Z</cal:dtstamp>
-
<cal:method>REPLY</cal:method>
-
<header:to>to_Email@this_is_the_from_property_value_of_the_received_meeting_request</header:to>
-
<mailheader:from>whoacceptmeeting@this_is_the_from_property_value_of_the_received_meeting_request</mailheader:from>
-
<mapi:responsestatus>3</mapi:responsestatus>
-
</a:prop>
-
</a:set>
-
</a:propertyupdate>
循环会议
循环会议本质上和单独的会议是一样,只是增加了一些额外的结点,以描述这部分信息。
主要的就是
描述了循环类型。 (好像不要也可以)
最重要的结点,描述了循环的细节。
时区信息, 必须要有。
循环结束时间。
-
<?xml version="1.0"?>
-
-
<propertyupdate xmlns="DAV:"
-
-
xmlns:c="urn:schemas:calendar:"
-
-
xmlns:x="xml:"
-
-
xmlns:ma=""
-
-
xmlns:e="">
-
-
<set>
-
-
<prop>
-
-
<ma:recurtype>2</ma:recurtype>
-
-
<c:instancetype>1</c:instancetype>
-
-
<c:rrule>
-
-
<x:v>FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=TH</x:v>
-
-
</c:rrule>
-
-
<c:timezoneid>10</c:timezoneid>
-
-
<e:patternend>9999-12-31T05:00:00.000Z</e:patternend>
-
-
</>
-
-
</>
-
-
</>
这部分内容描述起来颇为麻烦,因为情况太多。如需了解细节,可以尝试自己建立不同的类型的会议,然后使用第一篇文章中提到的Exchange Explorer具体查看每个结点的值。
直接给出使用的代码。该代码部分实现了一些循环会议的定义。
Reference:
http://weblogs.sqlteam.com/mladenp/archive/2007/08/22/Exchange-Accept-and-Cancel-Meeting-Request-with-WebDav.aspx
http://blogs.msdn.com/b/mstehle/archive/2006/03/10/547991.aspx
阅读(3056) | 评论(2) | 转发(0) |