如何在Alfresco中实现文档到期前若干天向用户发送邮件通知
Alfresco 5.2 社区版本身没有内置的文档到期自动邮件提醒功能,Windows平台部署的环境可以通过自定义属性配置+脚本/定时任务组合的方式实现,具体操作步骤如下:
前置配置
首先完成两项基础配置:
- 配置外发邮件服务
打开alfresco-global.properties文件(默认部署路径为C:\alfresco-community\tomcat\shared\classes\alfresco-global.properties),添加如下SMTP配置:
配置完成后可以在管理员后台测试邮件发送功能是否正常。mail.host=你的SMTP服务器地址 mail.port=SMTP服务端口(SSL加密通常为465,非加密通常为25) mail.username=发件人邮箱账号 mail.password=发件人邮箱授权码 mail.protocol=smtps mail.smtps.auth=true mail.smtps.starttls.enable=true mail.from.default=默认发件人邮箱地址 - 新增文档到期日期属性
用管理员账号登录Alfresco Share,进入【管理员工具】-【模型管理器】,新建自定义内容模型,添加一个expirationDate的日期类型属性(可绑定为独立方面aspect),给需要启用到期提醒的文档绑定该方面并填写对应到期日期。
方案一:规则+脚本实现(适合小范围文档库、触发条件为文档变更的场景)
该方案实现简单,无需额外开发Java代码:
- 编写提醒脚本
新建JavaScript脚本文件,命名为send-expiration-reminder.js,内容如下:// 获取文档到期日期 var expDate = document.properties["cm:expirationDate"]; if (!expDate) { exit; } // 计算日期差 var currentDate = new Date(); var diffDays = Math.ceil((expDate.getTime() - currentDate.getTime()) / (1000 * 3600 * 24)); // 提前X天提醒,可自行修改数值 var remindBeforeDays = 7; if (diffDays == remindBeforeDays) { // 收件人可根据需求调整为文档协作人、指定管理员等 var recipient = document.creator; if (!recipient.properties["cm:email"]) { exit; } // 构造邮件内容 var subject = "文档到期提醒:《" + document.name + "》即将到期"; var content = "您好:<br/><br/>您负责的文档《" + document.name + "》还有" + remindBeforeDays + "天到期,请及时处理。<br/>文档访问地址:" + shareUrl + "/page/site/" + document.siteShortName + "/document-details?nodeRef=" + document.nodeRef; // 执行发送邮件动作 actions.create("mail").execute(document, { to: recipient.properties["cm:email"], subject: subject, html: true, body: content }); } - 部署脚本
将写好的js文件放到C:\alfresco-community\tomcat\shared\classes\alfresco\extension\scripts目录下,重启Alfresco服务后脚本即可被规则调用。 - 配置文档库规则
进入需要启用提醒的文档库,点击右上角【更多】-【管理规则】,新建规则:- 触发条件:选择"内容被创建"或"内容被更新"
- 执行操作:选择"运行脚本",选中刚才上传的
send-expiration-reminder.js - 应用范围:选择应用到该文件夹下所有子内容
*注:Alfresco 5.2社区版默认规则不支持定时触发,该方案仅会在文档创建、更新时检查到期时间,如需每天自动全量扫描请使用方案二。
方案二:自定义定时任务实现(适合全平台文档扫描、灵活配置提醒天数的场景)
该方案可以实现定期批量扫描所有符合条件的文档,支持自定义提醒天数和执行时间:
- 编写任务执行逻辑
可以用Java或JavaScript编写扫描逻辑,逻辑和上述脚本基本一致,支持多轮提醒(比如提前30天、7天、1天各发送一次提醒)。 - 配置定时任务
在C:\alfresco-community\tomcat\shared\classes\alfresco\extension目录下新建Spring配置文件scheduled-expiration-job-context.xml,内容如下:<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'> <beans> <!-- 定时任务定义 --> <bean id="expirationReminderJob" class="org.alfresco.schedule.AbstractScheduledLockedJob"> <property name="jobDetail"> <bean class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="org.alfresco.repo.security.authentication.AuthenticationUtil$RunAsJob"/> <property name="jobDataAsMap"> <map> <entry key="runAsUser" value="admin"/> <entry key="targetBean" value="expirationReminderService"/> <entry key="targetMethod" value="scanAndSendReminder"/> </map> </property> </bean> </property> <!-- 执行周期配置,cron表达式表示每天凌晨1点执行 --> <property name="trigger"> <bean class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="cronExpression" value="0 0 1 * * ?"/> <property name="jobDetail" ref="expirationReminderJob"/> </bean> </property> </bean> <!-- 自定义执行逻辑Bean,注入需要的Alfresco基础服务 --> <bean id="expirationReminderService" class="com.yourcompany.alfresco.job.ExpirationReminderService"> <property name="nodeService" ref="nodeService"/> <property name="searchService" ref="searchService"/> <property name="mailService" ref="mailService"/> <property name="remindDays" value="7"/> <!-- 可自行调整提醒天数 --> </bean> </beans> - 重启Alfresco服务,定时任务会自动加载,每天指定时间执行扫描并发送提醒邮件。
Windows环境部署注意事项
- 所有配置文件修改前必须备份,避免配置错误导致服务无法启动
- 脚本、XML配置文件编码必须设置为UTF-8,避免中文内容乱码
- 测试阶段可以把cron表达式调整为每分钟执行一次,验证邮件发送正常后再修改为正式执行时间
- 可根据业务需求调整收件人规则、邮件内容模板,支持添加附件、抄送等扩展功能
内容的提问来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

