E-Mail-Kollector Fehler Suche

Hallo,
ich nutze derzeit die Version 20.0.2 und bin Total zufrieden mit dem derzeitigen Stand, seit längerem bemühe ich mich aber um ein Problem mit dem E-Mail-Kollector, dieser will mit dem aktivierten PHP-IMAP Bibliothek, angehängten Dokumente bei der erstellung von Neuen Tickets nicht Speichern, sobald das Ticket aber einmal angelegt wurde dann werden die Anhänge gespeichert, also

Collect_Ticket_Request
Keine Anhänge

Collect_Response_In
ganz normal mit Anhänge

Ich habe mir mal die „emailcollector_card.php“ angeschaut, gefühlt 100 mal hoch und runter und sehe den Baum vor lauter Wald nicht :see_no_evil:

Ich wollte den Code prüfen wo der Anhang gespeichert wird und vermute den Fehler in Zeile 3930, denn dort meldet er einen Fehler unter meiner Test installation Doliwamp, dass er eine Datei oder Verzeichnis nicht finden kann, wobei der Ordner angelegt wird

3930
file_put_contents($destdir.‚/‘.$filename, $content);

Der Kollektor wirft als Protokoll folgendes aus

> doCollectOneCollector is using method MAIN_IMAP_USE_PHPIMAP=1, access_type=1 (OAUTH2)
> Refresh token Microsoft-Alpha
> IMAP search array used : array (\n 0 => \n array (\n 0 => 'UNDELETED',\n ),\n 1 => \n array (\n 'SINCE' => '18-Nov-2024',\n ),\n)
> Then search string into email header : ! /References.*@55fcf57ffafe96a10e393476667d1f1f12d9aa47/
> ** Process email #1 - MsgId: [email protected] - Date: Mon, 18 Nov 2024 07:30:19 +0000 - References: NotFound - Subject: TEST Ordner
> * Process operation recordevent
> Email will have actioncode=EMAIL
> We did not find existing actionmail with [email protected]
> Event created -> id=44430
> * Process operation ticket
> Email will have actioncode=EMAIL
> Ticket not found using trackid= or [email protected]
> Ticket created with attachments -> id=1576
> Move mail 4331 - [email protected] - TEST Ordner to Archiv
> move email 4331
> Expunge

Ich habe das ganze mit einem Mail Konto von Office 365 (oauth2) getestet und mit Gmail IMAP, beide das gleiche, ich gehe auch nicht von einem Mail Problem aus, da ja der Response_IN einwandfrei funktioniert.

Vieleicht ist ja ein PHP Guru unter uns der Erfahrener ist und Lust hat den Fehler mit mir zu finden.

lg
Jason

Hallo,
wir benützen den Email-Kollektor nicht, aber beim Lesen ist mir aufgefallen das die „msgid“ zwar den gleichen Prefix cd7e4540678842ef8f9c313ba6e75f54@.... aber der Suffix

  1. einmal „[email protected]“ ist
  2. und dann weiter unten auf „[email protected]“ wechselt

Vielleicht hilft das weiter…

Da hab ich einen Fehler gemacht, ich wollte @dw-in.de in @tt-in.de ändern und hab wohl einen eintrag übersehen :see_no_evil:

Heute war wieder Zeit zum Probieren, ich habe im emailcollector.class.php in der Zeile 3941 folgende Zeile Testweise angepasst

alt
file_put_contents($destdir.‚/‘.$filename, $content);

neu
file_put_contents($destdir.‚/‘.‚Image_test.jpg‘, $content);

Damit Speichert er jetzt 1 Anhang.
Der Fehler muss im $filename liegen.

Eine Warung bekomme ich aber noch
Warning : md5_file(c:/dolibarr/dolibarr_documents/ticket/TS2411-0038/): failed to open stream: No such file or directory in C:\dolibarr\www\dolibarr\htdocs\core\lib\files.lib.php on line 2130

$ecmfile->label = md5_file(dol_osencode($dir.‚/‘.$file)); // MD5 of file content

Ich tippe dann mal auf ein ungültiges Zeichen im Filename.
Das kriegste aber leicht raus indem Du dir den Inhalt von $filename vor dem file_put_contents($destdir.‚/‘.$filename, $content); anzeigen lässt.

Oder den $filename bzw. mit dem Verzeichnis mal testweise in ' ' setzt:

		file_put_contents("'".$destdir."/".$filename."'", $content);

Hallo,
das habe ich mir auch gedacht, ich frage mich wie ich im E-MailCollector mir den Inhalt von $filename anzeigen lassen kann?

