标签: exchange-server

在C#中阅读MS Exchange电子邮件

我需要能够监视和读取来自MS Exchange Server(我公司内部)上的特定邮箱的电子邮件.我还需要能够阅读发件人的电子邮件地址,主题,邮件正文并下载附件(如果有的话).

使用C#(或Vb.net)执行此操作的最佳方法是什么?

c# email mapi exchange-server

89
推荐指数
4
解决办法
16万
查看次数

EWS API - 重新创建通知订阅时出错

使用对Office365日历文件夹的订阅时,我ErrorReadEventsFailedSendNotification请求中收到了很多消息.此错误实质上意味着无法再找到订阅,并且服务器不再需要新通知.

检查Microsoft建议的错误处理,解决方案是使用自动发现重新发现ExternalEwsUrl或EwsPartnerUrl,并创建新订阅.

使用Office365,通过OAuth2服务帐户的组合,AutoDiscovery服务似乎几乎不可能,因此我一直将其https://outlook.office365.com/EWS/Exchange.asmx用作主要的EWS端点.

但是,当我尝试为特定日历文件夹创建新订阅时,我不断收到一般500 ErrorNoRespondingCASInDestinationSite错误:

Exchange Web服务当前不可用于此请求,因为目标站点中的任何客户端访问服务器都无法处理该请求.

奇怪的是这只是在收到初始ErrorReadEventsFailed错误后直接发生的.如果我再试一次,比如30秒,请求就会顺利通过.

在做了一些研究之后,似乎大多数用户发现确保X-AnchorMailbox为服务帐户希望模拟的用户正确设置标题是有帮助的.我仔细检查了这个标题,确实是按照重新订阅的请求发送的.

这个问题可以通过指数退避解决方案解决,或者只是重试X次,直到请求通过.在我看来,当订阅"丢失"时,O365服务需要时间来更改Exchange服务器的DNS(这是我唯一能想到的).

任何帮助将不胜感激!

exchange-server exchangewebservices office365

80
推荐指数
1
解决办法
1602
查看次数

检索显示奇怪行为的日历项(Outlook API,WebDAV)

我们正在编写一个MS Outlook插件.为了满足我们的业务逻辑,它应检查某些日期之间的所有约会.从日历中检索所有项目时遇到了一些问题.我们尝试了两种选择:

  1. Outlook API.我们使用MSDN中描述的标准逻辑 - 按[开始]对项目进行排序,设置IncludeRecurrencesTrue日历项目并在此处运行Find\Restrict查询.它在我们的测试环境中工作正常.但是,在我们客户的环境中:对于定期约会,开始和结束日期设置为"主约会"的相应日期.例如,在某个房间的日历中,我们有一个在1月创建的每周约会,如果我们试图在8月找到所有项目,我们会获得此定期约会的四个项目,但其开始和结束日期设置为1月.但Outlook在同一日历中显示正确的日期...

  2. 很糟糕,但我们还有WebDAV!我们编写一个简单的测试应用程序,并尝试使用WebDAV查询日历中的所有项目.当然,我们没有重新发明轮子,只是粘贴了文档中的代码.之前的问题已经解决,但下一个问题出现了:它不会返回大约六个月前创建的重复项目.我没有线索 - 没有限制'旧'项目的参数!

怎么了?我们缺少重要的东西吗?

技术细节:Exchange 2003,Outlook 2003-2010.坦率地说,如果我们打开缓存Exchange模式,第一个错误就会消失,但我们不能这样做.

