Herramientas Personales
Usted está aquí: Inicio Documentación Configuraciones Enviar correo con los cambios de estado

Enviar correo con los cambios de estado

— archivado en: ,

Algunas anotaciones para enviar correo desde el workflow de Plone 2

Una de las características no implementada en Plone 2.X es el envío de correo cuando los objetos cambian de estado (publicado, pendiente, etc). En este documento propongo algunas soluciones para aquellos que os haga falta.

Nota: Plone 3 implementa un mecanismo configurable desde el panel de control, por tanto esta documentación queda obsoleta para los desarrolladores de Plone 3

La primera solución es utilizar el producto CMFNotifications existente en Plone.org, a mi me ha parecido engorroso y he realizado una implementación simple basada en un script en el workflow.

Después se muestra una más compleja pero más flexible.

1ª Solución: script muy simple

Para enviar correo cuando ocurra una transición en un objeto hay que añadir un script al workflow asociado al tipo de contenido. Tras esto en la transición que se desee se añade el script. Algunos detalles:

  • Tras colocar el script en el workflow, este debe ejecutarse con el rol manager para poder acceder al objeto mailhost. Para ello, hay que establecer en la pestaña "Proxy" la ejecución del script como manager.
  • En la transición que se desee la notificación se debe establecer en "Script (before)" el script creado.

El script a añadir en el workflow es el siguiente:

## Script (Python) "sendReviewEmail"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=review_state
##title=
##

#CONFIG
####################################################
email_subject="Contenido pendiente de publicacion"
# Si existe este atributo con el nombre 'notify_user' en alguna carpeta de zope
# debe ser una lista de usuarios y, se les enviará correo
email_from='yo@yo.com'
email_to='tu@tu.com'

email_template="""
From: <$from>
To: <$to>
Content-Type: text;
	charset="utf-8"

Un objeto está pendiente de revision.

Objeto:
  - Titulo: $titulo
  - Ubicacion: $url
  - Estado: Pendiente de publicación


------
Este correo ha sido enviado automáticamente no intente responderlo

"""

##############################################
#END CONFIG

import logging
LOG = logging.getLogger('Workflow email')

portal_url = context.portal_url.getPortalObject().absolute_url()
obj = review_state.object
#Objeto de envio de correo
mailhost=getattr(context,'MailHost')

msg_body= email_template
msg_body=msg_body.replace("$to",email_to)
msg_body=msg_body.replace("$from",email_from)
msg_body=msg_body.replace("$titulo",  obj.Title())
msg_body=msg_body.replace("$url",portal_url+"/"+obj.absolute_url(1))
try:
  mailhost.send(msg_body, email_to, email_from, email_subject)
  LOG.info('Enviado correo de notificacion a %s ',email_to)
except:
  LOG.warn('Fallo en el envio de correo como notificacion al usuario: %s ',email_to)

 

2ª Solución: Script para enviar correo en el workflow de plone con selección de usuarios y carpetas

 

Esta segunda opción permite seleccionar en cada carpeta si se desean las notificaciones y la lista de usuarios que debe recibir la notificación. El funcionamiento es el siguiente:

Desde el ZMI se añade una propiedad llamada "notify_users" y de tipo "lines". En cada linea se añade el id de cada usuario que se desea que reciba notificaciones. Al tomarse la propiedad "notify_users" por adquisición, cualquier carpeta u objeto hijo tomará la misma lista que el padre.

Bastaría con añadir esa propiedad en la raíz de plone y se recibirán notificaciones de cualquier objeto del portal.

 

## Script (Python) "sendReviewEmail"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=review_state
##title=
##
#CONFIG
####################################################
email_subject="Contenido pendiente de publicacion"
# Si existe este atributo con el nombre 'notify_user' en alguna carpeta de zope
# debe ser una lista de usuarios y, se les enviará correo
email_list_attr = 'notify_users'
email_from='yo@yo.com'

email_template="""
From: <$from>
To: <$to>
Content-Type: text;
	charset="utf-8"

Un objeto está pendiente de revision.

Objeto:
  - Titulo: $titulo
  - Ubicacion: $url
  - Estado: Pendiente de publicación


------
Este correo ha sido enviado automáticamente no intente responderlo

"""
##############################################
#END CONFIG

import logging
LOG = logging.getLogger('Workflow email')

portal_url = context.portal_url.getPortalObject().absolute_url()
obj = review_state.object
#Objeto de envio de correo
mailhost=getattr(context,'MailHost')
#Lista de correo del objeto
email_list=getattr(obj,email_list_attr,None)

#LOG.info('Lista de correo %s',obj,email_list)

if not email_list:
  # No hay usuarios a los que enviarles el correo
  return

#Itera sobre los usuarios
for member in context.portal_membership.listMembers():
  member_email=member.getProperty('email','')
  #LOG.info("usuario %s email '%s'" % (member.id,member_email))
  if member.id in email_list and member_email != '':
    msg_to = member_email
    msg_body= email_template
    msg_body=msg_body.replace("$to",msg_to)
    msg_body=msg_body.replace("$from",email_from)
    msg_body=msg_body.replace("$titulo",  obj.Title())
    msg_body=msg_body.replace("$url",portal_url+"/"+obj.absolute_url(1))
    try:
      mailhost.send(msg_body, msg_to, email_from, email_subject)
      LOG.info('Enviado correo de notificacion a %s <%s>',member.id,msg_to)
    except:
      LOG.warn('Fallo en el envio de correo como notificacion al usuario: %s <%s>',member.id,msg_to)


Añadir el sript en el Worflow

Para añadir el script en el workflow basta con ir al objeto portal_worflow desde el ZMI y desde la pestaña contents entrar en el workflow en el que deseamos hacer los cambios.

Cada workflow tiene sus propios script, por tanto, no podemos crear un script y reutilizarlo desde varios workflows, hay que crear en cada workflow sus propios scripts. Tras entrar en un determinado workflow una de las pestañas es script aquí, podemos añadir lo que deseemos.

Todos los scripts añadidos se listarán automáticamente en el cuadro desplegable que tienen las transiciones: 'script before' y 'script after'

 

 

Acciones de Documento

como agregar el script

Enviado por Paulino Ruiz de Clavijo en 27/01/2008 13:56
Hola,

¿Cómo añades al workflow o la transición el script? Más que nada porque únicamente aparece en las propiedades script (after) y un combo al lado donde pone "none"?

Llevo tiempo mirando de ponerme en serio con Plone y Zope, pero de hecho la primera vez que lo vi era una versión "precaria" y el tema ha evolucionado mucho desde entonces y ando documentandome, todavía no domino el tema de Archetypes,etc.

Gracias en cualquier caso.

Agregar el script

Enviado por Paulino Ruiz de Clavijo en 27/01/2008 14:20
Hola, he añadido una sección al final del documento respondiendo a tu pregunta.