Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
technisch korrekt zitieren - kammquoting vermeiden [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
technisch korrekt zitieren - kammquoting vermeiden


 
php_rookie
26-03-2007, 09:17 
 
hi,

hab mir vor kurzem einen kleinen webmailer geschrieben. jetzt suche ich nach einer möglichkeit kammquoting bei antwort-emails zu vermeiden, d.h. der text der originalen nachricht soll beim antworten in das textarea korrekt zitiert übernommen werden. einfach ein zitat-zeichen vor jede zeile zu stellen funktioniert nur bis zu einer bestimmten antworttiefe, danach gibt es kammquotings, welche ich gerne vermeiden möchte.

person A schreib z.b.

hallo welt

person B antwortet auf die nachricht von person A. in seinem eingabefeld steht dann folgendes:

> hallo welt
noch ein text

wenn person A wieder antwortet folgendes:

>> hallo welt
> noch ein text
und noch einer

und immer so weiter. jede zeile soll nur bis 78 zeichen gefüllt werden. wenn sie im laufe des briefwechsels aufgrund der eingefügen zeichen zu lang wird, soll umgebrochen und danach wieder entsprechend mit zitatzeichen versehen werden. ganz normales zitieren, wie es jeder gängige email-client beherrscht.

gibt es hierfür bereits fertige funktionen oder klassen, die man sich anschauen könnte?

danke.

 
onemorenerd
26-03-2007, 10:17 
 
Original geschrieben von php_rookie
ganz normales zitieren, wie es jeder gängige email-client beherrscht.Wenn dem mal so wäre. Manche Clients kommen mit den Quoting Characters anderer Clients nicht klar. Allen voran Outlook.

Nun zu deiner Frage: Mit Kammquoting meinst du den Wechsel aus kurzen und langen Zeilen, richtig?
Da wird aus (1)
> 76 Zeichen lange Zeile .... mit Ende
> und nächster Zeile

eben (2)
>> 76 Zeichen lange Zeile .... mit
>> Ende
>> und nächster Zeile

statt der viel lesbareren Variante (3)
>> 76 Zeichen lange Zeile .... mit
>> Ende und nächster Zeile

Aber warum ist das so? Ganz einfach: Outlook weiß nicht, ob der Zeilenumbruch in (1) durch früheres Quoting eingefügt wurde oder vom Benutzer. Der könnte an dieser Stelle einen Absatz gemacht haben. Den einfach weg zu quoten würde die Struktur des Textes verändern.
Nicht mal der "First Level Quoter" kann sicher sein, dass alle Umbrüche vom Autor stammen. Manche Clients wenden die maximale Zeilenlänge auch auf ausgehende Mails an (zugegeben, die sind selten geworden) und Mailserver sind per SMTP-Protokoll dazu angehalten, nach ca. 1000 Zeichen einen Umbruch einzufügen (aus historischen Gründen). Dennoch könnte er Kammquoting vermeiden, denn auch der Leser weiß das nicht.
Aber imho macht zumindest Outlook nichts dergleichen.

Fazit: Nur in geschlossenen Systemen wie z.B. private Messaging auf einer Webseite kann man Kammquoting vermeiden.

 
php_rookie
26-03-2007, 12:34 
 
>> 76 Zeichen lange Zeile .... mit
>> Ende
>> und nächster Zeilesowas wäre schon mal durchaus in ordnung. was ich nicht will ist sowas hier:>> 76 Zeichen lange Zeile .... mit
Ende
>> und nächster Zeilealso outlook express style...

 
onemorenerd
26-03-2007, 19:37 
 
Na das ist doch kein Problem.

function quote($mailbody, $maxlength = 76, $quotechar = '> ') {
$lines = explode("\r\n", $mailbody);
foreach ($lines as $i => $line) {
$line = $quotechar.$line;
// Zeile zu lang
if (strlen(trim($line)) > $maxlength) {
// gute Stelle für Umbruch suchen, muß vor $maxlength liegen
$breakpos = min(max((int) strrpos($line, ' '),
(int) strrpos($line, "\t")), $maxlength);
// Zeile in zwei Zeilen aufteilen
$line1 = substr($line, 0, $beakpos)."\r\n";
$line2 = substr($line, $breakpos);
// Quotelevel der 1. Zeile ermitteln
$quotelevel = strlen($quotechar);
while (substr($line1, $quotelevel, strlen($quotechar)) == $quotechar) {
$quotelevel += strlen($quotechar);
}
// und auf 2. Zeile übertragen
$line2 = str_repeat($quotechar, $quotelevel / strlen($quotechar)).$line2;
$line = $line1.$line2;
}
$lines[$i] = $line;
}
return implode('', $lines);
}
Das ist nur so aus der Hand geschrieben. Du solltest auf jeden Fall noch berücksichtigen, dass $line2 nach dem Vorsetzen der Quotezeichen wiederum länger als $maxlength sein könnte.
Außerdem macht es Sinn, einen maximalen Quotelevel zu definieren.
Wenn du ganz genau sein willst, solltest du bei der Ermittlung des Quotelevels von $line1 berücksichtigen, dass der Autor diese Zeile zufällig mit $quotechar begonnen haben könnte. Das kann man allerdings nicht erkennen und müßte daher den Algorithmus ganz anders aufziehen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:37 Uhr.