微软的exchange采用owa作为web mail 访问客户端,部署exchange的客户普遍提出了这样一个需求:owa的联系人选择页面不好用,只能采用查询
的方式来选择收信人,可不可以直接提供基于组织机构树的联系人选择页面???
显然,要实现这样一个需求,必须修改owa的源码!
探索的过程就不说了,直接写一下解决方案。
在exchange服务器上,打开IIS,可以看到跟exchange有关的几个虚拟目录:exchange , exchweb等。exchange虚拟目录映射到一个虚拟地址,
内部没有任何文件。exchweb里面全部是一些图片,css,javascript,这些是OWA的资源文件.OWA有着良好的设计,它的资源文件和主题程序代码
是分开的,这就给我们修改其默认实现提供了可能.
在 exchweb/xxx 下有这样一个js文件: util_OWA.js , owa中选择联系人的脚本函数就在它里面.
我们只要将最后一行 弹出模态对话框的 路径改掉,就可以让owa使用我们自定义的联系人选择页面.
接下来,我们需要保证自定义的联系人选择页面其返回参数跟owa默认页面一致.
关键的问题解决了,我们可以自定义自己的页面了, 组织机构数据,用户数据我们当然可以查询AD获取(或其他途径),最终,只要调用一下addRec即可
页面我们可以用asp,asp.net,php,任何windows支持的技术都可.
一些注意事项:
1)若要在exchange集群服务器上实施此改动,需要在集群的每台服务器上修改.
2)util_OWA.js 可能会有几个版本, 如何确定要修改那个版本呢?
访问邮件发送页面,看看它的html源码,用的是那个版本的util_OWA.js 就修改哪个.
3)若自定义的页面需要获取当前用户信息,如何实现?
owa有两种认证方式: 集成windows身份认证和表单认证,若采用集成windows身份认证有如下解决方案:
我们自定义的页面在单独的虚拟目录下,确保这个目录和exchange属于同一个站点,并且身份认证方式完全一致.
这样设置后,在asp.net页面中,可以通过System.Web.HttpContext.Current.User.Identity.Name 获取到用户的帐号.
若owa采用表单认证, 因项目里没遇到这种情况,所有没有深入研究,暂时无解决方案.
4) 以上动作在exchange server 2003版本实施通过,其他版本未确定.
Do you need this solution ?
的方式来选择收信人,可不可以直接提供基于组织机构树的联系人选择页面???
显然,要实现这样一个需求,必须修改owa的源码!
探索的过程就不说了,直接写一下解决方案。
在exchange服务器上,打开IIS,可以看到跟exchange有关的几个虚拟目录:exchange , exchweb等。exchange虚拟目录映射到一个虚拟地址,
内部没有任何文件。exchweb里面全部是一些图片,css,javascript,这些是OWA的资源文件.OWA有着良好的设计,它的资源文件和主题程序代码
是分开的,这就给我们修改其默认实现提供了可能.
在 exchweb/xxx 下有这样一个js文件: util_OWA.js , owa中选择联系人的脚本函数就在它里面.
function openGal(szFieldNameTo, szFieldNameCc, szFieldNameBcc, oMsg)
{
var rgParams = new Array();
if (szFieldNameTo != null)
{rgParams["ToName"] = szFieldNameTo;rgParams["CcName"] = szFieldNameCc;rgParams["BccName"] = szFieldNameBcc;rgParams["objMessage"] = oMsg;}
else
{
rgParams["fnAddRecip"] = sendToNewMessage;
}
rgParams["search"] = g_iDefaultAddrSearch;if(typeof(g_sContactsFolder) == "string")
rgParams["contacts"] = g_sContactsFolder;rgParams["fCertCheck"] = g_fIsMimeInstalled;
rgParams["fontHeight"] = g_nFontHeight;
var nFontHeight = g_nFontHeight - 2;
var nWidth = 110 + 30 * nFontHeight;
var nHeight = 210 + 25 * nFontHeight ;
//修改此处,改变默认联系人选择页面
var vRetval = window.showModelessDialog(g_sBase + "?Cmd=dialog&template=dlg_gal&ver=6.5.6944.0" + "&theme="+g_thid, rgParams, "dialogHeight:"+nHeight+"px;dialogWidth:"+nWidth+"px;status:no;resizable:yes;help:no;");
}
{
var rgParams = new Array();
if (szFieldNameTo != null)
{rgParams["ToName"] = szFieldNameTo;rgParams["CcName"] = szFieldNameCc;rgParams["BccName"] = szFieldNameBcc;rgParams["objMessage"] = oMsg;}
else
{
rgParams["fnAddRecip"] = sendToNewMessage;
}
rgParams["search"] = g_iDefaultAddrSearch;if(typeof(g_sContactsFolder) == "string")
rgParams["contacts"] = g_sContactsFolder;rgParams["fCertCheck"] = g_fIsMimeInstalled;
rgParams["fontHeight"] = g_nFontHeight;
var nFontHeight = g_nFontHeight - 2;
var nWidth = 110 + 30 * nFontHeight;
var nHeight = 210 + 25 * nFontHeight ;
//修改此处,改变默认联系人选择页面
var vRetval = window.showModelessDialog(g_sBase + "?Cmd=dialog&template=dlg_gal&ver=6.5.6944.0" + "&theme="+g_thid, rgParams, "dialogHeight:"+nHeight+"px;dialogWidth:"+nWidth+"px;status:no;resizable:yes;help:no;");
}
我们只要将最后一行 弹出模态对话框的 路径改掉,就可以让owa使用我们自定义的联系人选择页面.
接下来,我们需要保证自定义的联系人选择页面其返回参数跟owa默认页面一致.
//联系人选择返回
//i 有三个可选值:0,1,2 , 0表示填入收件人域,1表示填入抄送域,2表示填入密件抄送域
function addRec( i )
{
if( window.dialogArguments == null )
return ;
//objMessage是owa打开联系人选择页面时传递的参数对象,通过此对象,可以更发邮件页面交互
var objMessage = window.dialogArguments["objMessage"] ;
if( objMessage == null )
return ;
var to = "Sky Heart[smtp:jianyi0115@163.com]";
objMessage.addRecipients( i + 1 , to ); //填入
objMessage.checkNames( i ); //到服务器端验证用户
}
//i 有三个可选值:0,1,2 , 0表示填入收件人域,1表示填入抄送域,2表示填入密件抄送域
function addRec( i )
{
if( window.dialogArguments == null )
return ;
//objMessage是owa打开联系人选择页面时传递的参数对象,通过此对象,可以更发邮件页面交互
var objMessage = window.dialogArguments["objMessage"] ;
if( objMessage == null )
return ;
var to = "Sky Heart[smtp:jianyi0115@163.com]";
objMessage.addRecipients( i + 1 , to ); //填入
objMessage.checkNames( i ); //到服务器端验证用户
}
关键的问题解决了,我们可以自定义自己的页面了, 组织机构数据,用户数据我们当然可以查询AD获取(或其他途径),最终,只要调用一下addRec即可
<input name="btnTo" type="button" value="收件人" onclick="addRec(0)" />
<input name="btnCc" type="button" value="抄送" onclick="addRec(1)"/>
<input name="btnBcc" type="button" value="密件抄送" onclick="addRec(2)"/>
<input name="btnCc" type="button" value="抄送" onclick="addRec(1)"/>
<input name="btnBcc" type="button" value="密件抄送" onclick="addRec(2)"/>
页面我们可以用asp,asp.net,php,任何windows支持的技术都可.
一些注意事项:
1)若要在exchange集群服务器上实施此改动,需要在集群的每台服务器上修改.
2)util_OWA.js 可能会有几个版本, 如何确定要修改那个版本呢?
访问邮件发送页面,看看它的html源码,用的是那个版本的util_OWA.js 就修改哪个.
3)若自定义的页面需要获取当前用户信息,如何实现?
owa有两种认证方式: 集成windows身份认证和表单认证,若采用集成windows身份认证有如下解决方案:
我们自定义的页面在单独的虚拟目录下,确保这个目录和exchange属于同一个站点,并且身份认证方式完全一致.
这样设置后,在asp.net页面中,可以通过System.Web.HttpContext.Current.User.Identity.Name 获取到用户的帐号.
若owa采用表单认证, 因项目里没遇到这种情况,所有没有深入研究,暂时无解决方案.
4) 以上动作在exchange server 2003版本实施通过,其他版本未确定.
Do you need this solution ?