WinWebMail,是一个比较轻量级的邮件服务器系统,适用于中小型企业的邮件系统,功能也比较齐全,关于它的详细介绍可参见官网地址:http://www.winwebmail.com/.从网上去下载一个安装到机器上,我们公司服务器上安装的是WinWebMail 3.7.6.1 企业版,安装的时候它回自动生成网站文件目录,全部都是ASP的页面,在IIS里面创建一个虚拟目录指向该Web文件夹,按照他的一些说明配置好权限等,这样我们就在网页使用它的邮件服务了.
它的Web客户端比较简洁,不过该有的功能还是都有.第一次用admin进去添加一个域,再添加到一个用户进去,我们就拥有该域名的邮箱.注意,如果你这台机器并没有独立网络IP地址或者域名没有解析到你这里你也能添加域,比如我添加一个microsoft.com的域,再到里面添加一个用户jonllen,那我登陆jonllen@microsoft.com用户,我也能以它的用户名发送出邮件,呵呵,不过对方看到的应该是在垃圾邮件里面,因为现在一般邮件服务器都会判断邮件域名和发送的来源是不是同一个地方,不是同一个地方就认为是伪造的垃圾邮件,而且对方回复你也不能收到,因为microsoft.com不是解析到你那里,先来看一张WinWebMail登陆后的截图.
发送邮件就只能在Web页面里面操作是往往不够的.比如系统自动发送邮件、定时群发邮件等这些操作是不可能再跑到它的页面手工去发送,而应该要能在程序里调用他的接口进行发送邮件,而且最近可能会要开发一套OA,里面就要企业邮件,OA里注册一个帐户就需要开一个邮件帐户,并且建立企业员工通讯录,邮件信息为内部相互通讯,且也能直接发送到外部邮箱,不过WinWebMail好象就提供接口方式好象就是Web网页访问的形式而已,不过打开它里面的asp页面,我们能看到里面一些这样的代码.
set ei = server.createobject("easymail.InfoList")
username = Session("wem")
ei.LoadMailBox username, trim(request("mode"))
'-----------------------------------------
懂asp的朋友都知道,它里面使用server.createobject是创建一个对象,比如对数据的连接操作都是要用到server.createobject,而asp里面的变量是弱变量类型,变量无须声明就可以使用的,那么上面代码里面server.createobject("easymail.InfoList")创建的是什么对象呢?突然想起来,WinWebMail它还有个C/S的客户端界面,但是要到服务器上进去才能看到操作的,功能比较的简单,可以增加用户和配置域,还可以修改一些系统的设置,打开任务管理查看所有进程,可以看到它其实是就是一个程序,你也可以关闭,但是还有一个名为emsvr的进程,它便就是WebWinWeb邮件系统的后台服务,最核心的地方还是在这里!那么它们之间是怎么实现相互调用的呢?细心的程序员很快就会想到是用COM组件,因为COM组件通过接口能方便的实现相互调用通讯甚至为不同的语言,在VS里面添加引用,选择COM组件,果然有WinWebMail的组件,如下图.
那么,上面server.createobject的就可以解释为创建调用的COM组件对象了.既然有COM组件接口可以调用,那么就好办了.因为COM组件接口能跨任何语言调用,如果为标准的DLL组件的话,我们还可以使用非托管动态链接库的方法进行引用,不过那好象你必须都要知道它的一些方法名和参数等.难道我去它的那些asp页面里一个个找出来不成?而且你没有相关文档还先得要搞清它的整个页面逻辑,就算你都找到了那也不一定就是你要的方法名,那改如何是好呢?上面不是用VS来引用COM吗?没错!我们在项目里面添加WebEasyMail的COM组件,VS会帮我们自动生成一个Interop.EASYMAILLib.dll文件到Bin目录,我们使用对象浏览器打开,它里面的接口属性类一览如余.
我们要操作调用COM接口,那我们调用它生成的类即是,就是这么的简单,非常的方便.写代码的话我们先实例化它里面的类,我们能看到类里面有很多的方法和属性.刚开始你可能会对它里面的一些属性和方法是干什么的不太明白.但是你可以打开它的asp页面里的代码,先看下它调用的整个步骤,也许你就有一些思绪了.我为了做得通用,把一些常见的操作都用C#写成了WebService方法.我这里贴出一个返回用户邮件夹信息(包括名称、总数量大小和新邮件数)的方法.
[System.Xml.Serialization.XmlInclude(typeof(MailBox))]
[SoapHeader("Usheader", Direction = SoapHeaderDirection.In)]
public MailBox[] GetMailBoxes(string username)
{
InfoListClass infos = new InfoListClass();
if (!username.Contains("@"))
username += System.Configuration.ConfigurationManager.AppSettings["EmailPostfix"];
infos.LoadSizeInfo(username);
System.Collections.Generic.List<MailBox> list = new System.Collections.Generic.List<MailBox>();
list.Add(new MailBox("收件箱", "in", infos.inboxMailCount, infos.newInBoxMailCount, infos.inboxMailSize));
list.Add(new MailBox("草稿箱", "out", infos.outboxMailCount, infos.newOutBoxMailCount, infos.outboxMailSize));
list.Add(new MailBox("发件箱", "sed", infos.sendboxMailCount, infos.newSendBoxMailCount, infos.sendboxMailSize));
list.Add(new MailBox("垃圾箱", "del", infos.delboxMailCount, infos.newDelBoxMailCount, infos.delboxMailSize));
for (int i = 0; i < infos.PerFolderCount; i++)
{
MailBox box = new MailBox();
infos.GetPerFolderInfo(i, ref box.name, ref box.mailcount, ref box.size, ref box.newmailcount);
box.code = box.name.ToString();
list.Add(box);
}
list.Add(new MailBox("合计", "all", infos.allMailCount, infos.allNewMailCount, infos.allMailSize));
return list.ToArray();
}
其他添加域、用户、收发邮件也能以次类推写出来,只不过你可能要参考它asp页面的一些方法,调用正确才能返回结果.注意:它接口里面没有一个实体对象模型,里面所有的结果都是使用ref来赋值的,取多条结果则是通过for循环,它asp页面里调用好象也都是这样做的.我的做的时候调试也是比较的郁闷.因为是本地在公司的一个局域网,我用上面写的那些方法竟然都调用不了,也没有报错,就是没有结果返回,但是进它的asp网站里面操作又都行!害得我郁闷了好久.后来把代码传到服务器上,直接用WebService访问,竟然又行.那证明我写的那些方法是没有错,那到底是那里有问题了呢?我现在还是不太明白.
不过既然能在服务器上运行就OK了,因为邮件服务器最终都将是要部署在服务器上的,这样我们就也能把添加用户、企业通讯录、收发邮件的这样方法以WebService的方式提供出来,如果公司还有OA、ERP、人力资源管理系统等都可以方便的调用,而且能统一域下用户管理,实现企业用户员工的邮件通讯.有需要使用邮件系统的朋友可以考虑使用WinWebMail.我这里提供一个WinWebMailv3.7.6.1 企业版的破解版下载,仅供非商业用途学习测试使用,感兴趣的朋友可以来下载,正式使用请到官网购买付费版本.