Formulario de soporte

Configuración y administración del vhost que contiene 15hack.tomalaplaza.net
pagan
Mensajes: 7
Registrado: 06 May 2015 06:40

Formulario de soporte

Mensajepor pagan » 14 Jun 2015 20:53

  1. 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.
  2. Creamos el script para introducir los datos de soporte en redmine. Este script hace lo siguiente:
    1. Crea la incidencia y un usuario basado en la dirección de correo del remitente, si no existe el usuario.
    2. Asocia al usuario al proyecto con perfil Reporter, si no está asociado ya.
    3. Recoge los datos de la incidencia y envía un mensaje al remitente de ésta.
    4. Si en alguno de los casos existe un error envía un correo al remitente con los datos
    Este script se encuentra en /usr/local/scripts/mail-red,ime.py

    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

  3. 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"

  4. Avisamos a Postfix que hay un nuevo alias con

    Código: Seleccionar todo

    sudo newaliases
Última edición por pagan el 15 Jun 2015 18:22, editado 1 vez en total.

cyttorak
Mensajes: 16
Registrado: 29 Abr 2015 18:36

Re: Formulario de soporte

Mensajepor cyttorak » 15 Jun 2015 16:18

Al hacer el script original puse

/usr/share/nginx/www/redmine/extra/mail_handler/rdm-mailhandler.rb --unknown-user create --url " + url + " --key *********** --project=Test --no-permission-check

Para no tener que preocuparme de poner el proyecto en el mail de envío al hacer pruebas desde mi correo, pero si te fijas, el formulario de contacto de wordpress esta configurado para que se seleccione el proyecto.

Así que he quitado lo del --project al comando ya que desde el formulario de wordpress ya vendrá el que elija el usuario.
¿Y si alguien manda un correo directamente sin pasar por el formulario y no pone el proyecto? Entonces no se creara el ticket. Creo que en cierto modo es mejor así, pues en caso contrario todo el spam que llegara a la dirección de correo que tenemos escuchando para redmine podría convertirse en un ticket.

También añado al comando la opción --allow-override=tracker para que se guarde el tipo de petición.

P.D.: Ahora mismo si ha habido un error devolvemos como código de retorno 1. Por lo que he visto Contact Form 7 es capaz de darse cuenta de esto y decirte que el correo no ha sido enviado e incluso al remitente le llega un mail de error en el que viene dicho código. Esto me hace preguntarme: ¿Podemos hacer que python además de devolver un código numérico devuelva un string con un mensaje de error más detallado? Lo digo pensando en que supongo que aparecer en el mail de error que devuelve el servidor, y que quizá también haya alguna manera de que lo muestre Contact Form 7, aunque ya solo con lo primero molaría.

cyttorak
Mensajes: 16
Registrado: 29 Abr 2015 18:36

Re: Formulario de soporte

Mensajepor cyttorak » 07 Mar 2016 20:08

Hola

Tenemos un problema. El script siempre añade al usuario al proyect Soporte15M cuando a lo mejor su ticket no ha sido dado de alta en ese proyecto, sino en otro.

En el cuerpo del grupo vendrá una linea tipo:

Código: Seleccionar todo

Project: nombre-del-proyecto


¿Como se pude parsear el contenido del mail para sacar esa cadena y así usarla en vez de la constante

Código: Seleccionar todo

proyecto="Soporte15M"
?


Volver a “15hack.tomalaplaza.net”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron