我试图使用以下代码使用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项)'来排序问题,但现在我需要找出如何通过附件进行枚举 - 任何人的想法?
处理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个附件.
我有以下代码:
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实例.不幸的是,它仍然列出了已删除的文件夹,并且没有列出共享日历.
如何让它列出所有共享日历,如何让它不包括已删除的文件夹?
我正在尝试构建一个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) 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中的用户.
我试图使用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 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) 我们使用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) 该EWS托管API具有的功能,用于检索和管理屈指可数的电子邮件对话(又名 电子邮件线程).不幸的是,其中很大一部分只适用于新版本的Exchange(2013等)
Outlook确实实现了针对旧版 Exchange的电子邮件线程.也许它通过自己管理线程来实现这一点(Outlook是桌面应用程序,电子邮件在本地计算机上复制,因此可以通过Conversation Topic等轻松分组).
现在,如何在Web应用程序中支持电子邮件线程?通常在Exchange客户端中支持此功能的操作是什么?通过支持我的意思是:
EWS Managed 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 java api为EmailMessage 设置权限/分类(public/Restricted/Internal)?
工作示例的代码片段表示赞赏.提前致谢