标签: exchangewebservices

使用Exchange Web服务从Exchange下载附件

我试图使用以下代码使用C#和Exchange Web服务从收件箱中的电子邮件连接和下载附件,但我收到'System.ArgumentOutOfRangeException'错误,我不明白为什么.我已经google了一个答案,但我找不到一个或我找到的答案是非常旧版本的EWS.

我知道其余的代码通常有效,因为我可以访问与电子邮件相关的其他信息,只是不访问附件.

任何人都向我展示了我的方式的错误?

提前致谢,

詹姆士

    static void Main(string[] args)
    {
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
        service.Credentials = new NetworkCredential("MYLOGIN", "MYPASSWORD", "MYDOMAIN");

        service.Url = new Uri("https://MYMAILSERVER/EWS/Exchange.asmx");

        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(1000));

        foreach (Item item in findResults.Items)
        {
            if (item.HasAttachments && item.Attachments[0] is FileAttachment)
            {
                FileAttachment fileAttachment = item.Attachments[0] as FileAttachment;
                fileAttachment.Load("C:\\temp\\" + fileAttachment.Name);
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决但新问题

我现在通过将'foreach(findResults.Items中的项目项)更改为'foreach(findResults.Items中的EmailMessage项)'来排序问题,但现在我需要找出如何通过附件进行枚举 - 任何人的想法?

c# exchangewebservices

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

处理EWS限制策略

处理EWS限制策略的有效方法是什么?

我正在尝试阅读邮箱中的每封电子邮件以及下载所有附件.我遇到的问题是Exchange经常会返回异常说The server cannot service this request right now. Try again later..似乎很明显,我必须达到我的极限.搜索我可以看到这个错误很可能是因为我每分钟花费多少时间来处理CAS.限制政策似乎是EWSPercentTimeInCAS.

由于每个查询只能收到1,000封电子邮件,因此我需要查询所有57,000封电子邮件.我怎样才能做到这一点?

请注意,我并没有试图规避限制政策.想到的唯一想法是Thread.Sleep(30000)每次检索1,000封电子邮件时发出声明(我的搜索结果限制).然而不理想应该工作,因为获取1,000个项目花费的时间要少得多.

此问题似乎源于下载附件.邮箱总共有7,000个附件.

c# exchange-server exchangewebservices

9
推荐指数
1
解决办法
3544
查看次数

EWS - 访问所有共享日历

我有以下代码:

    private void ListCalendarFolders(ref List<EBCalendar> items, int offset)
    {
        var pageSize = 100;
        var view = new FolderView(pageSize, offset, OffsetBasePoint.Beginning);
        view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
        view.PropertySet.Add(FolderSchema.DisplayName);
        view.PropertySet.Add(FolderSchema.EffectiveRights);

        view.Traversal = FolderTraversal.Deep;

        FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, view);
        foreach (Folder myFolder in findFolderResults.Folders)
        {
            if (myFolder is CalendarFolder)
            {
                var folder = myFolder as CalendarFolder;
                items.Add(EBCalendar.FromEWSFolder(folder));
            }
        }

        if (findFolderResults.MoreAvailable)
        {
            offset = offset + pageSize;
            ListCalendarFolders(ref items, offset);
        }
    }
Run Code Online (Sandbox Code Playgroud)

哪里service是一个ExchangeService实例.不幸的是,它仍然列出了已删除的文件夹,并且没有列出共享日历.

如何让它列出所有共享日历,如何让它不包括已删除的文件夹?

.net c# exchange-server exchangewebservices office365

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

Office 365 Rest API - 守护程序周身份验证

我正在尝试构建一个Ruby Daemon服务来访问Office 365 rest API.最近通过OAuth'client_credentials'流程实现了这一点,详见本博客文章:http://blogs.msdn.com/b/exchangedev/archive/2015/01/22/building-demon-or -服务-应用程序-与办公-365-邮件日历和联系人的API-的oauth2客户端-凭据flow.aspx

我正在努力生成有效的访问令牌.令牌端点返回给我一个JWT但是当使用这个令牌时,我收到了一条带有此消息的401:

使用身份验证方法获取访问令牌,该身份验证方法太弱而无法访问此应用程序.提出的auth强度为1,要求为2

我知道client_credentials流程要求您提供X.509证书,不幸的是,博客文章中的所有示例都是针对C#的.

我在请求令牌时使用生成的自签名证书和私钥来执行客户端断言.我按照博客文章中的步骤生成证书并更新清单以使用此证书.

这是红宝石代码供参考:

def request_token
  uri = URI.parse("https://login.windows.net/== TENANT-ID ==/oauth2/token?api-version=1.0")
  https = Net::HTTP.new(uri.host, uri.port)

  req = Net::HTTP::Post.new(uri.request_uri)
  req.set_form_data(
    :grant_type    => 'client_credentials',
    :redirect_uri  => 'http://spready.dev',
    :resource      => 'https://outlook.office365.com/',
    :client_id     => '== Client ID ==',
    :client_secret => '== Client secret =='
  )

  https.use_ssl = true
  https.cert = client_cert
  https.key = client_key
  https.verify_mode = OpenSSL::SSL::VERIFY_PEER

  resp = https.start { |cx| cx.request(req) }

  @access_token = JSON.parse(resp.body)
end
Run Code Online (Sandbox Code Playgroud)

显然,为了安全起见,我删除了一些信息.即使它是ruby,您也可以看到我正在使用我的证书来验证使用SSL连接的客户端.

以下是有关错误的更多信息:

"x-ms-diagnostics" => "2000010; …
Run Code Online (Sandbox Code Playgroud)

ruby rest ssl exchangewebservices office365

9
推荐指数
2
解决办法
3484
查看次数

使用共享邮箱中的c#在E#中发送电子邮件

IT部门正在从创建服务帐户转向共享邮箱.我们所有的部门电子邮件帐户都将转换为共享邮箱.到目前为止,我一直使用EWS使用以下代码从我们的网络应用程序向收件人发送电子邮件:

ExchangeService service = new ExchangeService();
service = new ExchangeService(ExchangeVersion.Exchange2013_SP1)
{
     Credentials = new NetworkCredential("dept_email@example.com", "Password1"),
     Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx")
            };

     email = new EmailMessage(service);
     email.Body = new MessageBody(BodyType.HTML, Message.ToString());
     email.ToRecipients.Add(Recipient.email);
     email.SendAndSaveCopy();
}
Run Code Online (Sandbox Code Playgroud)

