You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2024-06-06 10:03:45

AnasB
Member
Registered: 2024-06-06
Posts: 27

[RESOLU] Solution par e-mail

Bonjour, j'aimerais savoir s'il serait possible de créer une solution sans passer par l'interface graphique de GLPI.

Par exemple, un technicien qui n'a pas temporairement accès à GLPI mais qui peut envoyer une solution par mail.

Merci de votre temps et de compréhension.



Informations :

Je suis sur Debian 12.5
GLPI est en 10.0.15
J'ai déjà mis en place un collecteur et le système d'envoi de mail est fonctionnel.
(j'arrive à recevoir les mails et à les "traiter" en ticket)

Last edited by AnasB (2024-06-13 15:32:36)

Offline

#2 2024-06-10 10:31:09

AnasB
Member
Registered: 2024-06-06
Posts: 27

Re: [RESOLU] Solution par e-mail

Personne de dispo ?

Offline

#3 2024-06-12 11:15:47

Yazur
Member
Registered: 2024-06-10
Posts: 4

Re: [RESOLU] Solution par e-mail

Je ne sais pas si cette solution peut répondre à votre demande, il existe le plugin GAPP qui permet d'accéder à GLPI depuis une application sur un smartphone.
En ce qui concerne l'envoi d'un mail pour solutionner un ticket, je ne sais pas s'il y a déjà quelque chose en place pour cela.

Offline

#4 2024-06-12 15:45:59

AnasB
Member
Registered: 2024-06-06
Posts: 27

Re: [RESOLU] Solution par e-mail

Bonjour, je vous remercie de votre réponse, j'ai réussi à créer un moyen de dialoguer entre utilisateur et technicien par mail sans qu'aucun des deux aillent sur GLPI mais pour créer une solution depuis impossible !
Les "Règles métier pour les tickets" marchent qu'à la création d'un ticket et non pendant le suivi ce qui rend la tâche beaucoup plus compliqué.
J'ai essayé de créer un plugin en PHP mais même cela ne marchait pas...

Je vous remercie quand même pour l'aide que vous m'avez apporté :^)

Offline

#5 2024-06-12 16:57:32

lecortex
Member
Registered: 2021-01-14
Posts: 242

Re: [RESOLU] Solution par e-mail

Bonjour,

Avez-vous regardé du côté de l'API ?


-- Any exchange not written in French comes from an automatic translation. --

Offline

#6 2024-06-12 17:00:00

AnasB
Member
Registered: 2024-06-06
Posts: 27

Re: [RESOLU] Solution par e-mail

Bonjour,

Où est-ce que je peux trouver l'API ?

Offline

#7 2024-06-12 17:06:37

lecortex
Member
Registered: 2021-01-14
Posts: 242

Re: [RESOLU] Solution par e-mail

AnasB wrote:

Bonjour,

Où est-ce que je peux trouver l'API ?


vous trouverez sur le forum la section API > https://forum.glpi-project.org/viewforum.php?id=23

et sur votre glpi > http://adresse_de_glpi/apirest.php

Last edited by lecortex (2024-06-12 17:07:53)


-- Any exchange not written in French comes from an automatic translation. --

Offline

#8 2024-06-13 09:36:01

AnasB
Member
Registered: 2024-06-06
Posts: 27

Re: [RESOLU] Solution par e-mail

Bonjour lecortex,

Je vous remercie sincèrement de votre réponse, mais je ne sais pas ou et comment configurer l'API.

Pourriez vous m'aider s'il vous plait ?

Offline

#9 2024-06-13 15:31:56

AnasB
Member
Registered: 2024-06-06
Posts: 27

Re: [RESOLU] Solution par e-mail

Je vous remercie de votre aide lecortex, je me suis renseigné au sujet de l'API et j'ai réussi à faire ce que je voulais.

Merci aussi à tous ce qui m'ont aidé smile

Offline

#10 2024-06-13 16:23:56

lecortex
Member
Registered: 2021-01-14
Posts: 242

Re: [RESOLU] Solution par e-mail

AnasB wrote:

Je vous remercie de votre aide lecortex, je me suis renseigné au sujet de l'API et j'ai réussi à faire ce que je voulais.

Merci aussi à tous ce qui m'ont aidé smile


Pouvez-vous nous donner votre système pour la résolution, cela pourrai aider d'autres utilisateur ?
Cordialement


-- Any exchange not written in French comes from an automatic translation. --

Offline

#11 2024-06-13 16:29:53

AnasB
Member
Registered: 2024-06-06
Posts: 27

Re: [RESOLU] Solution par e-mail

