- Creamos el formulario de soporte en el blog mediante el plugin Contact Form 7 y hacemos que envíe un mensaje a un usuario de correo virtual.
- Creamos el script para introducir los datos de soporte en redmine. Este script hace lo siguiente:
- Crea la incidencia y un usuario basado en la dirección de correo del remitente, si no existe el usuario.
- Asocia al usuario al proyecto con perfil Reporter, si no está asociado ya.
- Recoge los datos de la incidencia y envía un mensaje al remitente de ésta.
- Si en alguno de los casos existe un error envía un correo al remitente con los datos
Código: Seleccionar todo
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import MySQLdb
import shlex
import email
from email import parser, message, utils
from email.mime.text import MIMEText
from subprocess import Popen, PIPE
from redmine import Redmine
########CONFIGURACIÓN########################
url="http://15hack.tomalaplaza.net/redmine"
proyecto="Soporte15M"
#######FIN CONFIGURACIÓN#######################
# Read-in the headers...
buf = ''
while True:
line = sys.stdin.readline()
buf += line
if line.strip() == '': break
# parse them...
eo = email.parser.HeaderParser()
msg = eo.parsestr(buf, headersonly=True)
# Fetch from addresses...
tfrom = msg['From']
if tfrom is None:
sys.exit("Imposible seguir sin remitente")
afrom = email.utils.parseaddr(tfrom)
mfrom = afrom[1]
if mfrom is None:
sys.exit("Imposible seguir sin remitente")
handler = Popen(shlex.split("/usr/share/nginx/www/redmine/extra/mail_handler/rdm-mailhandler.rb --unknown-user create --url " + url + " --key ******************* --no-permission-check --allow-override=tracker"), stdin=PIPE, stdout=sys.stdout, stderr=sys.stderr, shell=False)
handler.stdin.write(buf)
for l in sys.stdin:
handler.stdin.write(l)
handler.stdin.close()
handler.wait()
if not (handler.returncode == 0):
sys.exit(handler.returncode)
redmine = Redmine(url, key='******************************************')
ok = 0
rpl = None
users = redmine.user.filter (limit=1, name=mfrom)
users._evaluate ()
if users.total_count ==0:
rpl = MIMEText("Error creando ticket. Inténtelo de nuevo más tarde.", _charset='utf-8')
rpl["Subject"] = "Error creando ticket: " + msg["Subject"]
ok=1
else:
user = users[0]
#añade el usuario como reporter al proyecto por si acaso.
try:
redmine.project_membership.create(project_id=proyecto, user_id=user['id'], role_ids=[5])
except:
#el usuario ya está en el proyecto
ok=1
incidencias = redmine.issue.filter (author_id = user['id'], sort="created_on:desc", limit = 1)
incidencias._evaluate ()
if incidencias.total_count == 0:
rpl = MIMEText("Error creando ticket. Revise su usuario a través de " + url + "/login o inténtelo más tarde. Nota: Si es la primera vez que va a entrar con su usuario y perdió la contraseña pulse en '¿Olvidaste la contraseña?' para crear una contraseña", _charset='utf-8')
rpl["Subject"] = "Error creando ticket: " + msg["Subject"]
ok=2
else:
incidencia = incidencias[0]
rpl = MIMEText("Su ticket ha sido creado con éxito y puede revisarlo y seguirle la pista en "+url+"/issues/"+ str(incidencia['id']) +", tambien puede modificarlo a traves de su usuario identificándose en "+ url + "/login. Nota: Si es la primera vez que va a entrar con su usuario y perdió la contraseña pulse en '¿Olvidaste la contraseña?' para crear una contraseña", _charset='utf-8')
rpl["Subject"] = "Ticket creado con exito: " + msg["Subject"]
rpl["From"] = "noreply@15hack.tomalaplaza.net"
rpl["To"] = mfrom
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(rpl.as_string())
sys.exit(ok)
Las keys que aparecen se obtienen de la opción Administración->Configuración->Correos entrantes para la llamada al script rdm-mailhandler.rb, y de un usuario con permisos de administración para la llamada a la función Redmine - Creamos el alias de correo para el usuario virtual añadiendo en /etc/aliases
Código: Seleccionar todo
usuario_virtual:"|/usr/local/scripts/mail-redmine.py"
- Avisamos a Postfix que hay un nuevo alias con
Código: Seleccionar todo
sudo newaliases