ost-config.php liegt in support/include/ bzw. in upload/include/
http://osticket.com 1.6.0 (stable) Feb-09-2010 http://osticket.com 1.9.11 (stable) Jun-01-2015 (Internationalisierung, volles UTF-8, nur Ajax spinnt manchmal)
sieht OK aus, viele Funktionen. Zumindest von der Schönheit macht es keinen so guten Eindruck wie das Trellis. Andere Ticketsysteme
Damit bei JEDER Ticket-Mail der Ferienhinweis gesendet wird: in /include/class.email.php dioe Methode send suchen und dort einfügen:
// gerald: @include(trim($_SERVER["SEASONHINT_FILE"])); // aktuelle hinweise if ($hint_to_display != "") $message .= "\n\n".str_replace("NL", "",str_replace("<br \>", "", utf8_encode($hint_to_display)));
Deutsch fehlt: lade de.phar von Webseite herunter und installiere Datei in support/include/i18n/de.phar . Das ist alles.
Alte Version: keine Internationalisierung. Sprache ist in Code integriert. Es gibt jedoch Übersetzungen ins Deutsche. Dabei wurde allerdings der gesamte Code übersetzt, dh. man bekommt die Übersetzung nur als ganze Installation. Dabei wurden offenbar auch interne Pfade und Begriffe übersetzt, daher liest man von Problemen, die das Original nicht hat. Da bleib ich lieber bei Englisch. Nachtrag: hab die Seiten einzeln ersetzt (bei denen ich mir sicher war, dass nichts verschlimmbessert wurde) und selbst übersetzt. Insgesamt ist die Übersetzung aber sehr gut….
Ist ein Nachteil, aber damit kann man leben
POP3-Fetcher funktioniert auf Anhieb und ohne Mucken.
Aus dem Subject verschwinden die Umlaute und im Body werden die Umlaute falsch dargestellt.
Umlaute in Subjectzeile. Datenbank-Zeichentabelle ändern:
ALTER TABLE `ost_ticket` CHANGE `subject` `subject` VARCHAR( 64 ) CHARACTER SET latin1 DEFAULT '[no subject]'
Die Umlaute im Body korrekt darzustellen, ist schwieriger (empfangen werden sie korrekt und auch korrekt in der Datenbank gespeichert):
Zuerst die Datei include/mysql.php öffnen. Dort die Zeilen suchen: (ca. Zeile 31)
@mysql_query('SET NAMES "UTF8"'); @mysql_query('SET COLLATION_CONNECTION=utf8_general_ci');
ändern in:
@mysql_query('SET NAMES "latin1"'); @mysql_query('SET COLLATION_CONNECTION=latin1');
Jetzt werden alle Nachrichten korrekt dargestellt. Allerdings werden neu empfangene Nachrichten jetzt auch lach latin1 konvertiert und in der Datenbank falsch gespeichert (und dann natürlich auch falsch dargestellt; das betrifft nur den Body, nicht das Subject).
Um das zu beheben, die Datei /include/class.ticket.php öffnen. Dort suchen: (ca. Zeile 604)
$sql='INSERT INTO '.TICKET_MESSAGE_TABLE.' SET created=NOW() '. ',ticket_id='.db_input($this->getId()). ',messageId='.db_input($msgid). ',message='.db_input(Format::striptags($msg)). //Tags/code stripped...meaning client can not send in code..etc ',headers='.db_input($headers). //Raw header. ',source='.db_input($source). ',ip_address='.db_input($_SERVER['REMOTE_ADDR']);
Eine Zeile ändern (nämlich die, die die Nachricht speichert):
',message=CONVERT(_utf8 '.db_input(Format::striptags($msg)).' USING latin1)'. //Tags/code stripped...meaning client can not send in code..etc
Jetzt sollte es gehen.
Wenn eine Vorlage aus Vorlagendatenbank (Knowlage Base /KB) geholt wird (per Ajax), dann stimmen die Umlaute wieder nicht.
In der Datenbank werden die Umlaute korrekt gespeichert (Tabelle ist Latin1); auch beim Editieren werden sie korrekt dargestellt. Aber nicht, wenn sie via Ajax kommen (liegt wahrscheinlich an dem UTF8 von Ajax; allerdings ist das HTML-Dokument auch UTF8 :( )
Geholfen hat es, folgende Zeile in die /includes/ajax.kbase.php einzufügen: Aus:
$sql='SELECT answer FROM '.KB_PREMADE_TABLE.' WHERE isenabled=1 AND premade_id='.db_input($params['id']); if(($res=db_query($sql)) && db_num_rows($res)) list($response)=db_fetch_row($res);
wird
$sql='SELECT answer FROM '.KB_PREMADE_TABLE.' WHERE isenabled=1 AND premade_id='.db_input($params['id']); if(($res=db_query($sql)) && db_num_rows($res)) list($response)=db_fetch_row($res); $response = utf8_encode($response); // ADDED BY GERALD
Problem: Umlaute werden bei der gesendeten Nachricht falsch dargestellt (also beim Empfänger).
Geholfen hat es, in der /inlclude/class.mailer.php folgendes zu ändern (Änderungen sind im Kommentar dahinter bekennzeichnet; auf 'gerald' achten):
//do some cleanup $eol="\n"; $to=preg_replace("/(\r\n|\r|\n)/s",'', trim($to)); $subject=stripslashes(preg_replace("/(\r\n|\r|\n)/s",'', trim($subject))); $body = stripslashes(preg_replace("/(\r\n|\r)/s", "\n", trim($message))); $fromname=$this->getName(); $from =sprintf('"%s"<%s>',($fromname?$fromname:$this->getEmail()),$this->getEmail()); $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject, 'Date'=>date('D, d M Y H:i:s O'), 'Message-ID' =>'<'.Misc::randCode(6).''.time().'-'.$this->getEmail().'>', 'X-Mailer' =>'osTicket v 1.6', 'Content-Type' => 'text/html; charset="iso-8859-1"'// changed from utf-8 by GERALD ); $mime = new Mail_mime(); $mime->setTXTBody($body); //attachment TODO: allow multiple attachments - $attachment should be mixed parts. if($attachment && $attachment['file'] && is_readable($attachment['file'])) { //file of mime type. $mime->addAttachment($attachment['file'],$attachment['type'],$attachment['name']); } $options=array('head_encoding' => 'quoted-printable', 'text_encoding' => 'quoted-printable', 'html_encoding' => 'base64', 'html_charset' => 'iso-8859-1',// changed from utf-8 by GERALD 'text_charset' => 'iso-8859-1');// changed from utf-8 by GERALD //encode the body $body = utf8_decode($body);// added by GERALD $body = $mime->get($options);
Kein Word-Wrap in eMails: eMail-Antworten werden nach 76 Zeichen (so wie es sein soll) umgebrochen, auch mitten im Wort. Sieht blöd aus und liest sich sehr schlecht.
osTicket verwendet PEAR als Mailinglibrary. Zumindest die verwendete Version nimmt keine Rücksicht auf Wörter bei der Printable Quoted Verkodierung. Die entsprechende Funktion muss ersetzt werden.
Öffne die Datei /support/include/pear/Mail/mimePart.php und ändere die Funktion _quotedPrintableEncode:
function _quotedPrintableEncode($input, $line_max = 76) { // I use this instead of the original one, because it supports word wrap (gerald) $hex = array('0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'); $lines = preg_split("/(?:\r\n|\r|\n)/", $input); $linebreak = "=0D=0A=\r\n"; /* the linebreak also counts as characters in the mime_qp_long_line * rule of spam-assassin */ $line_max = $line_max - strlen($linebreak); $escape = "="; $output = ""; $cur_conv_line = ""; $length = 0; $whitespace_pos = 0; $addtl_chars = 0; // iterate lines for ($j=0; $j<count($lines); $j++) { $line = $lines[$j]; $linlen = strlen($line); // iterate chars for ($i = 0; $i < $linlen; $i++) { $c = substr($line, $i, 1); $dec = ord($c); $length++; if ($dec == 32) { // space occurring at end of line, need to encode if (($i == ($linlen - 1))) { $c = "=20"; $length += 2; } $addtl_chars = 0; $whitespace_pos = $i; } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { $h2 = floor($dec/16); $h1 = floor($dec%16); $c = $escape . $hex["$h2"] . $hex["$h1"]; $length += 2; $addtl_chars += 2; } // length for wordwrap exceeded, get a newline into the text if ($length >= $line_max) { $cur_conv_line .= $c; // read only up to the whitespace for the current line $whitesp_diff = $i - $whitespace_pos + $addtl_chars; /* the text after the whitespace will have to be read * again ( + any additional characters that came into * existence as a result of the encoding process after the whitespace) * * Also, do not start at 0, if there was *no* whitespace in * the whole line */ if (($i + $addtl_chars) > $whitesp_diff) { $output .= substr($cur_conv_line, 0, (strlen($cur_conv_line) - $whitesp_diff)) . $linebreak; $i = $i - $whitesp_diff + $addtl_chars; } else { $output .= $cur_conv_line . $linebreak; } $cur_conv_line = ""; $length = 0; $whitespace_pos = 0; } else { // length for wordwrap not reached, continue reading $cur_conv_line .= $c; } } // end of for $length = 0; $whitespace_pos = 0; $output .= $cur_conv_line; $cur_conv_line = ""; if ($j<=count($lines)-1) { $output .= $linebreak; } } // end for $output = str_replace("\r\n", "\n", $output); // gerald $output = str_replace("\n\n", "\n", $output); // gerald return trim($output); } // end quoted_printable_encode
Damit man auf der Webseite im Formular die Umbrüche gleich richtig sieht, kann man auch gleich das Formularfeld (nachTextarea suchen) in der Datei /support/include/staff/viewticket.php
<textarea name="response" id="response" cols="76" rows="18" wrap="soft" style="width:90%"><?=$info['response']?></textarea>
In dieser Datei kann man noch die Zeile ändern, wenn es einen nervt, dass bei der Antwort nicht 'my signature' als default angekreuzt ist:
$info['signature']=!$info['signature']?'none':$info['signature']; //change 'none' to 'mine' to default to staff signature
none zu mine ändern!
Ein normaler User (kein Admin) bekommt z.B. 2 offene Tickets angezeigt. Klickt er drauf, steht da: kein offenes Ticket gefunden. Das ist verwirrend.
Das Problem liegt an den verschiedenen DB-Anfragen für die Schnellübersicht und der eigentlichen Ticketauflistung.
Um das zu ändern, Datei support/scp/tickets.php aufrufen. Dort nach der SQL-Abfrage suchen (ca. Zeile 415). Ändern in:
//Navigation $submenu=array(); /*quick stats...*/ // modified by GERALD $sql='SELECT count(open.ticket_id) as open, count(answered.ticket_id) as answered '. ',count(overdue.ticket_id) as overdue, count(assigned.ticket_id) as assigned '. ' FROM '.TICKET_TABLE.' ticket '. ' LEFT JOIN ost_department dept ON ticket.dept_id=dept.dept_id'. // gerald 'LEFT JOIN '.TICKET_TABLE.' open ON open.ticket_id=ticket.ticket_id AND open.status=\'open\' AND open.isanswered=0 '; if(!$thisuser->isAdmin()) // gerald $sql.='AND (open.staff_id=0 OR open.staff_id='.db_input($thisuser->getId()).' OR dept.manager_id='.db_input($thisuser->getId()).') '; // gerald $sql.='LEFT JOIN '.TICKET_TABLE.' answered ON answered.ticket_id=ticket.ticket_id AND answered.status=\'open\' AND answered.isanswered=1 '. 'LEFT JOIN '.TICKET_TABLE.' overdue ON overdue.ticket_id=ticket.ticket_id AND overdue.status=\'open\' AND overdue.isoverdue=1 '; if(!$thisuser->isAdmin()) // gerald $sql.='AND (overdue.staff_id=0 OR overdue.staff_id='.db_input($thisuser->getId()).' OR dept.manager_id='.db_input($thisuser->getId()).') '; // gerald $sql.='LEFT JOIN '.TICKET_TABLE.' assigned ON assigned.ticket_id=ticket.ticket_id AND assigned.staff_id='.db_input($thisuser->getId()); if(!$thisuser->isAdmin()){ $sql.=' WHERE ticket.dept_id IN('.implode(',',$thisuser->getDepts()).') OR ticket.staff_id='.db_input($thisuser->getId()); }
Wenn man schon dabei ist, und es einen nervt, dann kann man gleich die if-Zeilen auskommentieren (oder umschreiben, wie hier), die verhindern, dass offenen und bearbeitete Tickets wenn nicht vorhanden nicht angezeigt werden oben in der Übersicht.
if($stats['open']) $nav->addSubMenu(array('desc'=>'Offen ('.$stats['open'].')','title'=>'Offene Tickets', 'href'=>'tickets.php', 'iconclass'=>'Ticket')); else $nav->addSubMenu(array('desc'=>'Offen (0)','title'=>'Offene Tickets', 'href'=>'tickets.php', 'iconclass'=>'Ticket')); if($stats['answered']) { $nav->addSubMenu(array('desc'=>'Beantwortet ('.$stats['answered'].')','title'=>'Beantwortete Tickets', 'href'=>'tickets.php?status=answered', 'iconclass'=>'answeredTickets')); } else { $nav->addSubMenu(array('desc'=>'Beantwortet (0)','title'=>'Beantwortete Tickets', 'href'=>'tickets.php?status=answered', 'iconclass'=>'answeredTickets')); }
osTicket v.1.9.5
HTML, header, Webseiten selbst und Metatags sagen, dass es UTF-8 ist. Im Browser kommen die Umlaute nicht richtig rüber. Erst wenn man die Codierung im Browser manuell umstellt (evtl. auch erst weg von UTF-8 und dann wieder hin), zeigt er korrekte Zeichen an.
Apache sendet den richtigen, das PHP sendet den falschen Zeichensatz.
Entweder den charset in php.ini umstellen oder nur für das benötigte Verzeichnis via .htaccess:
# OSTicket is UTF-8. Set php to UTF-8: php_value default_charset "UTF-8" php_value iconv.input_encoding "UTF-8" php_value iconv.internal_encoding "UTF-8" php_value iconv.output_encoding "UTF-8" php_value mbstring.internal_encoding UTF-8 php_value mbstring.http_output UTF-8 php_value mbstring.encoding_translation On php_value mbstring.func_overload 6
Mit manchen Browsern kann man sich nicht einloggen. Kommt keine Fehlermeldung, nur ein 'Authentifizierung erforderlich'. Bei der Passwort-Vergessen-Funktion meckert er aber CSRF-Token falsch.
Der Pfad der Cookies ist falsch. Die werden für ein falsches Verzeichnis gespeichert. Dass es mit manchen Browsern überhaupt geht, liegt daran, dass die einen Bug haben und den Pfad gar nicht auswerten. Bei meinem Server ist es so, dass die einzelnen Domains in jeweils Unterverzeichnisen liegen und via .htaccess in einzelne Domains in diese Unterverzeichnisse geschickt werden. Leider funktioniert daher die automatische Erkennung der Konstanten ROOT_PATH in der support/bootstrap.php nicht (weil der das Unterverzeichnis auch sieht). Daher wir der Cookie mit falschen Pfad gesetzt.
Für solche Fälle gibt es am Ende der ost-config.php die Möglichkeit, die ROOT_PATH manuell zu setzten. Doch leider: Bug. Die bootsprap.php wird VOR der ost-config.php ausgeführt und daher bringt es nicht, die define('ROOT_PATH', '/support/'); dort zu setzten, weil sie bereits gesetzt ist. Lösung (quick&dirty bugfix): Öffne bootstrap.php und setzt an den Anfang:
# Bug: this file is included BEFORE ost-config.php. So the define of ROOT_PATH has no result there! define('ROOT_PATH', '/support/');
Update 2024: Das Problem existiert immer noch!
Kann kein IMAP/POP-Abholung (oder Versenden anlegen. Gibt immer die Fehlermeldung:
[SMTP: STARTTLS failed (code: 220, response: 2.0.0 Ready to start TLS)]
Quelle1) My problem was that the blocking server connections using TLS
walking in the \ include \ pear \ Net, I found the file smtp.php
modify the line 467
the line is something like: if (version_compare (PHP_VERSION, '5 .1.0 ','>=') & & (isset ($ this→ _esmtp [' STARTTLS ']) | | ($ this→ _esmtp [' STARTTLS '] == true)) ) {
replaced it with: if (version_compare (PHP_VERSION, '6 .1.0 ','>=') & & (isset ($ this→ _esmtp [' STARTTLS ']) | | ($ this→ _esmtp [' STARTTLS '] == true)) ) {
I guess what I got was that they connect to SMTP using TLS because that line it does is connect using TLS if the version of PHP is 5.1.0 and my version was that actually .. so I put the 6.1.0 (which does not exist) and so connected without using TLS and since then I accept the accounts and everything works perfect. :)
Was diese Versionsabfrage soll? Keine Ahnung!
Das SMTP scheint nicht mehr zu funktionieren. Fehlermeldung: osticket STARTTLS failed (code: 220, response: 2.0.0 Start TLS)]
https://github.com/pear/Net_SMTP/issues/14 PHP 5.6
I was getting this error, but even disabling STARTTLS (as several of the above comments suggest) didn't help, as it then reported an authentication error. I found the proper fix for at least my situation.
If you're using PHP 5.6, there are changes to SSL: http://php.net/manual/en/migration56.openssl.php
Mainly, there is extra verification done on the connection. This verification wasn't done on 5.5 so these issues were ignored. But in my situation, the server was sending the SMTP EHLO command with „localhost“ and apparently that causes PHP's new verification to fail.
The solution is to patch osTicket's mail class at /include/pear/Net/SMTP.php - change this line:
$this→_socket_options =$socket_options;
to
$this→_socket_options = array('ssl' ⇒ array('verify_peer_name' ⇒ false));
This turns the verification off. For my setup, the mail server is on the same local network as the osTicket server, so I'm not overly concerned about the security.
The other solution is to downgrade to PHP 5.5 which doesn't have this extra verification.
Quelle2)
You need to edit the file /js/redactor-osticket.js:
this.$draft_saved = $('<span>') .addClass("pull-right draft-saved") .hide() .append($('<span>')); //.text(__('Draft Saved'))); // Float the [Draft Saved] box with the toolbar //this.$toolbar.append(this.$draft_saved); if (this.opts.draftDelete) { var trash = this.buttonAdd('deleteDraft', __('Delete Draft'), this.deleteDraft); this.buttonAwesome('deleteDraft', 'icon-trash'); trash.parent().addClass('pull-right'); trash.addClass('delete-draft'); }
Eine Zeile (this.$toolbar.append(this.$draft_saved);) auskommentieren. Das ist alles. ==== Lösung ====