J'ai créé un script en PHP afin d'analyser tout les tickets "En cours (attribué)" et dès que le programme rencontre une chaîne de charactère comportant la phrase "Il faut faire" alors il va passer automatiquement le ticket en "Résolu"


<?php
// Configuration des tokens et de l'URL de l'API GLPI
$url = 'votre_addresse_glpi/glpi/apirest.php';
$username = 'nom_utilisateur';
$password = 'mot_de_passe';
$appToken = 'app_token';

// Fonction pour obtenir un session token
function getSessionToken() {
    global $url, $username, $password, $appToken;

    // Création de la requête HTTP POST pour obtenir un session token
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "$url/initSession");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: application/json",
        "App-Token: $appToken"
    ));
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
        'login' => $username,
        'password' => $password
    )));

    // Exécution de la requête
    $response = curl_exec($ch);
    curl_close($ch);

    // Vérification et décodage de la réponse JSON
    $responseArray = json_decode($response, true);

    // Vérification si l'obtention du session token a réussi
    if (isset($responseArray['session_token'])) {
        return $responseArray['session_token'];
    } else {
        die('Impossible d\'obtenir le jeton de session. Réponse reçue : ' . print_r($responseArray, true));
    }
}

// Fonction pour récupérer les détails d'un ticket par son ID
function getTicketDetails($ticketId, $sessionToken) {
    global $url, $appToken;

    // Création de la requête HTTP GET pour récupérer les détails du ticket
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "$url/Ticket/$ticketId");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: application/json",
        "Session-Token: $sessionToken",
        "App-Token: $appToken"
    ));

    // Exécution de la requête
    $response = curl_exec($ch);
    curl_close($ch);

    // Vérification et décodage de la réponse JSON
    $ticketDetailsArray = json_decode($response, true);

    // Vérification si la récupération des détails du ticket a réussi
    if (isset($ticketDetailsArray['id'])) {
        return $ticketDetailsArray;
    } else {
        return null;
    }
}

// Fonction pour récupérer les suivis d'un ticket par son ID
function getTicketFollowups($ticketId, $sessionToken) {
    global $url, $appToken;

    // Création de la requête HTTP GET pour récupérer les suivis du ticket
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "$url/Ticket/$ticketId/ITILFollowup");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: application/json",
        "Session-Token: $sessionToken",
        "App-Token: $appToken"
    ));

    // Exécution de la requête
    $response = curl_exec($ch);
    curl_close($ch);

    // Vérification et décodage de la réponse JSON
    $followupsArray = json_decode($response, true);

    // Vérification si la récupération des suivis du ticket a réussi
    if (isset($followupsArray)) {
        return $followupsArray;
    } else {
        return null;
    }
}

// Fonction pour changer le statut du ticket en résolu
function resolveTicket($ticketId, $sessionToken) {
    global $url, $appToken;

    // Données à envoyer pour mettre à jour le ticket
    $data = array(
        'input' => array(
            'status' => 5 // Statut 5 pour "résolu" dans GLPI
        )
    );

    // Conversion des données en format JSON
    $jsonData = json_encode($data);

    // Création de la requête HTTP PUT pour mettre à jour le statut du ticket
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "$url/Ticket/$ticketId");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: application/json",
        "Session-Token: $sessionToken",
        "App-Token: $appToken"
    ));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);

    // Exécution de la requête
    $response = curl_exec($ch);

    // Vérification de la réponse
    if (!$response) {
        die('Erreur lors de la mise à jour du ticket : ' . curl_error($ch));
    }

    curl_close($ch);

    // Retourner la réponse JSON
    return json_decode($response, true);
}

// Fonction pour récupérer les tickets avec le statut "en cours"
function getOpenTickets($sessionToken) {
    global $url, $appToken;

    // Création de la requête HTTP GET pour récupérer les tickets avec le statut "en cours"
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "$url/Ticket?criteria[0][field]=status&criteria[0][searchtype]=equals&criteria[0][value]=2");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: application/json",
        "Session-Token: $sessionToken",
        "App-Token: $appToken"
    ));

    // Exécution de la requête
    $response = curl_exec($ch);
    curl_close($ch);

    // Vérification et décodage de la réponse JSON
    $ticketsArray = json_decode($response, true);

    // Vérification si la récupération des tickets a réussi
    if (isset($ticketsArray)) {
        return $ticketsArray;
    } else {
        return null;
    }
}

