vTiger CRM 6.0 – Kontakt erstellen bei eingehender Email für Ticketsystem

vTiger besitzt die Funktion, regelmäßig ein E-Mail-Postfach zu scannen und aus den neuen E-Mail automatisiert Tickets zu erstellen oder diese zu updaten. vTiger geht jedoch davon aus, das nur Mails empfangen werden, welche von Kontakten oder Organisationen gesendet werden, welche bereits im System angelegt sind. In unserem Fall sollen jedoch auch Mail verarbeitet werden, welche von Neukunden und Kontaktinteresennten gesendet wurden und für die noch kein Kontakt im CRM vorhanden ist. Da vTiger diese Funktion nicht unterstützt, musste die Funktion nachträglich Implementiert werden.

Hinweis: Dies ist eine Anleitung die den Kern von vTiger verändert. Daher ist eine Updatefähigkeit nicht mehr gegeben! Sollten Sie Änderungen an Ihrem System vornehmen, geschieht dies auf eigenes Risiko.

Als Grundlage für die Änderungen habe wurde die Anleitung (für vTiger 5.2.x) von Loomis aus dieser Diskussion verwendet. Durch die Umstellung auf MVC-Pattern in der vTiger Version 6.x haben sich jedoch einige Klassen und Pfade verändert.

Änderung in der Klasse Vtiger_MailScanner (Dateipfad: ./vtigerCRM/modules/Settings/MailConverter/handlers/MailScanner.php):
In der Funktion LookupContact() in der Zeile 250 muss die if-Bedingung wie folgt geändert werden:

    if($contactid) {
        $this->log("Caching Contact Id found for email: $email");
        $this->_cachedContactIds[$email] = $contactid;
    } else {
        if( ($contactid = $this->createContact($email)) ) 
            $this->log("New Contact $contactid created for email: $email");
        else
            $this->log("No matching Contact found for email: $email");
    }

In dem else-Zweig wird nun die Funktion $this->createContact() aufgerufen. Diese soll nun den Kontakt erstellen und muss nun Implementiert werden z.B. am Ende dieser Datei:

    /**
     *Try to find an Account with the correct email domain and add a contact if found.
     */
    function createContact($email) {
    	global $adb;
    	list($name, $host) = @explode('@', $email, 2);
    	$surname = null;
    	$lastname = null;
     
    	$names = explode('.', $name);
    	if($names && count($names) > 1)
    	{
    		foreach($names AS $k)
    		{
    			if(is_null($surname))
    				$surname = ucfirst($k);
    			else {
    				if(is_null($lastname))
    					$lastname = ucfirst($k);
    				else 
    					$lastname .= ' ' . ucfirst($k);
    			}
    		}
    	}
     
    	if(is_null($surname))
    	{
    		$surname = '-Unknown-';
    		$lastname = $name;
    	}
     
    	require_once('modules/Contacts/Contacts.php');
    	$contact = new Contacts();
    	$contact->column_fields['salutation'] = "--None--";
    	$contact->column_fields['firstname'] = $surname;
    	$contact->column_fields['lastname'] = $lastname;
    	$contact->column_fields['email'] = $email;
    	$contact->column_fields['assigned_user_id'] = 7;
    	$contact->column_fields['description'] = "Auto created from incomming support email:" . $email;
    	$contact->column_fields['reports_to_name'] = 0;
    	$contact->column_fields['account_id'] = 1; // this connects the contact with a account. It is not nessesary! We created a account for all support mails from our helpdesk to keep track.
     
    	$contact->save("Contacts");
     
    	// it seems that class 'id' is not updated after a create/save - so we'll relocate it.
    	// I'm open to alternate suggestions here...
    	$res = $adb->pquery("SELECT contactid FROM vtiger_contactdetails WHERE email=?", Array($email));
    	if($adb->num_rows($res)) 
    	{
    		$contactid = $adb->query_result($res, 0, 'contactid');
     
    		//you may want to deal with any custom fields here.....
    		return $contactid;
    	}
    	return false;
    }

Die Zeile $contact->column_fields[‚account_id‘] = 1; kann natürlich angepasst oder weggelassen werden. In dieser wird dem Kontakt eine Organisation zugeordnet um z.B. alle Helpdesk-Anfragen in einer Organisation verwalten zu können.

Mit diesen Änderungen erstellt vTiger nun bei einer E-Mail einen neuen Kontakt, wenn zu der Mail kein Kontakt gefunden werden konnte. Beachten Sie, dass natürlich im Mail Converter in der Rules List die Zuordnung zu einem Kontakt als Regel eingetragen sein muss. Ansonsten greift das System nicht auf die Funktion LookupContact() zu.