var nameSpace = application.GetNamespace("MAPI");
var recepient = nameSpace.CreateRecipient(roomEMail);
recepient.Resolve();
var calendar = nameSpace.GetSharedDefaultFolder(recepient, OlDefaultFolders.olFolderCalendar);
var filter = string.Format("[Start]<'{1}' AND [End]>'{0}'",
  dateFrom.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture), dateTo.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture)
);
var allItems = calendar.Items;
allItems.Sort("[Start]");
allItems.IncludeRecurrences = true;
var _item = allItems.Find(filter);
while (_item != null) {
  AppointmentItem item = _item as AppointmentItem;
  if (item != null) {
    if (item.Subject != "some …
Run Code Online (Sandbox Code Playgroud)

outlook exchange-server webdav outlook-object-model

79
推荐指数
1
解决办法
5858
查看次数

发布Outlook日历.同步频率的服务器端设置是什么?

我正在开发一个服务器的自定义实现(非常基本的WebDAV),它接受Outlook发布的日历.

Outlook似乎有一个设置(参见下面的屏幕截图),它接受服务器的参数,告诉它重新发布日历的频率,这是我想要弄清楚的参数.

Outlook的选项允许服务器指定建议的频率

如果设置未指定的Outlook默认到60分钟,这不为我工作,但我找不到什么参数可以是任何信息(我知道,Outlook的设置可以在UI内进行调整,但我需要它通过自动完成来自服务器的响应).使用Wireshark时,我发现当第一次发布日历时,Outlook会向PROPFIND服务器的URL 发送一个方法:

PROPFIND /path/to/url HTTP/1.1
X-Office-Version: 15.0.4771
Depth: 1
Content-Type: text/xml
User-Agent: Microsoft Office/15.0 (Windows NT 6.3; Microsoft Outlook 15.0.4771; Pro)
Host: example.com
Content-Length: 114
Connection: Keep-Alive
Cache-Control: no-cache

<?xml version="1.0" encoding="utf-8" ?> <D:propfind xmlns:D="DAV:"><D:prop><D:resourcetype/></D:prop></D:propfind>
Run Code Online (Sandbox Code Playgroud)

然后用XML响应(我假设这是设置的位置,但无法找到任何信息):

<?xml version="1.0"?><a:multistatus xmlns:a="DAV:"/>
Run Code Online (Sandbox Code Playgroud)

我在这一点上丢失,不知道还有什么地方寻找大量的谷歌搜索和流量嗅探后(展望< - >我发现交流沟通,但没有人可以使用非默认PARAM).任何建议在哪里寻找这样的东西都是个好主意?

outlook exchange-server calendar webdav caldav

60
推荐指数
1
解决办法
1462
查看次数

使用PHP访问Exchange的最佳方法?

我正在用PHP编写CMS应用程序,其中一个要求是它必须能够与客户的Exchange服务器连接.我之前已经写了几次这个功能,并且一直使用WebDAV来做这件事,但现在我不再那么做了.

我将在Windows服务器2008上运行IIS或Apache(无首选项)上的站点.我需要做的一些事情包括向给定用户的地址簿添加联系人,以给定用户身份发送电子邮件以及运行联系人的报告用户.

所有这些对于WebDAV来说都很容易,但如果有更好的方法不需要任何可能很快就被弃用的功能.

有任何想法吗?

更新:

Justin,我喜欢使用com对象的想法,我只是担心维护第三个产品以使一切工作......

John,我可以用C#编写一个Web服务来连接这些函数并使用我的PHP应用程序访问它,但它也有点偏僻.

到目前为止,我并不是100%确信其中任何一个都比WebDAV更好......

任何人都可以告诉我我在哪里傻吗?

php windows mapi exchange-server webdav

52
推荐指数
9
解决办法
5万
查看次数

通过Exchange Online使用System.Net.Mail发送SMTP电子邮件(Office 365)

我们正在测试新的Office 365测试版,并且我在Exchange Online服务上有一个邮件帐户.现在我正在尝试连接可以从我的测试帐户发送smtp电子邮件的LOB应用程序.

但是,Exchange 365平台需要在端口587上进行TLS加密,并且其"功能" System.Net.Mail不允许隐式SSL加密.

有没有人设法让C#通过这个平台发送邮件?

我有以下基本代码应该发送邮件 - 任何建议将不胜感激.

SmtpClient server = new SmtpClient("ServerAddress");
server.Port = 587;
server.EnableSsl = true;
server.Credentials = new System.Net.NetworkCredential("username@mydomain.com", "password");
server.Timeout = 5000;
server.UseDefaultCredentials = false;

MailMessage mail = new MailMessage();
mail.From = new MailAddress("recipent@anyaddress");
mail.To.Add("username@mydomain.com");
mail.Subject = "test out message sending";
mail.Body = "this is my message body";
mail.IsBodyHtml = true;

server.Send(mail);
Run Code Online (Sandbox Code Playgroud)

c# exchange-server sendmail system.net.mail office365

44
推荐指数
7
解决办法
12万
查看次数

使用Python通过MAPI从Outlook中读取电子邮件

我正在尝试编写一个简短的程序,它将读取我的Exchange/Outlook配置文件中的文件夹中的电子邮件内容,以便我可以操作数据.但是我在查找有关python和Exchange/Outlook集成的大量信息时遇到了问题.很多东西要么很老/没有文档/没有解释.我尝试了几个片段,但似乎得到了同样的错误.我试过Tim Golden的代码:

import win32com.client

session = win32com.client.gencache.EnsureDispatch ("MAPI.Session")

#
# Leave blank to be prompted for a session, or use
# your own profile name if not "Outlook". It is also
# possible to pull the default profile from the registry.
#
session.Logon ("Outlook")
messages = session.Inbox.Messages

#
# Although the inbox_messages collection can be accessed
# via getitem-style calls (inbox_messages[1] etc.) this
# is the recommended approach from Microsoft since the
# Inbox can mutate while you're iterating.
# …
Run Code Online (Sandbox Code Playgroud)

python mapi outlook exchange-server cdo.message

40
推荐指数
3
解决办法
10万
查看次数

在.NET中获取当前用户的电子邮件地址

我想知道用户的电子邮件地址(假设她在典型的Windows办公网络中).这是在C#应用程序中.也许是有效的东西

CurrentUser.EmailAddress; 
Run Code Online (Sandbox Code Playgroud)

.net c# exchange-server

37
推荐指数
2
解决办法
4万
查看次数

当我尝试通过EWS托管API读取/更新任务的.Body时出错 - "您必须先加载或分配此属性,然后才能读取其值."

我正在使用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或其他东西重装?请记住,我需要使用数千个项目来完成此操作,因此效率对我来说很重要.

exchange-server exchangewebservices ews-managed-api

34
推荐指数
3
解决办法
3万
查看次数

尝试使用EWS MANAGED API访问Exchange 2010帐户时,无法找到"自动发现服务"

我正在使用自动发现服务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)

如果我喜欢这样,我会犯一个错误:

无法找到自动发现服务

我必须做些什么来避免这个错误?

c# exchange-server exchangewebservices ews-managed-api

31
推荐指数
7
解决办法
6万
查看次数