做邮件相关的项目,所以测试的时候要批量发邮件,找了些脚本,发现发邮件的时候都会提示(服务器是exchange,通过mapi发送),而且开始的几秒是不能选择同意的,所以速度很慢。
今天看到原来的同事写的解决方案,其实很简单:
1) Open Outlook.
2) Select Tools > Trust Center…
3) Click <Programmatic Access>
4) Check <Never warn me about suspicious activities>
做邮件相关的项目,所以测试的时候要批量发邮件,找了些脚本,发现发邮件的时候都会提示(服务器是exchange,通过mapi发送),而且开始的几秒是不能选择同意的,所以速度很慢。
今天看到原来的同事写的解决方案,其实很简单:
1) Open Outlook.
2) Select Tools > Trust Center…
3) Click <Programmatic Access>
4) Check <Never warn me about suspicious activities>
需要做Journal邮件的过滤,从Outlook里面看到的情况是,发件人是Microsoft Exchange on behalf of Xxx,而且正文是Journal Report,原始的邮件信息被作为附件了。开始还郁闷怎么弄,不过用SourceOne创建了Journal Activity以后,发现可以正常的处理,From得到的还是原始的发件人,而不是那个Microsoft Exchange on behalf of Xxx,邮件正文还是原来的邮件正文。不知道是SourceOne处理了这个问题还是。。。
进入这个新的项目后学习到的一个很重要的概念就是Role了,这个Role和我们平时的用户的Role是不同的,而是Service或者Component或者Instance的Role,怎么讲?其实就是一个东西,具备多种功能,你可以让它同时做那些事情,在高负载的情况下,你可以安装很多个,然后让不同的东西承担单独的功能或者几个功能。
说白了,这个不神秘,就是在系统设计的时候可以让某些功能启用,某些功能不启用,好处是什么呢?你可以针对系统的负载特点安排Cluster的配置,有些组件的负载更重一些,那么就多安装一些机器专门负责那个功能,也就是更加灵活的在各个层面可以实现负载横向扩展或者Cluster。
举个实际的例子:
微软的Exchange大家想必都用过,Exchange的功能也是可以划分Role的,你可以安装很多个Exchange,但是安装的时候选择这个Exchange的Role,可以是专门负责收邮件的,可以专门负责邮件的过滤,可以专门负责客户端访问,可以专门负责Mailbox,等等,想详细了解的朋友可以看看这个E文。
当然,这个Role其实有比较正式的名称,就是Server Roles。
前几天的方案都比较复杂一些,再来一个简单的:
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,但是这样不是很方便,需要在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();
}
开始的时候觉得这个是一个很小的问题,肯定有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上执行,而且也不排除这个脚本也是通过遍历目录得到的大小(执行的速度似乎也不快)。
© 2024 解惑
本主题由Anders Noren提供 — 向上 ↑