使用 WebDAV 和 C# 读取电子邮件的主题和正文

2023-12-30

我在用this http://msdn.microsoft.com/en-us/library/aa123571%28EXCHG.65%29.aspxMicrosoft 的示例,使用 WebDAV 读取电子邮件的主题。我也想阅读正文,但不确定如何处理。我相信这段代码是需要修改的:

strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
        + "<D:sql>SELECT \"DAV:displayname\" FROM \"" + strRootURI + "\""
        + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false"
        + "</D:sql></D:searchrequest>";

如您所见,此代码仅返回对象的显示名称。如何修改它以返回主体?


对于感兴趣的人,我了解了如何引用电子邮件正文。

首先将查询修改为以下内容:

strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
        + "<D:sql>SELECT \"DAV:displayname\", \"http://schemas.microsoft.com/mapi/proptag/x1000001e\" FROM \"" + strRootURI + "\""
        + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false"
        + "</D:sql></D:searchrequest>";

然后,使用一些额外的代码来引用响应中的正文:

XmlNodeList BodyNodes = null;
BodyNodes = ResponseXmlDoc.GetElementsByTagName("d:x1000001e");

这是完整的代码:

// Variables.
System.Net.HttpWebRequest Request;
System.Net.WebResponse Response;
System.Net.CredentialCache MyCredentialCache;
string strRootURI = "http://servername/Exchange/[email protected] /cdn-cgi/l/email-protection/Inbox/";
string strUserName = "userName";
string strPassword = "password";
string strDomain = "domain";
string strQuery = "";
byte[] bytes = null;
System.IO.Stream RequestStream = null;
System.IO.Stream ResponseStream = null;
XmlDocument ResponseXmlDoc = null;
XmlNodeList DisplayNameNodes = null;
XmlNodeList BodyNodes = null;

try
{
    //Build the SQL query.
    strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
            + "<D:sql>SELECT \"DAV:displayname\", \"http://schemas.microsoft.com/mapi/proptag/x1000001e\" FROM \"" + strRootURI + "\""
            + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false"
            + "</D:sql></D:searchrequest>";

// Create a new CredentialCache object and fill it with the network
// credentials required to access the server.
MyCredentialCache = new System.Net.CredentialCache();
MyCredentialCache.Add(new System.Uri(strRootURI),
   "NTLM",
   new System.Net.NetworkCredential(strUserName, strPassword, strDomain)
   );

// Create the HttpWebRequest object.
Request = (System.Net.HttpWebRequest)HttpWebRequest.Create(strRootURI);

// Add the network credentials to the request.
Request.Credentials = MyCredentialCache;

// Specify the method.
Request.Method = "SEARCH";

// Encode the body using UTF-8.
bytes = Encoding.UTF8.GetBytes((string)strQuery);

// Set the content header length.  This must be
// done before writing data to the request stream.
Request.ContentLength = bytes.Length;

// Get a reference to the request stream.
RequestStream = Request.GetRequestStream();

// Write the SQL query to the request stream.
RequestStream.Write(bytes, 0, bytes.Length);

// Close the Stream object to release the connection
// for further use.
RequestStream.Close();

// Set the content type header.
Request.ContentType = "text/xml";

// Send the SEARCH method request and get the
// response from the server.
Response = (HttpWebResponse)Request.GetResponse();

// Get the XML response stream.
ResponseStream = Response.GetResponseStream();

// Create the XmlDocument object from the XML response stream.
ResponseXmlDoc = new XmlDocument();
ResponseXmlDoc.Load(ResponseStream);

// Build a list of the DAV:href XML nodes, corresponding to the folders
// in the mailbox.  The DAV: namespace is typically assgigned the a:
// prefix in the XML response body.
DisplayNameNodes = ResponseXmlDoc.GetElementsByTagName("a:displayname");
BodyNodes = ResponseXmlDoc.GetElementsByTagName("d:x1000001e");

DataTable emails = new DataTable();
emails.Columns.Add("Subject");
emails.Columns.Add("Body");


if (DisplayNameNodes.Count > 0)
{
    Console.WriteLine("Non-folder item display names...");

    // Loop through the display name nodes.
    for (int i = 0; i < DisplayNameNodes.Count; i++)
    {
        DataRow row = emails.NewRow();
        row[0] = DisplayNameNodes[i].InnerText.ToString().Trim();
        row[1] = BodyNodes[i].InnerText.ToString().Trim();
        emails.Rows.Add(row);
    }
}
else
{
    Console.WriteLine("No non-folder items found...");
}

foreach (DataRow row in emails.Rows)
{
    Console.WriteLine("Subject: {0}", row["Subject"]);
    Console.WriteLine("Body: {0}", row["Body"]);
    Console.WriteLine("-------------------------------------------------------------------");
}

// Clean up.
ResponseStream.Close();
Response.Close();

}
catch (Exception ex)
{
    // Catch any exceptions. Any error codes from the SEARCH
    // method request on the server will be caught here, also.
    Console.WriteLine(ex.Message);
}

