Michael W.: Internes Mail-System

hallo,

für meine Homepage meiner (!!ehemaligen!!) Schulklasse habe ich mir überlegt ein internes mailsystem aufzubauen:

wieder gibt es 22 ordner - in jeden diesen ordner kommt jetzt der ordner mails dazu. in diesen ordner kommen dann alle mails.

in allen der 22 ordner kommt auch noch dazu:
1. mail.php (verfassen einer mail an einen mitschüler),
2. send-mail.php(das script/antwortseite) und
3. mails.php (zum abrufen der mails).

zu mails.php habe ich mir überlegt, da ja alle mails in den mails-ordner kommen brauche ich nur eine Directory anzeigen lassen und es werden alle mails aufgelistet. dazu noch eine Base in das html-dokument und die mails werden immer im rechten frame geöffnet (design spielt hier keine rolle) - dazu folgendes php-script:

---------------------------------------
<html>
<head>
<title>DirectoryListing</title>
</head>
<body bgcolor="#000000" text="#CCCCCC" link="#CCCCCC" vlink="#CCCCCC" alink="#CCCCCC">
<table width="60%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#006666">
  <tr>
    <td>
      <div align="center"><font face="Arial, Helvetica, sans-serif" size="2">
<b>Directory Listing</b></font>
</div>
    </td>
  </tr>
</table>
<?php
function getDirList ($dirName) {
 $d = dir($dirName);
 $dirName = strtoupper($dirName);
 while($entry = $d->read()) {

if ($entry != "." && $entry != "..") {
   if (is_dir($dirName."/".$entry."  ")) {
    getDirList($dirName."/".$entry);
   }
   else {
?>

<table width="60%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#003366">
    <tr>
      <td>

<div align="left"><font color="#009999"><a href="<?php echo $dirName."/".$entry; ?>" target="_blank">
        <font size="1" face="Arial, Helvetica, sans-serif"> <b><?php echo $dirName; ?>
        </b></font> <font size="1" face="Arial, Helvetica, sans-serif"><b><?php echo $entry; ?></b></font></a></font></div>
      </td>
    </tr>
  </table>
<?php
   }
  }
 }
  $d->close();
}
 getDirList(".");
?>

</body>
</html>
<html>
<head>
<title>DirectoryListing</title>
</head>
<body bgcolor="#000000" text="#CCCCCC" link="#CCCCCC" vlink="#CCCCCC" alink="#CCCCCC">
<table width="60%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#006666">
  <tr>
    <td>
      <div align="center"><font face="Arial, Helvetica, sans-serif" size="2">
<b>Directory Listing</b></font>
</div>
    </td>
  </tr>
</table>
<?php
function getDirList ($dirName) {
 $d = dir($dirName);
 $dirName = strtoupper($dirName);
 while($entry = $d->read()) {

if ($entry != "." && $entry != "..") {
   if (is_dir($dirName."/".$entry."  ")) {
    getDirList($dirName."/".$entry);
   }
   else {
?>

<table width="60%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#003366">
    <tr>
      <td>

<div align="left"><font color="#009999"><a href="<?php echo $dirName."/".$entry; ?>" target="_blank">
        <font size="1" face="Arial, Helvetica, sans-serif"> <b><?php echo $dirName; ?>
        </b></font> <font size="1" face="Arial, Helvetica, sans-serif"><b><?php echo $entry; ?></b></font></a></font></div>
      </td>
    </tr>
  </table>
<?php
   }
  }
 }
  $d->close();
}
 getDirList(".");
?>

</body>
</html>
<html>
<head>
<title>DirectoryListing</title>
</head>
<body bgcolor="#000000" text="#CCCCCC" link="#CCCCCC" vlink="#CCCCCC" alink="#CCCCCC">
<table width="60%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#006666">
  <tr>
    <td>
      <div align="center"><font face="Arial, Helvetica, sans-serif" size="2">
<b>Directory Listing</b></font>
</div>
    </td>
  </tr>
</table>
<?php
function getDirList ($dirName) {
 $d = dir($dirName);
 $dirName = strtoupper($dirName);
 while($entry = $d->read()) {

if ($entry != "." && $entry != "..") {
   if (is_dir($dirName."/".$entry."  ")) {
    getDirList($dirName."/".$entry);
   }
   else {
?>

<table width="60%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#003366">
    <tr>
      <td>

<div align="left"><font color="#009999"><a href="<?php echo $dirName."/".$entry; ?>" target="_blank">
        <font size="1" face="Arial, Helvetica, sans-serif"> <b><?php echo $dirName; ?>
        </b></font> <font size="1" face="Arial, Helvetica, sans-serif"><b><?php echo $entry; ?></b></font></a></font></div>
      </td>
    </tr>
  </table>
<?php
   }
  }
 }
  $d->close();
}
 getDirList(".");
