如何通过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 -o updatealerttemplates -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
Customizing Alert Notifications and Alert Templates in Windows SharePoint Services 3.0