解惑

解己之惑,解人之惑

标签:exchange

批量发送邮件

做邮件相关的项目,所以测试的时候要批量发邮件,找了些脚本,发现发邮件的时候都会提示(服务器是exchange,通过mapi发送),而且开始的几秒是不能选择同意的,所以速度很慢。

今天看到原来的同事写的解决方案,其实很简单:

1)     Open Outlook.

2)     Select Tools > Trust Center…

3)     Click <Programmatic Access>

4)     Check <Never warn me about suspicious activities>

Exchange的Journal邮件

需要做Journal邮件的过滤,从Outlook里面看到的情况是,发件人是Microsoft Exchange on behalf of Xxx,而且正文是Journal Report,原始的邮件信息被作为附件了。开始还郁闷怎么弄,不过用SourceOne创建了Journal Activity以后,发现可以正常的处理,From得到的还是原始的发件人,而不是那个Microsoft Exchange on behalf of Xxx,邮件正文还是原来的邮件正文。不知道是SourceOne处理了这个问题还是。。。

Role的新意义

进入这个新的项目后学习到的一个很重要的概念就是Role了,这个Role和我们平时的用户的Role是不同的,而是Service或者Component或者Instance的Role,怎么讲?其实就是一个东西,具备多种功能,你可以让它同时做那些事情,在高负载的情况下,你可以安装很多个,然后让不同的东西承担单独的功能或者几个功能。
说白了,这个不神秘,就是在系统设计的时候可以让某些功能启用,某些功能不启用,好处是什么呢?你可以针对系统的负载特点安排Cluster的配置,有些组件的负载更重一些,那么就多安装一些机器专门负责那个功能,也就是更加灵活的在各个层面可以实现负载横向扩展或者Cluster。
举个实际的例子:
微软的Exchange大家想必都用过,Exchange的功能也是可以划分Role的,你可以安装很多个Exchange,但是安装的时候选择这个Exchange的Role,可以是专门负责收邮件的,可以专门负责邮件的过滤,可以专门负责客户端访问,可以专门负责Mailbox,等等,想详细了解的朋友可以看看这个E文
当然,这个Role其实有比较正式的名称,就是Server Roles。

从CDO得到Mailbox的大小

前几天的方案都比较复杂一些,再来一个简单的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MAPI;

namespace ConsoleApplication3
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            Session session = new Session();
            session.Logon(null, null, false, true, 0, true, "exchange2007\nuser1");
            InfoStores infoStores = (InfoStores)session.InfoStores;
            for (int i = 0; i < (int)infoStores.Count; i++)
            {
                InfoStore infoStore = (InfoStore)infoStores.get_Item(i + 1);
                if (((string)infoStore.Name).IndexOf("Mailbox – ") >-1)
                {
                    Fields fields = (Fields)infoStore.Fields;
                    Field size = (Field)fields.get_Item(CdoPropTags.CdoPR_MESSAGE_SIZE, System.Reflection.Missing.Value);
                    Field count = (Field)fields.get_Item(CdoPropTags.CdoPR_CONTENT_COUNT, System.Reflection.Missing.Value);
                    Console.WriteLine(infoStore.Name + ": " + size.Value + "Bytes, messages:" + count.Value);
                }
            }
            session.Logoff();
            Console.ReadLine();
        }
    }
}

这个方案的问题是需要安装CDO,好在这个东东是微软的,而且很小,安装包才几百K,其实就是把MAPI的一些API包装成COM了,所以.net平台的那些语言都可以调。

从客户端得到Mailbox的Size

昨天已经搞定了从服务器端得到Mailbox的size,但是这样不是很方便,需要在Exchange服务器上发布代码,今天继续研究从客户端得到这个Size,历经磨难终于成功:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConsoleApplication1.exchange2007;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

namespace ConsoleApplication1
{
    class EWS
    {
        public static void Run()
        {
            ServicePointManager.ServerCertificateValidationCallback =
            delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
            {
                return true;
            };
            ExchangeServiceBinding esb = new ExchangeServiceBinding();
            esb.RequestServerVersionValue = new RequestServerVersion();
            esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007;
            esb.Credentials = new NetworkCredential("Administrator", "password", "domain.com");
            esb.Url = "https://exchange2007/EWS/Exchange.asmx";

            Console.WriteLine("Administrator:" + GetMailboxSize(esb, "Administrator@domain.com"));
            Console.WriteLine("cherami:" + GetMailboxSize(esb, "cherami@domain.com"));
            Console.WriteLine("ES1Test1:" + GetMailboxSize(esb, "ES1Test1@domain.com"));

            Console.ReadLine();
        }

阅读全文

从Exchange2007得到Mailbox的大小

开始的时候觉得这个是一个很小的问题,肯定有API直接可以拿到的,不过看了一圈下来,给出的最多的建议是从MAPI得到Mailbox,然后遍历目录累加大小得到Mailbox的大小。可以参考微软的KB:
http://support.microsoft.com/kb/320071
http://support.microsoft.com/kb/200160/

不过感觉都很麻烦。Exchange 2007提供了Exchange Management Shell ,里面有个脚本命令Get-MailboxStatistics可以得到Mailbox的信息,其中就包括Mailbox的大小,然后可以用c#调用这个脚本:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
using System.Management.Automation.Host;
using System.Management.Automation.Runspaces;
using System.Collections.ObjectModel;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
            PSSnapInException snapInException = null;
            PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out snapInException);
            Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
            myRunSpace.Open();
            Pipeline pipeLine = myRunSpace.CreatePipeline();
            Command myCommand = new Command("Get-MailboxStatistics");
            pipeLine.Commands.Add(myCommand);
            CommandParameter databaseParam = new CommandParameter("database", "Main Database");
            myCommand.Parameters.Add(databaseParam);
            Collection<PSObject> commandResults = pipeLine.Invoke();
            foreach (PSObject cmdlet in commandResults)
            {
                Console.WriteLine(cmdlet.Properties["DisplayName"].Value + "\t" + cmdlet.Properties["TotalItemSize"].Value);
            }
        }
    }
}

唯一的问题是这个需要在exchange server上执行,而且也不排除这个脚本也是通过遍历目录得到的大小(执行的速度似乎也不快)。

© 2019 解惑

本主题由Anders Noren提供向上 ↑