如何通过IAlertNotifyHandler来自定义Alert Email

来源:互联网 发布:windows nginx iis 编辑:程序博客网 时间:2024/06/06 00:45

如何通过IAlertNotifyHandler来自定义Alert Email

问题描述

==========

自定义Alert email, 不仅仅修改外观, 我们需要对内容的输出进行控制

 

解决方案

==========

使用IAlertNotifyHandler接口来制作邮件内容, 修改邮件内容

 

步骤

==========

1. 创建一个class library工程, 完整代码如下:

using System;using System.Collections.Generic;using System.Text;using System.Web;using System.IO;using Microsoft.SharePoint;using Microsoft.SharePoint.Utilities;namespace AlertNotifyHandler{    public class Class1 : IAlertNotifyHandler    {        #region IAlertNotifyHandler Members                public bool OnNotification(SPAlertHandlerParams ahp)        {            try            {                SPSite site = new SPSite(ahp.siteUrl + ahp.webUrl);                SPWeb web = site.OpenWeb();                SPList list = web.Lists[ahp.a.ListID];                SPListItem item = list.GetItemById(ahp.eventData[0].itemId);                string eventType = string.Empty;                string FullPath = HttpUtility.UrlPathEncode(ahp.siteUrl + "/" + ahp.webUrl + "/" + list.Title + "/" + item.Name);                string ListPath = HttpUtility.UrlPathEncode(ahp.siteUrl + "/" + ahp.webUrl + "/" + list.Title);                string webPath = HttpUtility.UrlPathEncode(ahp.siteUrl + "/" + ahp.webUrl);                string build = "";                if (ahp.eventData[0].eventType == 1)                    eventType = "Added";                else if (ahp.eventData[0].eventType == 2)                    eventType = "Changed";                else if (ahp.eventData[0].eventType == 3)                    eventType = "Deleted";                                build = "<style type=\"text/css\">.style1 {              font-size: small; border: 1px solid #000000;" +                    "background-color: #DEE7FE;}.style2 {               border: 1px solid #000000;}</style></head>" +                    "<p><strong>" + item.Name.ToString() + "</strong> has been " + eventType + "</p>" +                    "<table style=\"width: 100%\" class=\"style2\"><tr><td style=\"width: 25%\" class=\"style1\">" +                    "<a href=" + webPath + "/_layouts/mysubs.aspx>Modify my Settings</a></td>" +                    "<td style=\"width: 25%\" class=\"style1\"> <a href=" + FullPath + ">View " + item.Name + "</a></td>" +                    "<td style=\"width: 25%\" class=\"style1\"><a href=" + ListPath + ">View " + list.Title + "</a></td>" +                    "        </tr></table>";                string subject = list.Title.ToString();                SPUtility.SendEmail(web, true, false, ahp.headers["to"].ToString(), subject, build);                return false;            }            catch (System.Exception ex)                {                FileStream fs = new FileStream(@"C:\temp\alertnotifyhandler.log", FileMode.Create);                StreamWriter sw = new StreamWriter(fs);                sw.Write(ex.ToString());                return false;            }        }        #endregion    }}

 

2. 为工程添加签名(添加一个snk文件). Build.

3. 部署dll到SharePoint Server的GAC中.

4. 复制C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\XML\alertTemplates.xml文件. 永远不要修改原文件!

5. 重命名复本为CustomAlertTemplates.xml, 保存.

6. 编辑文件, 在文件中搜索关键字"Properties". 你会搜索到像下面这样的部分.

<Properties>    <ImmediateNotificationExcludedFields>ID;Author;Editor;...省略...;NumComments;</ImmediateNotificationExcludedFields>    <DigestNotificationExcludedFields>ID;Author;Editor;...省略...;NumComments;</DigestNotificationExcludedFields></Properties>

修改这个部分为:

<Properties>    <ImmediateNotificationExcludedFields>ID;Author;Editor;...省略...;NumComments;</ImmediateNotificationExcludedFields>    <DigestNotificationExcludedFields>ID;Author;Editor;...省略...;NumComments;</DigestNotificationExcludedFields>          <NotificationHandlerAssembly>AlertNotifyHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dfeb24947a0729b6</NotificationHandlerAssembly>          <NotificationHandlerClassName>AlertNotifyHandler.Class1</NotificationHandlerClassName>          <NotificationHandlerProperties></NotificationHandlerProperties></Properties>

 

7. 注意, 现在你只修改了一种Alert email的输出. 附近的这个语句指出了你修改的alert的类型:

<AlertTemplate Type="List"  Name="SPAlertTemplateType.DocumentLibrary">

按照你的需要, 搜索你想要修改的alert类型, 并在相应的部分进行修改.

 

8.运行这个命令:

C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN:  stsadm -oupdatealerttemplates -filename "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\XML\customalerttemplates.xml" -url <your sharepoint site url>

 

9. 为了更快的看到alert email修改的结果, 运行下面的这个命令. 注意, 成功之后要记得改回来.

Run this command:  stsadm -o setproperty -pn job-immediate-alerts -pv "every 1 minutes" so that you can see the log file come back in one minute.

 

10. 确保SharePoint 服务器配置了outgoing email.

11. 确保你已经在文档库上开启了alert.

12. IISRESET

13. 重启Windows SharePoint Services Timer 服务.

 

问题解决. 文中代码已经通过了作者的测试.

 

另外, 在这里记录一个相关问题

=============

运行了这个命令之后, 整个服务器场内所有的web application都会受到该命令的影响, 即一个web application的email alert改过之后, 就场内的所有站点的alert email的模板就全都跟着变了.

你可能会问, 我明明指定了一个URL的呀. 呵呵, 这个问题只有微软才知道为什么会这样却不去修复它, 可能改动太大的缘故吧. 但是命令需要制定一个站点的URL还是有点容易迷惑人.

如果你感兴趣的话, 你可以在config DB, content DB和上抓profiler trace, 你会看到你的命令的修改最终反映到的不是content db, 而是config db.

 

参考资料:

How To: Customizing alert emails using IAlertNotifyHandler

http://blogs.msdn.com/sharepointdeveloperdocs/archive/2007/12/14/how-to-customizing-alert-emails-using-ialertnotificationhandler.aspx

Customizing Alert Notifications and Alert Templates in Windows SharePoint Services 3.0

http://blogs.msdn.com/sharepointdeveloperdocs/archive/2007/12/07/customizing-alert-notifications-and-alert-templates-in-windows-sharepoint-services-3-0.aspx