我正在使用Exchange Web服务托管API和联系人数据.我有以下代码,它是功能性的,但并不理想:
foreach (Contact c in contactList)
{
string openItemUrl = "https://" + service.Url.Host + "/owa/" + c.WebClientReadFormQueryString;
row = table.NewRow();
row["FileAs"] = c.FileAs;
row["GivenName"] = c.GivenName;
row["Surname"] = c.Surname;
row["CompanyName"] = c.CompanyName;
row["Link"] = openItemUrl;
//home address
try { row["HomeStreet"] = c.PhysicalAddresses[PhysicalAddressKey.Home].Street.ToString(); }
catch (Exception e) { }
try { row["HomeCity"] = c.PhysicalAddresses[PhysicalAddressKey.Home].City.ToString(); }
catch (Exception e) { }
try { row["HomeState"] = c.PhysicalAddresses[PhysicalAddressKey.Home].State.ToString(); }
catch (Exception e) { }
try { row["HomeZip"] = c.PhysicalAddresses[PhysicalAddressKey.Home].PostalCode.ToString(); }
catch …Run Code Online (Sandbox Code Playgroud) 我正在使用Exchange Web服务托管API来处理任务(Exchange 2007 SP1).我可以创造它们.但是,当我尝试进行更新时,它适用于除.Body字段之外的所有字段.每当我尝试访问(读取/更新)该字段时,它都会出现以下错误:
"You must load or assign this property before you can read its value."
Run Code Online (Sandbox Code Playgroud)
我使用的代码如下所示:
//impersonate the person whose tasks you want to read
Me.Impersonate(userName); //home-made function to handle impersonation
//build the search filter
Exchange.SearchFilter.SearchFilterCollection filter = New Exchange.SearchFilter.SearchFilterCollection();
filter.Add(New Exchange.SearchFilter.IsEqualTo(Exchange.TaskSchema.Categories, "Sales"));
//do the search
EWS.Task exTask = esb.FindItems(Exchange.WellKnownFolderName.Tasks, filter, New Exchange.ItemView(Integer.MaxValue));
exTask.Subject = txtSubject.Text; //this works fine
exTask.Body = txtBody.Text; //This one gives the error implying that the object isn't loaded
Run Code Online (Sandbox Code Playgroud)
奇怪的是,检查属性包显示该对象包含33个属性,但{Body}不是其中之一.该属性似乎是从基类.Item或其他东西继承而来的.
那么,我是否需要将对象重新加载为类型Item?或者通过.Bind或其他东西重装?请记住,我需要使用数千个项目来完成此操作,因此效率对我来说很重要.
我正在使用自动发现服务Url来获取指定的电子邮件地址.
ExchangeService Service = new ExchangeService(ExchangeVersion.Exchange2010);
Service.Credentials = new WebCredentials("username@domainname.com", "Password");
Service.AutodiscoverUrl("username@domainname.com");
Folder inbox = Folder.Bind(Service, WellKnownFolderName.Inbox);
Console.WriteLine("The folder name is" + inbox.DisplayName.ToString());
Run Code Online (Sandbox Code Playgroud)
如果我喜欢这样,我会犯一个错误:
无法找到自动发现服务
我必须做些什么来避免这个错误?
我正在使用Exchange Web服务托管API 1.1连接到Exchange Server 2010,然后找到收到的新电子邮件.现在我想将.msg文件的副本保存到磁盘上的文件夹中.
我不想使用任何付费第三方进行整合.
任何帮助将不胜感激.
我们在Exchange 2007公用文件夹中设置了公司的公共日历.我可以使用下面的代码检索当天的个人日历约会.我在网上搜索了高低,我找不到有人从公共文件夹日历中检索日历信息的例子.
它似乎应该是可行的,但我不能为我的生活让它工作.如何修改以下代码以访问日历?我对通过asp.net创建任何约会不感兴趣,只是检索一个简单的列表.我也对任何其他建议持开放态度.谢谢.
ADDED BOUNTY
- 我不可能是唯一需要这样做的人.让我们为后代解决这个问题.
由于无知而再次更新
- 我没有提到我正在研究的项目是.NET 2.0(你觉得非常重要吗?).
*将我的代码解决方案BELOW*
-我已经取代了我原来的代码示例与该结束了工作的代码.非常感谢奥列格提供的代码,以查找公用文件夹,这是最难的部分.我已经从这里修改使用示例代码http://msexchangeteam.com/archive/2009/04/21/451126.aspx使用更简单的FindAppointments方法.
这个简单的示例返回带约会的html字符串,但您可以将其用作基础来根据需要进行自定义.您可以在下面的答案中看到我们的来回.
using System;
using Microsoft.Exchange.WebServices.Data;
using System.Net;
namespace ExchangePublicFolders
{
public class Program
{
public static FolderId FindPublicFolder(ExchangeService myService, FolderId baseFolderId,
string folderName)
{
FolderView folderView = new FolderView(10, 0);
folderView.OffsetBasePoint = OffsetBasePoint.Beginning;
folderView.PropertySet = new PropertySet(FolderSchema.DisplayName, FolderSchema.Id);
FindFoldersResults folderResults;
do
{
folderResults = myService.FindFolders(baseFolderId, folderView);
foreach (Folder folder in folderResults)
if (String.Compare(folder.DisplayName, folderName, StringComparison.OrdinalIgnoreCase) == 0)
return folder.Id;
if (folderResults.NextPageOffset.HasValue)
folderView.Offset = folderResults.NextPageOffset.Value;
} …Run Code Online (Sandbox Code Playgroud) c# asp.net web-services exchange-server-2007 ews-managed-api
使用Exchange 推送通知我一直在创建一个同步来自Office365用户的日历数据的服务.我一直在使用Office365 Calendar REST API(用于获取和管理日历)和EWS API(用于订阅日历更改)的组合.
我注意到最近MS已经为他们的订阅端点引入了预览API.但是,此API仍处于预览模式,我希望暂时不使用它.
一旦我完成了所有设置,问题是我无法在日历事件资源(REST)和推送通知上返回的EWS CalendarItem资源之间建立关联.在ItemId为CalendarItem和Id对REST事件不同.
当尝试更新我从REST API保存的事件时,这证明是有问题的,因为我找不到将两者关联起来的好方法.
任何帮助是极大的赞赏!
编辑
在进一步挖掘之后,我实际上发现从REST API(GET /calendars)返回的日历似乎是MessageEWS层次结构中的项目.因此,不是此端点返回实际的文件夹ID,而是返回属于某个名为"公共视图"的文件夹中的项ID.
我不确定为什么事情是这样设计的,但base64编码ID的差异似乎非常小.我仍然无法弄清楚将两者联系起来的好方法.
我正在尝试从已删除的项目文件夹中找到项目唯一ID
ItemId id = new ItemId("zTK6edxaI9sb6AAAQKqWHAAA");
SearchFilter.IsEqualTo filter = new SearchFilter.IsEqualTo(ItemSchema.Id, id);
ItemView view = new ItemView(10);
view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.Subject);
FindItemsResults<Item> results = _ExchangeService.FindItems(WellKnownFolderName.DeletedItems, filter, view);
Console.WriteLine(results.TotalCount);
Run Code Online (Sandbox Code Playgroud)
此代码返回一个异常说:
Validation failed.
Parameter name: searchFilter
Run Code Online (Sandbox Code Playgroud)
如果我搜索带有Subject的邮件,则相同的代码可以使用.
我使用Exchange Server托管API.如何确定预约是否私密?"约会"课程中似乎没有方法或属性.
当我通过ExchangeService.LoadPropertiesForItems方法加载多个交换项的属性时,Exchange会跳过响应中的项附件的一些属性:
<t:CalendarItem>
<t:ItemId Id="itemId" ChangeKey="itemChangeKey"/>
<t:Subject>Test appointment</t:Subject>
<t:Attachments>
<t:FileAttachment>
<t:AttachmentId Id="firstAttachmentId"/>
<t:Name>pdf.pdf</t:Name>
<t:Size>94150</t:Size>
<t:LastModifiedTime>2015-08-03T10:54:40</t:LastModifiedTime>
<t:IsInline>false</t:IsInline>
<t:IsContactPhoto>false</t:IsContactPhoto>
</t:FileAttachment>
<t:FileAttachment>
<t:AttachmentId Id="secondAttachmentId"/>
<t:Name>ATT89202</t:Name>
<t:Size>3803738</t:Size>
<t:LastModifiedTime>2015-12-03T16:40:46</t:LastModifiedTime>
<t:IsInline>true</t:IsInline>
</t:FileAttachment>
</t:Attachments>
</t:CalendarItem>
Run Code Online (Sandbox Code Playgroud)
如您所见,上面的回复不包括ContentId属性.但是,当我使用类的Load方法Item来加载单个项的属性时,EWS Managed API生成GetItem具有单个项ID 的相同SOAP请求,并使用扩展的附件属性集响应Exchange:
<t:CalendarItem>
<t:ItemId Id="itemId" ChangeKey="itemChangeKey"/>
<t:Subject>Test appointment</t:Subject>
<t:Attachments>
<t:FileAttachment>
<t:AttachmentId Id="firstAttachmentId"/>
<t:Name>pdf.pdf</t:Name>
<t:ContentId>25F20E449DEC42B67EB3DE58C51E56E3BE0B27F5@1</t:ContentId>
<t:Size>94150</t:Size>
<t:LastModifiedTime>2015-08-03T10:54:40</t:LastModifiedTime>
<t:IsInline>false</t:IsInline>
<t:IsContactPhoto>false</t:IsContactPhoto>
</t:FileAttachment>
<t:FileAttachment>
<t:AttachmentId Id="secondAttachmentId"/>
<t:Name>ATT89202</t:Name>
<t:ContentId>DB969CA378C5F9565E98779626E3BCA3A65FB275@1</t:ContentId>
<t:Size>3803738</t:Size>
<t:LastModifiedTime>2015-12-03T16:40:46</t:LastModifiedTime>
<t:IsInline>true</t:IsInline>
</t:FileAttachment>
</t:Attachments>
</t:CalendarItem>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在第二个响应ContentId属性中呈现了此外,当我使用ExchangeService.LoadPropertiesForItems方法时,将单个项目作为第一个参数传递,Exchange也将Attachment.ContentId属性包含在响应中.
有没有办法我可以获得ContentId项目附件的属性而不分别为所有项目加载属性?
是否可以访问除登录用户之外的其他Exchange帐户的文件夹和项目?
我可以通过Exchange Web服务托管API执行此操作吗?
c# exchange-server web-services exchangewebservices ews-managed-api