我希望这可以帮助别人!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 WebDAV 和 C# 读取电子邮件的主题和正文 的相关文章

  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 使用自定义渲染器在网格中进行过滤

    我的管理网格模块中的过滤器出现问题 我的问题是 过滤自定义渲染器不起作用的列 public function prepareColumns this gt addColumn entity id array header gt ID ind
  • 检查多个 PHP 数组键是否全部存在

    我目前正在使用以下内容 a array foo gt bar bar gt foo if isset a foo isset a bar echo all exist 但是 我将拥有比foo and bar我必须检查一下 有没有比添加一个更
  • 如何使用 React 在音频元素上设置 srcObject

    我一直在尝试设置srcReact 中音频标签的属性 但曲目从未播放 playTrack track const stream new MediaStream stream addTrack track this setState gt st
  • 起订量 - 不可覆盖的成员不得在设置/验证表达式中使用

    我是最小起订量的新手 我在嘲笑一个PagingOptions班级 该类如下所示 public class PagingOptions Range 1 99999 ErrorMessage Offset must be greater tha
  • 对新对象使用相同的引用

    在搜索一些松散相关的东西时 我偶然发现了这句话 引用可以比对象更长寿 并可用于引用在同一地址创建的新对象 由此answer https stackoverflow com a 24720107 349594 现在 我一直知道并通过引用进行工
  • 仅在未授予权限时请求 getUserMedia

    我正在创建一个警报 以便在我的网站请求访问用户的麦克风时向用户提供额外的通知 我读过 对于 Chrome 如果该网站通过 HTTPS 提供服务 则不会再次请求用户许可 除非他们删除该权限 但是 我注意到在请求麦克风访问的非 HTTPS 站点
  • 如何打印带有颜色的 R 数据框?

    随着crayon包中 可以创建彩色字符串 library crayon dat lt data frame X c yellow foobar green baz Y cyan qux 这是编码后的dat gt dat X Y 1 033
  • Catalina 中的 NSButton 没有选中状态

    我在 Catalina 上将 NSButton 设置为复选框 并使用以下代码 莫哈韦沙漠没问题 let checkbox NSButton frame NSRect x 0 y 0 width 200 height 32 checkbox
  • 如何通过has_and_belongs_to_many迁移到has_many?

    两个模型之间有一个简单的 has and belongs to many 关系 我们想向该模型添加一些参数 因此我们需要将其更改为 has many through 之类的模型 据我所知 我们需要添加一个 id 列 以及我们想要的任何列 但
  • 我应该使用 eclipse rcp 或 eclipse scout 做什么?

    我计划使用 java 代码开发桌面应用程序 并希望使用任何现成的制作了框架 然后我了解了 eclipse RCP eclipse scout 但我不确定我应该使用哪个框架日食 RCP http wiki eclipse org index
  • Bitbucket 管道不使用缓存进行捆绑安装

    我尝试了命名缓存的各种变体 但似乎没有任何效果 正如我在构建设置中看到的那样 我的缓存正在正确下载 Cache bundler Downloading Cache bundler Downloaded 25 2 MiB in 1 secon
  • ViewModel 中的依赖属性注册

    我发现很多关于 ViewModel 及其属性的讨论 比较了两种方法 INotifyPropertyChanged或通过实施依赖属性 虽然我做了很多 INotifyPropertyChanged 并且它正在工作 但我在实现 DP 方法时遇到了
  • 如何在 Elm 中获取 window.location.href?

    我有一个index html其中包含我的 Elm 应用程序 Elm 应用程序使用各种GETs 到由同一服务器提供服务的 APIindex html 而不是在我的 Elm 代码中硬编码 URLGETs e g url http localho
  • WordPress - 我无法登录 - wp_users 表出现问题

    我无法登录管理仪表板 当我转到 localhost nutri wp admin 时 它会自动将我重定向到 http localhost nutri wp login php redirect to http 3A 2F 2Flocalho
  • 二维点集的包裹

    我有一个二维点列表 例如 x c 4 3 3 5 6 6 4 and y c 5 3 1 0 1 3 5 这些二维点的图是 我想绘制这个点集的包装 如下所示 请注意 边界 包装器 与最近点之间的垂直距离为 2 个单位 注意 我有很多像上面的
  • 在 d3.js 中设置 axis 的 css

    有没有办法在 d3 js 中执行 axis path fill none 我已经在 call d3 svg axis 上尝试过 attr 和 style 但无济于事 我只是在这里做错了什么 我用来创建轴的完整代码如下 create Axis
  • 猫鼬群体和计数

    下面是我的 mongodb 结构 id 111 items productId 123 id 222 items productId 123 productId 456 id 333 items productId 123 productI
  • 从 mht 文件中提取图像和文本

    我有一个包含图像和一些文本的 mht 文件 当我用记事本 打开它时 我看到 xml 然后看到难以辨认的文本 我认为这些文本是图像 有人能告诉我如何使用 java 程序从 mht 文件中提取图像和文本吗 谢谢 它有点旧 但在 Internet
  • 405 - Reactjs 应用程序中的 iis 不允许用于访问此页面的 http 动词

    当我的支付网关将用户重定向到我的反应应用程序时 我收到此错误 相同的代码适用于 firebase 托管 并且不会给出错误 重定向 url 是 POST 请求 我尝试了各种解决方案Asp NET Web API 405 不允许用于访问此页面的
  • 使用 WebDAV 和 C# 读取电子邮件的主题和正文

    我在用this http msdn microsoft com en us library aa123571 28EXCHG 65 29 aspxMicrosoft 的示例 使用 WebDAV 读取电子邮件的主题 我也想阅读正文 但不确定如