Ajout pièce jointe dans ticket lors creation par mail

Vous avez trouvé un bug dans l'application (dernière version stable ou bêta): Décrivez le ici afin que la correction soit intégrée a la prochaine version.
Répondre
elie
Gsup LEVEL 0
Messages : 1
Enregistré le : lun. 7 juil. 2014 14:00

Bonjour,

Sauf erreur de ma part, je n'ai pas trouvé d'information concernant mon problème. J'ai installé Gestsup 3.0.8 sur une Debian 7. Tout fonctionne bien à part une chose. Lorsque Gestsup se connecte à la boite mail servant à déclarer les incidents, les pièces jointes ne sont pas ajouter au ticket.

Mon serveur mail est un Exchange 2003 SP2 et la récupération des mails pour la création des tickets se fait en IMAP (port 143). J'ai aussi essayé de configurer la récupération des mails en POP (port 110). Le résultat est identique. Le répertoire /gestsup/upload/ à les droits 777 et appartient à l'utilisateur et au groupe www-data.

Aurais-je oublié une manipulation ou est-ce un bug répertorié ? :?: Merci pour votre réponse.
Version : GestSup 3.0.8 ||| Serveur: OS: Debian 7.5 | Apache: 2.2.22 | Mysql: 5.5.37 | PHP: 5.4.4
GMo
Gsup LEVEL 0
Messages : 4
Enregistré le : dim. 1 févr. 2015 11:58

Bonjour,

Je viens de modifier mail2ticket.php

Si vous voulez vous en insprirer (attention, il y a d'autres modifs dedans ..)
Pour la récupération des pièces jointes : ligne 43 : fonctione extract_attachments
et ligne 171

Code : Tout sélectionner

<?php
################################################################################
# @Name : mail2ticket.php
# @Desc : convert mail in ticket
# @call : /index_auth.php
# @paramters : 
# @Autor : Flox
# @Create : 07/04/2013
# @Update : 16/07/2014
# @Version : 3.0.10
################################################################################

//initialize counter
$count=0;

//connexion script with database parameters
require "connect.php";

//define current time
$datetime = date("Y-m-d H:i:s");

//load parameters table
$qparameters = mysql_query("SELECT * FROM `tparameters`"); 
$rparameters= mysql_fetch_array($qparameters);

//hostname building
//$hostname = '{'.$rparameters['imap_server'].':'.$rparameters['imap_port'].'}'.$rparameters['imap_inbox'].'';
$hostname = '{'.$rparameters['imap_server'].':'.$rparameters['imap_port'].'}'.$rparameters['imap_inbox'].'';


//connect to inbox

//default case
//$inbox = imap_open($hostname,$rparameters['imap_user'],$rparameters['imap_password']) or die('Impossible de se connecter au serveur de Messagerie: ' . imap_last_error());
//$inbox = imap_open($hostname/novalidate-cert,$rparameters['imap_user'],$rparameters['imap_password']) or die('Impossible de se connecter au serveur de Messagerie: ' . imap_last_error());
$inbox = imap_open("{xxxxxxxxx/imap/novalidate-cert}",$rparameters['imap_user'],$rparameters['imap_password']) or die('Impossible de se connecter au serveur de Messagerie: ' . imap_last_error());

// Exchange 2010
//echo $rparameters['imap_port']  ;
//$inbox = imap_open('{'.$rparameters['imap_server'].':'.$rparameters['imap_port'].'/pop3/novalidate-cert}'.$rparameters['imap_inbox'].'', $rparameters['imap_user'], $rparameters['imap_password'],NULL,1,array('DISABLE_AUTHENTICATOR'=>'GSSAPI')) or die('Impossible de se connecter au serveur de Messagerie: ' . imap_last_error());

// Fonction attach :
function extract_attachments($connection, $message_number) {
   
    $attachments = array();
    $structure = imap_fetchstructure($connection, $message_number);
   
    if(isset($structure->parts) && count($structure->parts)) {
   
        for($i = 0; $i < count($structure->parts); $i++) {
   
            $attachments[$i] = array(
                'is_attachment' => false,
                'filename' => '',
                'name' => '',
                'attachment' => ''
            );
           
            if($structure->parts[$i]->ifdparameters) {
                foreach($structure->parts[$i]->dparameters as $object) {
                    if(strtolower($object->attribute) == 'filename') {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['filename'] = $object->value;
                    }
                }
            }
           
            if($structure->parts[$i]->ifparameters) {
                foreach($structure->parts[$i]->parameters as $object) {
                    if(strtolower($object->attribute) == 'name') {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['name'] = $object->value;
                    }
                }
            }
           
            if($attachments[$i]['is_attachment']) {
                $attachments[$i]['attachment'] = imap_fetchbody($connection, $message_number, $i+1);
                if($structure->parts[$i]->encoding == 3) { // 3 = BASE64
                    $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
                }
                elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE
                    $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
                }
            }
           
        }
       
    }
   
    return $attachments;
   
}

// EOL Attach




//display header
echo'
<html lang="fr">
	<head>
		<meta charset="UTF-8" />
	</head>
';