// Fonction pour traiter un ticket
function processTicket($ticketId, $sessionToken, &$resolvedTickets) {
    // Récupération des détails du ticket
    $ticketDetailsArray = getTicketDetails($ticketId, $sessionToken);

    // Vérification si les détails du ticket ont été récupérés avec succès
    if ($ticketDetailsArray) {
        // Affichage des détails du ticket pour débogage
        echo "Détails du ticket $ticketId : ";
        print_r($ticketDetailsArray);

        // Récupération des suivis du ticket
        $followupsArray = getTicketFollowups($ticketId, $sessionToken);

        // Vérification si les suivis du ticket ont été récupérés avec succès
        if ($followupsArray) {
            // Affichage des suivis du ticket pour débogage
            echo "Suivis du ticket $ticketId : ";
            print_r($followupsArray);

            // Vérifier la présence de la chaîne "Il faut faire" dans chaque suivi du ticket
            $found = false;

            foreach ($followupsArray as $followup) {
                $followupContent = $followup['content'];
                if (mb_strpos($followupContent, 'Il faut faire') !== false) {
                    $found = true;
                    break;
                }
            }

            // Si la chaîne est trouvée, changer le statut du ticket en résolu
            if ($found) {
                $response = resolveTicket($ticketId, $sessionToken);
                echo "Le statut du ticket $ticketId a été changé en résolu.\n";
                $resolvedTickets[] = $ticketId; // Ajouter le ticket à la liste des tickets résolus
            } else {
                echo "La chaîne 'Il faut faire' n'a pas été trouvée dans le ticket $ticketId.\n";
            }
        } else {
            echo "Aucun suivi associé trouvé pour le ticket $ticketId.\n";
        }
    } else {
        echo "Impossible de récupérer les détails du ticket $ticketId.\n";
    }
}

// Obtention du session token
$sessionToken = getSessionToken();

// Récupération des tickets avec le statut "en cours"
$openTickets = getOpenTickets($sessionToken);

// Vérification si des tickets ouverts ont été récupérés
if ($openTickets) {
    $resolvedTickets = array(); // Tableau pour stocker les tickets résolus

    // Traitement de chaque ticket ouvert
    foreach ($openTickets as $ticket) {
        processTicket($ticket['id'], $sessionToken, $resolvedTickets);
    }

    // Affichage des tickets résolus
    if (count($resolvedTickets) > 0) {
        echo "Tickets résolus : " . implode(', ', $resolvedTickets) . "\n";
    } else {
        echo "Aucun ticket n'a été résolu.\n";
    }
} else {
    echo "Aucun ticket avec le statut 'en cours' trouvé.\n";
}
?>

Offline

#12 2024-06-13 20:47:50

arcsarcs
Member
Registered: 2020-07-22
Posts: 26

Re: [RESOLU] Solution par e-mail

Bonjour merci pour votre retour,
Concrètement c'est mis en place comment ? une tache (cron) ?
Par avance merci.
Edit : un utilisateur accède aux tickets via mail (notification), une réponse avec un mot clef serait fabuleuse, cette personne y accède depuis des réseaux « étrangers » et un mail via un mot clef pourrait de ce que j'ai cru comprendre de votre situation résoudre la chose ?
(il ya un collecteur sur une boite imap pour rapatrier les tickets de réponses de base)
exemple >  mot clef « ticket résolu, les carrotes sont cuites"  dans une réponse > clos le ticket avec la notification qui va bien ?

Last edited by arcsarcs (2024-06-13 20:53:30)

Offline

#13 2024-06-14 09:21:38

AnasB
Member
Registered: 2024-06-06
Posts: 27

Re: [RESOLU] Solution par e-mail

Bonjour,

J'ai en effet mis en place un Cron qui s'exécute toutes les 1 minutes.

Et par rapport à votre modification, je suis stagiaire dans une entreprise et mon maître de stage m'a demandé de rendre le ticketing utilisable à 100 % par e-mail au lieu de passer par le portail.
Donc, le script va toutes les minutes lire tous les tickets « En cours (attribué) » et voir s'il y a une chaîne de caractère spécifique.
Vous pouvez aussi très bien modifier la chaîne de caractères que vous voulez, ou bien directement clore le ticket au lieu de le résoudre.
Mais pour la notification, cela reste un problème. La résolution du ticket ne se fait pas en même temps que l'envoi d'un message, alors vous recevrez (si vous avez configuré les notifications de suivi et de résolution/clôture) une notification du suivi et une notification de résolution/clôture, ce qui peut potentiellement poser un problème aux utilisateurs non-familiers avec ce système.

Si vous avez d'autres questions, n'hésitez surtout pas, je serais ravie de vous aider smile

Offline

Board footer

Powered by FluxBB