设为首页 收藏本站
查看: 855|回复: 0

[经验分享] 获取exchange 2007 中的用户配额使用量(即用户已使用的邮箱空间)

[复制链接]

尚未签到

发表于 2015-9-11 08:04:16 | 显示全部楼层 |阅读模式
在2003版本中,获取邮箱已使用的空间是通过webdav循环所有的文件夹获取所有的文件夹的邮件的大小之和。消耗资源较大。。
在2007版中,我们通过webservice获取所有的文件夹,根据文件夹的信息来累计文件夹已使用大小。 但是消耗资源也较大,每次在第一次访问的时候大概在3s左右。那么有没有更好更快的办法呢 ?

当然是有的,首先考虑的问题,那么owa自己是怎么做呢,他自己有没有获取这些数据呢?
DSC0000.gif

既然它可以取到?那么我们自然也可以通过它的方式取到罗?
测试开始。。。
用fiddler2 监控一下 ,发现了以下可疑的链接?

DSC0001.gif

进一步查看:
DSC0002.gif
看上图的文字?对了这就是我们要的数据了,就是这个请求了。。
前面一个数字是byte数,后面是显示的文字,转换成了kb,当大于1mb时就转换成mb

那接下来的事就比较简单了。就是如何来构建这个请求了。我们来仔细看下这个请求。见下图
DSC0003.gif

  上图可知,请求只post方式:
  url地址为:http://mail.lab.com/owa/ev.owa?oeh=1&ns=Tree&ev=GetMailboxUsage ;
  其中http://mail.lab.com/owa 为owa的根路径
  需要下列的文件头:
  Accept: */*
Accept-Language: zh-cn
Referer: http://mail.lab.com/owa/
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)
Host: mail.lab.com
Content-Length: 9
Connection: Keep-Alive
Pragma: no-cache
Cookie: UserContext=5148366543cf495697cfa3dcb434d772
Authorization: Basic bGFiXHN5czpBcHAxMjM0
  删除没必要的文件头(一个一个删除来测试是否必要)
  User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)
Host: mail.lab.com
Content-Length: 9
Authorization: Basic bGFiXHN5czpBcHAxMjM0  
  其中:Authorization为变量,即当前用户的登录信息;
  请求的body体
<params/>
好了知道了这些就好办了,
通过httpResponse,和httpRequest来构建这个请求吧
以下是详细代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;
using System.IO;

namespace Beyondbit.Components.Exchange
{
    public class UseAgeHelp
    {
        public UseAgeHelp(string account, string password, string domain)
        {
            _account = account;
            _password = password;
            _domain = domain;
        }

        private string _account = "";
        private string _password = "";
        private string _domain = "";

        
        private string GetMailboxUsageString()
        {
            string url = Config.ExchangeServerPath + "ev.owa?oeh=1&ns=Tree&ev=GetMailboxUsage";
            WebResponse ret = HttpCallGetMailboxUsage(url);
            Stream stream = ret.GetResponseStream();
            StreamReader sr = new StreamReader(stream, Encoding.GetEncoding("UTF-8"));
            string htmlstr = sr.ReadToEnd();
            return htmlstr;
        }

        /// <summary>
        /// 获取用户已经使用的容量
        /// </summary>
        /// <returns>返回已使用容量的byte数 /1024 单位为kb  再/1024 单位为 MB</returns>
        public int GetMailboxUsage()
        {
            string usageString = GetMailboxUsageString();
            Match mc = Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
            return Convert.ToInt32(mc.Groups[1].Value);
        }
        /// <summary>
        /// 获取用户已经使用的容量
        /// </summary>
        /// <returns>返回已使用容量的原始文本</returns>
        public string GetMailboxUsageSourceString()
        {
            string usageString = GetMailboxUsageString();
            Match mc = Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
            return mc.Groups[0].Value;
        }

        /// <summary>
        /// 获取用户已经使用的容量
        /// </summary>
        /// <returns>返回已使用容量的显示文本</returns>
        public string GetMailboxUsageDisplayString()
        {
            string usageString = GetMailboxUsageString();
            Match mc = Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
            return mc.Groups[2].Value;
        }

        private WebResponse HttpCallGetMailboxUsage(string url)
        {
            HttpWebRequest Req;

            try
            {
                //构建当前用户的凭据 ,以下两行
                System.Net.CredentialCache MyCredentialCache = new System.Net.CredentialCache();
                MyCredentialCache.Add(new Uri(url), "basic", new System.Net.NetworkCredential(_account, _password, _domain));

                //生成一个请求类
                Req = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);
                //把当前凭据设置成已经建立好的凭据
                Req.Credentials = MyCredentialCache;
                //设置请求的方式为POST
                Req.Method = "POST";
                //该项可有可无
                Req.ContentType = "application/x-www-form-urlencoded";
                Req.AllowAutoRedirect = true;
                //用户客户端类型,我们把它设置成IE
                Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)";

                //构建请求的消息体body
                byte[] paraStream = Encoding.UTF8.GetBytes("<params/>");//写死body的内容
                Req.ContentLength = paraStream.Length;
                Stream newStream = Req.GetRequestStream();
                newStream.Write(paraStream, 0, paraStream.Length);
                newStream.Close();
                //Stream request =Req.GetRequestStream();
                //request.Write(

            }
            catch (Exception ex)
            {
                throw ex;
            }

            try
            {
                //发起请求,并返回Response的对象
                WebResponse result = Req.GetResponse();

                return result;

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
    }
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-112092-1-1.html 上篇帖子: HOW TO:从 Exchange Server 5.5 迁移到 Exchange 2000 Server 下篇帖子: POJ1860——Bellman_ford——Currency Exchange
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表