PS

  $dateiname = "c:\Dolibarr\Test.txt";
  $datei = fopen($dateiname, "w");
  fwrite($datei,$filename);
  fclose($datei);

Die Datei ist leer, das ist der Fehler, $destdir passt, da bekomme ich

c:/dolibarr/dolibarr_documents/ticket/TS2411-0041

und beim $content natürlich auch daten.

Wenn der $filename leer ist dann würde ich immer eine Stelle/Funktion vorher schauen.
(an jeder Stelle kannst Du ja ein var_dump($xxxx) einfügen)

Hier z.B.: schauen was der var_dump($attachments) anzeigt:

	if ($imapemail->hasAttachments()) {
		$attachments = $imapemail->getAttachments()->all();
	    var_dump($attachments);

hier wird der Filename aus dem attachment extrahiert.

	$filename = $attachment->getFilename();
	$content = $attachment->getContent();
	$this->saveAttachment($destdir, $filename, $content);

Komme der sache immer näher, es gibt ein Problem mit getFilename,

wenn ich statt

$filename = $attachment->getFilename();

NEU

$filename = $attachment->getname();

dann werden die Anhänge gespeichert.

in Version 20.0.2 läuft es nun Fehlerfrei

Es gab auch in der Zeile 3792 einen Hinweis

// filename may be given as ‚Filename‘ or ‚Name‘ or both
$filename = $params[‚filename‘] ?? $params[‚name‘];

Ich denke das wir den Fehler behoben haben, vielleicht können wir das in Github mitteilen.

1 „Gefällt mir“

Schön, aber die Funktion $filename = $attachment->getname(); finde ich bei mir nicht.

Ich finde für function getFilename(); die folgenden 4 Files im ganzen Dolibarr-Baum:


wobei die in der letzten Zeile wohl original verwendet wird.

Zeige doch mal das Array $attachments vor
foreach ($attachments as $attachment) {
mittels var_dump($attachments) an.
Vielleicht lässt sich ja daraus etwas näheres ermitteln.

		'@phan-var-force array{filename?:string,name?:string,charset?:string} $params';

		// ATTACHMENT
		// Any part with a filename is an attachment,
		// so an attached text file (type 0) is not mistaken as the message.
		if (!empty($params['filename']) || !empty($params['name'])) {
			// filename may be given as 'Filename' or 'Name' or both
			$filename = $params['filename'] ?? $params['name'];

Das hat mit dem Fehler imho nichts zu tun, denn der „??“ Operator sagt nur nimm den ersten Parameter $params['filename'] wenn vorhanden und nicht Null, ansonsten nimm den zweiten Parameter $params['name'].

Hallo,
$filename war ohne inhalt, erst wo ich von

getfilename

auf

getname

umgestellt habe war die variable $filename mit den richtigen Daten.

Der inhalt von Attachment ist zu groß wie kann ich Dir den zukommen lassen?

Hallo,
ich hab jetzt auch mal nach der „public function getname()“ gesucht, sowohl in meiner Doliwamp 20.0.1 als auch in meiner Ubuntu 20.0.2 ist diese in mehrere Dateien vorhanden.
Wenn ich von GitHub den emailcollector.class.php (develop) lade, dann finde ich auch dort etlich getName() einträge.

Durch Deine erklärungen verstehe ich immer mehr von PHP, ich habe meine Korrektur angepasst

if (getDolGlobalString(‚MAIN_IMAP_USE_PHPIMAP‘)) {
//var_dump($attachments);
foreach ($attachments as $attachment) {
// $attachment->save($destdir.‚/‘);
$typeattachment = (string) $attachment->getDisposition();
$filename = $attachment->getFilename() ?? $attachment->getName();
$content = $attachment->getContent();
$this->saveAttachment($destdir, $filename, $content);

}
} else {
$this->getmsg($connection, $imapemail, $destdir);
}

Oooh, ich vergaß das in PHP die Funktions- und Classnamen nicht case-sensitive sind, dagegen die Variablen- und Kontantennamen schon. :thinking:
Ich habe mein Suchtool aber per default immer auf case sensitive eingestellt.

Interessant zu wissen wäre welche getName()-Funktion nun wirklich benützt wird…
Wie lautet denn bei Dir der Filename des Anhangs?

Wenn ich mir eine eMail mit Anhang ansehe dann sieht das im Quelltext ungefähr so aus:

d.h. bei Dir dürfte dann das Feld „filename=“ also leer sein.

1 „Gefällt mir“