如何使用共享邮箱发送电子邮件而不是硬编码电子邮件地址和密码?我使用的电子邮件地址是不符合当前密码安全标准的服务帐户.正是由于这个原因,他们正在将部门电子邮件更改为共享邮箱.

我正在使用Windows身份验证来验证Active Directory中的用户.

c# exchangewebservices

9
推荐指数
1
解决办法
4976
查看次数

Node.js与MS Exchange EWS集成

我试图使用Node.js来调用SOAP Exchange EWS服务.我创建了一个简单的http客户端,如下所示:

var https = require('https');

var username = 'user';
var password = 'password';
var auth = 'NTLM ' + new Buffer(username + ":" + password).toString('base64');

var options = {
    host : 'exchangehost',
    port : 443,
    method : 'post',
    path : '/Exchange.asmx',
    headers : { Authorization : auth }
};

var request = https.request(options, function(response) {
    console.log('Status: ' + response.statusCode);
};

request.write('<soapenv:Envelope  ...></soapenv:Envelope>');
request.end();
Run Code Online (Sandbox Code Playgroud)

我收到状态码401,我怀疑是因为我没有做NTLM认证涉及的三个步骤(http://www.innovation.ch/personal/ronald/ntlm.html).有没有人知道Node.js模块直接与Exchange EWS通信或使用NTLM进行身份验证,或者我是否需要自己为Node.js实现该协议?非常感谢任何帮助.

exchange-server ntlm exchangewebservices node.js

8
推荐指数
1
解决办法
1万
查看次数

使用交换Web服务阅读电子邮件

这是我的方案:我必须阅读来自Exchange 2010 sp2帐户的电子邮件.我必须使用Exchange Web服务,POP3和IMAP被阻止.我必须在人们只能通过Intranet中的Web浏览器访问其帐户的环境中测试我的应用程序.我无法直接将此应用程序调试到此Intranet.我有这个代码片段来访问帐户:

private void Dowork()
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);

    string dominio = "domain";
    string usuario = "user";
    string password = "password";

    service.Credentials = new NetworkCredential(usuario, password, dominio);

    string url = usuario + "@" + dominio + ".com";

    service.AutodiscoverUrl(url, RedirectionUrlValidationCallback);
    //service.AutodiscoverUrl(url);

    FindItemsResults<Item> findResults = service.FindItems(
       WellKnownFolderName.Inbox,
       new ItemView(10));

    string content = string.Empty;

    foreach (Item item in findResults.Items)
    {
        EmailMessage email = EmailMessage.Bind(service, item.Id);
        email.Load();

        content += item.Subject + "\n";
        content += email.From.Address + "\n";
        content += email.Body …
Run Code Online (Sandbox Code Playgroud)

email exchangewebservices exchange-server-2010

8
推荐指数
1
解决办法
2万
查看次数

如何验证EWS Java API

我们使用EWS Java API在Java应用程序上使用outlook日历.我在EWS上遇到了身份验证问题.

我尝试了由rackspace提供的云Outlook帐户上的应用程序,一切正常,所以我知道凭据是准确的.

这是代码:

import java.net.URI;
import java.net.URISyntaxException;
import microsoft.exchange.webservices.data.*;

public class TestClass {

    public static void main(String[] args) {
        TestClass obj = new TestClass();
        obj.testMethod();
    }

    public void testMethod() {
        ExchangeService service = new ExchangeService(
                ExchangeVersion.Exchange2007_SP1);
        ExchangeCredentials credentials = new WebCredentials("username",
                "password");

        service.setCredentials(credentials);

        try {
            service.setUrl(new URI("https://domain/EWS/Exchange.asmx"));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        EmailMessage msg;
        try {
            msg = new EmailMessage(service);
            msg.setSubject("hello world");
            msg.setBody(MessageBody
                    .getMessageBodyFromText("Sent using the EWS API"));
            msg.getToRecipients().add("test@test.com");
            msg.send();
        } catch (Exception e) {
            e.printStackTrace(); …
Run Code Online (Sandbox Code Playgroud)

java exchangewebservices ewsjavaapi

8
推荐指数
1
解决办法
2万
查看次数

EWS托管Api中的电子邮件对话/电子邮件线程支持(针对Exchange 2010左右)

EWS托管API具有的功能,用于检索和管理屈指可数的电子邮件对话(又名 电子邮件线程).不幸的是,其中很大一部分只适用于版本的Exchange(2013等)

Outlook确实实现了针对旧版 Exchange的电子邮件线程.也许它通过自己管理线程来实现这一点(Outlook是桌面应用程序,电子邮件在本地计算机上复制,因此可以通过Conversation Topic等轻松分组).

现在,如何在Web应用程序中支持电子邮件线程?通常在Exchange客户端中支持此功能的操作是什么?通过支持我的意思是:

  • 检索前10个会话快照,然后检索接下来的10个会话快照 - 即支持分页(按需检索页面) - 此数据将用于构建主视图
  • 检索对话中的所有电子邮件 - 也就是说,按需检索对话的孩子 - 这些数据将用于构建对话的详细视图.

EWS Managed Api等问题:

  • EWS Managed API中没有Conversation.Bind(conversationId)
  • ExchangeService.FindItems(ConversationTopic的过滤器=="某个主题")绝不可靠(因为可能有不同的会话具有相同的主题)
  • ExchangeService.FindItems(过滤器为ConversationId =="QWERYUIO") - 我无法弄清楚如何使用这个:)是否有可能通过ConversationId搜索电子邮件?
  • ExchangeService.GetConversationItems()等函数仅适用于以Exchange Online为目标的客户端以及以Exchange Server 2013开头的Exchange版本.

我现在使用的(作为解决方法):

  1. 使用ExchangeService.FindConversation()检索(按需)一页对话
  2. 对于检索到的页面中的每个对话,请阅读Conversation.GlobalIds属性
  3. 构建一个包含所有GlobalIds值的聚合(数组)- 通过连接所有对话的Conversation.GlobalIds
  4. 进行Exchange调用以将ID绑定到电子邮件(ExchangeService.BindToItems)
  5. 执行由组的邮件(在概念上,它是一个分组操作,但是执行不是一个简单的组通过调用操作-邮件无法通过分组 …

asp.net exchange-server exchangewebservices ews-managed-api

8
推荐指数
1
解决办法
2903
查看次数

ews java api - 如何设置电子邮件的权限/分类(公共/限制/内部)

我正在自定义文件夹中起草电子邮件.

EmailMessage msg= new EmailMessage(service);
msg.setSubject("Hello world!");
msg.setBody(MessageBody.getMessageBodyFromText("Draft email using the EWS Java API."));
msg.getToRecipients().add("someone@contoso.com");
// Tried to set extended property but not worked
ExtendedPropertyDefinition headerProperty = new ExtendedPropertyDefinition(
                    DefaultExtendedPropertySet.InternetHeaders,
                    "X-Classification",
                    MapiPropertyType.String);
            msg.setExtendedProperty(headerProperty,"Provision X-header Internet message header");
msg.save(CUSTOM_FOLDER_ID);
Run Code Online (Sandbox Code Playgroud)

我开始知道扩展属性对分类/权限标题有帮助.参考链接 - https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-provision-x-headers-by-using-ews-in-exchange 但是如何设置分类/许可?X-Classification-限制类似这样或其他任何方式?

我不想使用setImportance/setSensitivity方法.

我们手动设置以下方式 在此输入图像描述

期望从ews api设置代码的分类/许可 在此输入图像描述

如何使用ews java api为EmailMessage 设置权限/分类(public/Restricted/Internal)?

工作示例的代码片段表示赞赏.提前致谢

java exchange-server exchangewebservices ewsjavaapi

8
推荐指数
1
解决办法
292
查看次数