?>

</body>
</html>
---------------------------------------

klappt !!
um bestimmte mails zu löschen wurde mir

<?
    unlink("thisfile.php");
?>

empfohlen.

ich würde jetzt gerne, und das ist auch mein problem und grund des postings, diese beiden funktionen ineinnander schließen:

--> Eine Tabelle mit der anzeige der atuellen Mails und direkt daneber die Funktion mails zu löschen

Beispeil:

--------------------------------------------
Aktuelle Mails für ("$name.txt"):
--------------------------------------------
   Betreff      | Alles Löschen |  Datum
--------------------------------------------

was ist mit ... |   Löschen     | 01.07.2002
alles klar ?    |   Löschen     | 01.07.2002
viel spaß       |   Löschen     | 01.07.2002
--------------------------------------------

ist so was in der richtung machbar ???
es geht ja im prinzip nur noch um das löschen (datum ist ja uch nicht wichtig) und eine alles löschen funktion auch nicht unbedingt.
wie bekomme ich

<?
    unlink($file);
?>

in das Directory-script rein ? so das der wert $file durch den namen der datei (in dem fall ist das der betreff!!, der beim ausfüllen des formulars, um eine mail an einen mitschüler zu senden, ausgefüllt werden muss) ersetz wird, so dass "Löschen" hinter jedem betreff auch die datei löscht die er zu löschen hat.
beispeil

viel spaß | Löschen (<? unlink("viel spaß.php"); ?>)

und genau in diesem augenblick werfen sich neue fragen auf:
* dürfen die betreffe überhaupt spaces habe - also:
"Hallo_Das_Ist_Ein_Betreff" ?? und
*dürfen die zeichen wie ??? haben ???
---> ist das jetzt überhaupt eine relevamte lösung ??

und zu guter letzt die frage: was ist wenn der betreff zu lang ist ?

übrigens das Directory-script habe ich hier einmal getestet http://mitglied.lycos.de/djwoelk3/test/dir2.php

