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

发布于 2024-10-17 19:47:33 字数 538 浏览 3 评论 0原文

我正在使用 Microsoft 的 this 示例来阅读使用 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>";

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

I am using this example from Microsoft to read the subject of an email using WebDAV. I would also like to read the body, but am unsure how to approach this. I believe this code is what needs to be modified:

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>";

As you can see, this code only returns the displayname of the object. How can this be modified to return the body as well?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

囚你心 2024-10-24 19:47:33

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

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

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]/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);
}

我希望这对某人有帮助!

For anyone interested, I found out how to reference the body of the email.

First the query was modified to the following:

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>";

Then, a little bit of extra code was used to reference the body from the response:

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

Here's the full code:

// Variables.
System.Net.HttpWebRequest Request;
System.Net.WebResponse Response;
System.Net.CredentialCache MyCredentialCache;
string strRootURI = "http://servername/Exchange/[email protected]/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);
}

I hope this helps someone!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文