if($inbox) 
{ 
	//grab mail
	echo "<u></u>Connexion à la boite au lettre en cours: <font color=green>ok</font><br /><br />";
	$emails = imap_search($inbox,'ALL');
	 //if emails are returned
    if($emails) {
		//for every email...
		foreach($emails as $email_number) {
			//get information specific to this email
			$overview = imap_fetch_overview($inbox, $email_number, 0);
			$seen=$overview[0]->seen;
			//if message is not read
			if ($seen==0)
			{
				$count=$count+1;
				//get mail data
				$message = imap_fetchbody($inbox, $email_number, 1);
				//$fileatt = imap_fetchbody($inbox, $email_number, 2);
				$header = imap_headerinfo($inbox, $email_number);
				$subject = $overview[0] -> subject;
				$from = $header->from[0]->mailbox . "@" . $header->from[0]->host;
				
				//special char convert
				$message=quoted_printable_decode($message);
				$subject=mb_decode_mimeheader($subject);
				$subject = str_replace('_', ' ', $subject);
				
				//Escape special char to SQL query
				$message=mysql_real_escape_string($message);
				$subject=mysql_real_escape_string($subject);
			
				//find gestsup userid from mail address
				$query= mysql_query("SELECT id FROM `tusers` where mail='$from' ");
				$row=mysql_fetch_array($query);
				if($row[0])
				{
					$user_id=$row[0];
				} else {
					$user_id='';
					//add GMO : create user
						$salt = substr(md5(uniqid(rand(), true)), 0, 5); // Generate a random key
						$password=md5($salt . md5('xxxxxxxx')); // store in md5, md5 password + salt
						$requete = "INSERT INTO tusers (lastname,password,salt,mail,profile,login) VALUES ('$from','$password','$salt','$from','2','$from')";
						$execution = mysql_query($requete) or die('Erreur SQL !<br /><br />'.mysql_error());
						$query1= mysql_query("SELECT id FROM `tusers` where mail='$from' ");
						$row1=mysql_fetch_array($query1);
						if($row1[0])
							{
								$user_id=$row1[0];
							}
					//
					$message='De '.$from.':\n'.$message;	
				}
				
				// create ticket
				$query= "INSERT INTO tincidents 
				(user,technician,title,description,date_create,techread,state,criticality,disable) 
				VALUES
				('$user_id','0','$subject', '$message','$datetime','0','5','4','0')";
				$exec = mysql_query($query) or die('Erreur SQL !<br />'.mysql_error());
				$id_ticket=mysql_insert_id();
				
				$attachement = extract_attachments($inbox,$email_number);
				echo $id_ticket;
				echo "&nbsp> Import du message $count: $subject: <font color=green>ok</font><br />";
				$img='0';
				foreach ($attachement as &$attachement) {
					echo $attachement['is_attachment'].'<br>';
					echo $attachement['filename'].'<br>';
					$filenameSQL=$attachement['filename'];
					if ($filenameSQL != '') {
						echo $attachement['name'].'<br>';
						//echo $attachement['attachment'];
							mkdir("./upload/".$id_ticket);
	        		echo 'Le répertoire ./upload/'.$id_ticket.' vient d\'être créé!<br>';      
	       	
						$myfile = fopen("./upload/".$id_ticket."/".$attachement['filename'], "x");// or die("Unable to open file!");
						fwrite($myfile, $attachement['attachment']);
						fclose($myfile);
						
						//echo $filenameSQL.'<br>';
						$imgtext='img'.$img;
						echo $imgtext.'<br>';
						$requete = "UPDATE tincidents SET $imgtext = '$filenameSQL' WHERE id = '$id_ticket'";
						//$requete = "UPDATE tusers set disable=1 WHERE id = '$_GET[id]'";
						echo $requete.'<br>';
						$execution = mysql_query($requete) or die('Erreur SQL !<br /><br />'.mysql_error());
					}
					$img=$img+1;
				} 
				
			}
		}
	}
	imap_close($inbox);
	echo "<br />Total: Récupération de $count messages depuis <b>$rparameters[imap_server]</b> depuis le port <b>$rparameters[imap_port]</b><br />";

} else {
	echo "Erreur de connexion IMAP";
}
echo '</html>';
?>
Reynald
Gsup LEVEL 1
Messages : 16
Enregistré le : mer. 18 mars 2015 08:46

Bonjour,
Je viens de mettre en place votre version de mail2ticket.php mais GestSup ne récupère toujours pas les pièces jointes en ce qui me concerne ?!
Est ce que la récupération des pièces jointes sur les mails entrants fonctionnent chez quelqu'un ?

Pour information, la mail est bien récupéré mail pas la pièce jointe. De plus dans la description, le corps du mail est bien repris mais encadré par les entêtes brutes du mail qui n'ont rien a faire la à mon sens ?!

Mauvaise utilisation de ma part ?
Merci encore.
Reynald
Gsup LEVEL 1
Messages : 16
Enregistré le : mer. 18 mars 2015 08:46

Je me réponds partiellement.
En fait j'avais placé le fichier mail2ticket.php (le nouveau avec gestion des pièces jointes) au mauvais endroit.
Oui j'avais placé gestsup dans un dossier d'essai pour les essais donc ! puis j'ai créé un dossier d'utilisation définitive quand mes tests m'ont permis de valider gestsup. Or j'avais remplacé le mail2ticket.php dans mon dossier d'essai et je faisait les tests de récupération de mail avec la version définitive !!!! Oui je sais no comment.

Tout fonctionne nickel désormais hormis 2 choses :
- lors de la réception d'un mail venant de mon compte gmail, le corps du message qui est placé dans la description du ticket est pollué de balises diverses alors que je n'ai pas de problème avec les mails venant de ma boite pro ?!
- L'utilisation en CLI de mail2ticket.php ne fonctionne toujours pas alors que la récupération via l'interface gestsup fonctionne nickel, voici le message :
PHP Fatal error: Call to undefined function imap_open() in /var/www/gestsup/mail2ticket.php on line 34

Quelqu'un pourrait il m'aider SVP ????

Merci à tous.
Répondre