Danke für alle die sich jetzt die köpfe darüber zerreissen ... ;)

  1. Hi,

    viel spaß | Löschen (<? unlink("viel spaß.php"); ?>)

    ich glaube, Du musst noch eine wesentliche Erkenntnis in Sachen HTTP erreichen:

    HTTP ist verbindungslos. Jeder Request ist absolut und vollständig unabhängig von allen, die jemals eventuell gewesen sein mögen.

    Das bedeutet für Dich insbesondere, dass unlink() in einem Script stehen muss, welches erst _nach_ (bzw. durch) den Linkklick aufgerufen wird. Diesem übergibst Du den Dateinamen per URL-Parameter, welchen Du wie gewohnt in $_GET ausliest.

    Nebenbei: Es ergibt nicht den geringsten Sinn, eine Ressource, die keine einzige Zeile PHP-Code an den Client zurückliefert, mit ".php" zu benamsen. Es handelt sich um HTML-Ressourcen, also ist ".html" angemessen.

    und zu guter letzt die frage: was ist wenn der betreff zu lang ist ?

    Dann verwendest Du fortlaufende Nummern oder andere Identifier ("IDs", z.B. die Message-IDs aus dem Mailheader), anhand derer Du eine Mail grundsätzlich und konsequent identifizierst. Der Betreff ist zur Ausgabe bestimmt - zu jedem anderen Zweck ist er entweder nicht eindeutig genug oder aufgrund seiner Syntax zu umständlich zu handhaben.

    Cheatah

    1. puh :(
      das ist doch komplizieter wie ich dachte ...

      wgen diesem unlink()

      wenn ich das in die php schreibe will der das dann gleich ausführen oder erst wenn ich es per link aufrufe (irgendiw emachts nicht klick...) ???

      ?

      1. Hi,

        das ist doch komplizieter wie ich dachte ...

        willkommen in der wunderbaren Welt von HTTP :-)

        wenn ich das in die php schreibe will der das dann gleich ausführen oder erst wenn ich es per link aufrufe (irgendiw emachts nicht klick...) ???

        Geh das ganze mal schrittweise an:

        • Du schreibst ein PHP-Script namens "loeschen.html", welches z.B. mittels $_GET['id'] den Dateinamen herausfindet und die Datei löscht.
        • Ein anderes Script schreibt in seine Ausgabe an den Browser:
            <a href="loeschen.html?id=17">
        • Das sind Buchstaben und ein paar Sonderzeichen.
        • Wird durch die Ausgabe von Buchstaben und ein paar Sonderzeichen ein Script ausgeführt?

        HTH, Hope That Helps :-)

        Cheatah

          • Du schreibst ein PHP-Script namens "loeschen.html", welches z.B. mittels $_GET['id'] den Dateinamen herausfindet und die Datei löscht.
          • Ein anderes Script schreibt in seine Ausgabe an den Browser:
              <a href="loeschen.html?id=17">
          • Das sind Buchstaben und ein paar Sonderzeichen.
          • Wird durch die Ausgabe von Buchstaben und ein paar Sonderzeichen ein Script ausgeführt?

          HTH, Hope That Helps :-)

          a littlel bit, but i can not understand what $_GET['id'] soll !?
          also - ich mache die seite clear.htm (english hört sich besser an - vor allem ist dann das Ö=OE weg). und was kommt in diese clear.htm dann rein - nur das script ? oder auch eine antwort seite sollte das nicht clear.php sein ?
          wie könnte jetzt das script dazu aussehen ?

          ich brauch noch ein bischen help :)

          Danke

          1. Hi,

            a littlel bit, but i can not understand what $_GET['id'] soll !?

            wie ich einem vorherigen Posting erwähnt habe, solltest Du die Mails nicht anhand des Subjects identifizieren, sondern an einer eindeutigen ID, beispielsweise der Message-ID oder etwas selbst generiertem. Diese kann gerne als URL-Parameter "id=blabla" übergeben werden. Und wie ließt man URL-Parameter aus? Natürlich mit $_GET. There we go :-)

            und was kommt in diese clear.htm dann rein - nur das script ?

            Sorry, aber: Das hängt von Deinem Konzept ab. Du kannst in einem Script nur eine Funktion unterbringen, oder mehrere, die Du anhand eines bestimmten Indizes aufrufst, HTML-Code oder Redirects auf statische oder andere dynamische Seiten - alles ist möglich und unter bestimmten Bedingungen sinnvoll.

            wie könnte jetzt das script dazu aussehen ?

            • ID auslesen,
            • zugehörige Maildatei identifizieren,
            • Datei löschen,
            • irgendwas sinnvolles zurückliefern.

            Zwischendrin natürlich noch Sicherheitsprüfungen wie z.B. "Darf der dat denn, der Doof?".

            Cheatah

            1. ok !! ... ?? ne net ganz glaube ich :|

              also ich muss das immer versuchen nachzuvollziehen:

              mich würde in aller erste leinie interessieren wie du das ganze 'stricken' würdest.

              gehen wir nochmal alles durch:

              gehen wir mal von 2 ordnern aus die miteinander kontakt zu einnander haben bzw die user kontakt über diese ordner aufnehmen ...

              um die ordner zu benennen geben wir ordner .../01/ den namen frank und 02 ist die gabi

              --- sinn ist es das gabi eine mail bzw eine text-datei in den ordner .../01/mails/ speichern kann ---

              das nötige know how dazu habe ich bereits in dem MA-System angewendet http://www.djwoelk.de/10b.

              es geht dadrum wie die mails verwalten werden:

              in den ordnern von frank und gabi befinden sich jeweils
              mail_verfassen.php
              mails_lesen_und_löschen.php
              script.php

              um mails zu lesen hatte ich ja die idee mit dem index of der mail ordner anzuzeigen.

              jetzt kommen wir wieder an den punkt, wo ich am überlegen bin, als was die textdateien abgespeichert werden:
              1. als betreff
              2. als ID (wie du sagtest) - so könnte auch keiner eine datei überschreiben - aber so sind die mails schlecht zu verwalten. wie sieht das denn aus wenn ich auf der linken seite eine liste mit lauter zahlen habe und recht dann die mails stehen. falls du mir nicht folgen kannst: ich habe mir das ganze in einem frameset vorgestelt:

              -----------------------------------------------------------
              | ----------------------------- |  -----------------------  |
              | | LISTE DER MAILS           | | | Mail von gabi         | |
              | ----------------------------- | | Mail-id: 057          | |
              | | Mail-id | lesen | löschen | | | Betreff:"hi"          | |
              | ----------------------------- | | --------------------- | |
              | | 056.txt | lesen | löschen | | |                       | |
              | | 057.txt | lesen | löschen | | | Hallo,                | |
              | | 096.txt | lesen | löschen | | | wir sehen uns noch    | |
              | | 125.txt | lesen | löschen | | | Caio                  | |
              | ----------------------------- |  -----------------------  |
               -----------------------------------------------------------

              fragen:

              1. wie bekomme ich das txt weg ? kann ich im speicher script das .txt weglassen - es wird doch so oder so als text gespeichert oder ?

              2. wie bekomme ich es hin das der text, der als mail angezeigt wird die formular-Fragmente enthält ?
              erläuterung:

              Mail von $name
              Mail-id: $id
              betreff: $subject
              text:    $message

              3.lesen ist glaube ich klar: da muss ich noch mal in dieses index of script reinschauen, nur das löschen wird ein problem. du meintest ich sollte das als link ausgeben <a href="clear.PHP?id=057">

              • das sollte dann auch kein problem sein - da muss ich auch noch mal das index of script mit dir durchkauen. das problem ist das script clear.php - was kommt das rein ??????

              Danke

              1. Hi,

                mich würde in aller erste leinie interessieren wie du das ganze 'stricken' würdest.

                also, ich würde die Daten zunächst einmal in einer Datenbank ablegen und vor allem so einiges drumherum bauen, was dazu führt, dass mein Lösungsansatz für Dich nicht mehr nutzbar wäre :-)

                jetzt kommen wir wieder an den punkt, wo ich am überlegen bin, als was die textdateien abgespeichert werden:

                1. als betreff

                Nein. Das ist niemals eindeutig und führt zudem zu anderen Problemen. Das Identifizierungsmerkmal darf _niemals_ durch den User definiert werden.

                1. als ID [...] aber so sind die mails schlecht zu verwalten.

                Nö, wieso?

                wie sieht das denn aus wenn ich auf der linken seite eine liste mit lauter zahlen habe

                Was hat die Darstellung mit der Verwaltung zu tun? Die Datei kann 42xT34l9k001.ff-4tRG2 heißen, und trotzdem wird "Hallo, wie geht es Dir?" im Frontend angezeigt. Die beiden Dinge haben nur soviel miteinander zu tun, dass _jede_ Aktion, auch die Darstellung des Subjects, aus der ID resultiert.

                1. wie bekomme ich das txt weg ?

                Indem Du es nicht mit ausgibst.

                kann ich im speicher script das .txt weglassen - es wird doch so oder so als text gespeichert oder ?

                Eine Datei kann "setup.exe" oder "bild.jpg" heißen und trotzdem Text enthalten. Das ist ja einer der größten Fehler von Windows, dass krampfhaft versucht wird, aus dem Dateinamen irgendwelche inhaltlichen Informationen zu beziehen. Noch größer ist der Fehler, dieses Konzept auf URLs zu erweitern, die mit Dateien nun überhaupt nichts mehr zu tun haben.

                1. wie bekomme ich es hin das der text, der als mail angezeigt wird die formular-Fragmente enthält ?

                Indem Du sie mit ausgibst.

                du meintest ich sollte das als link ausgeben <a href="clear.PHP?id=057">

                Nein, ich meinte, Du sollst einen solchen Link ausgeben:
                <a href="clear.html?id=057">
                Beachte, dass ich nicht nur die URL nicht auf ".php" benamse, da sie nicht eine Zeile PHP-Code an den Client zurückliefere, sondern dass ich zudem die Groß- und Kleinschreibung sinnvoll vereinheitliche.

                was kommt das rein ?

                <?php
                  $name = ermittle_dateinamen()
                  unlink($name)
                ?>

                ?????

                Und weniger Fragezeichen.

                Cheatah

                1. <?php
                    $name = ermittle_dateinamen()
                    unlink($name)
                  ?>

                  ich habs jetzt doch so gemacht wie ich mir das vorgestellt habe

                  <?php
                  $id = $_GET['id']
                  unlink($id)
                  ?>

                  doch dann kommt das:
                  Parse error: parse error in clear.php on line 8
                  Line 8 wäre unlink($id)
                  was stimmt denn nicht ?

                  Danke ?

                  1. <?php
                      $name = ermittle_dateinamen()
                      unlink($name)
                    ?>

                    ich habs jetzt doch so gemacht wie ich mir das vorgestellt habe

                    <?php
                    $id = $_GET['id']
                    unlink($id)
                    ?>

                    doch dann kommt das:
                    Parse error: parse error in clear.php on line 8
                    Line 8 wäre unlink($id)
                    was stimmt denn nicht ?

                    Danke ?

                    http://mitglied.lycos.de/djwoelk3/test/unlink/dir4.php