You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Plone:删除用户账户时如何获取邮箱并发送通知

解决Plone删除用户时发送通知邮件的问题

这个问题我之前也碰到过,核心痛点就是IPrincipalDeletedEvent是在用户账户被彻底删除后才触发的,此时用户数据已经从PAS(Pluggable Auth Service)中移除,自然无法通过api.user.get()获取到邮箱信息。给你两个靠谱的解决思路:

1. 订阅删除前触发的事件:IPrincipalWillBeDeletedEvent

PlonePAS提供了一个在用户删除操作执行前触发的事件IPrincipalWillBeDeletedEvent,此时用户对象仍然存在,完全可以正常读取邮箱信息。

步骤:

  • 替换你的订阅器配置,把事件换成IPrincipalWillBeDeletedEvent
    <subscriber for="* Products.PluggableAuthService.interfaces.events.IPrincipalWillBeDeletedEvent" handler="mycontent.userWillBeDeleted" />
    
  • 修改你的处理函数,从事件中获取用户并提取邮箱:
    def userWillBeDeleted(event):
        # 从事件对象中获取用户ID
        user_id = event.principal.getId()
        # 此时用户仍然存在,可正常获取用户对象
        user = api.user.get(userid=user_id)
        if user and user.getProperty('email'):
            email = user.getProperty('email')
            # 调用Plone的MailHost发送邮件
            mailhost = api.portal.get_tool('MailHost')
            # 配置邮件内容
            subject = "您的账户已按要求删除"
            body = """尊敬的用户:
    您好!您的账户已成功完成删除操作,感谢您曾使用我们的服务。
    """
            # 获取站点配置的发件人邮箱
            from_addr = api.portal.get_registry_record('plone.email_from_address')
            # 发送邮件
            mailhost.send(body, email, from_addr, subject=subject, charset='utf-8')
    

这个方法的优势是直接利用PAS的原生事件,逻辑清晰且可靠,不会出现用户数据已丢失的问题。

2. 用内容规则实现(无需写代码)

如果你更倾向于无代码方案,内容规则同样可以解决这个问题:

  • 新建内容规则时,触发条件选择**「用户即将被删除」**(对应IPrincipalWillBeDeletedEvent),而不是「用户已被删除」
  • 添加「发送邮件」动作,在邮件内容中直接引用用户的「邮箱」字段,比如用${user/email}来获取收件地址,邮件主题和内容按需自定义即可

这样配置后,当用户被标记删除时,内容规则会在实际删除操作执行前触发,顺利获取到用户邮箱并发送通知。

内容的提问来源于stack exchange,提问作者GhitaB

火山引擎 最新活动