Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit CSV-Codierung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit CSV-Codierung

    Hallo allerseits!

    Ich hab ein kleines Script geschrieben, dass (von einem Formular) Daten bekommt, diese dann in eine CSV-Datei schreibt und eine Email mit der CSV-Datei als Anhang verschickt.
    Soweit sogut.
    Nur ergibt sich jetzt ein sehr störendes Problem:
    Umlaute werden in der CSV-Datei falsch dargestellt!
    Ich finde aber den Fehler einfach nicht ...

    Meine Frage also: Was stimmt an meinem Code nicht?
    Code:
    <?php
    // Administrator - Email
    // Name der CSV-Datei, Empfaenger, Absender, Betreff, Mailtext, Ueberschriftszeile der CSV-Datei, Dankeschoen-Text, Error-Text
    $filename = "formular_email.csv";
    $receiver = "xxx@xxx.de";
    $sender   = "Webmaster <webmaster@xxx.net>";
    $subject  = "Anmeldedaten aktuell";
    $mailText = "Anbei die aktuellsten Anmelde-Daten.";
    $csvHead  = "Vorname;Zuname;Firma;PLZ;Ort;Strasse;E-Mailadresse";
    $thanks   = "Herzlichen Dank f&uuml;r Ihre Anmeldung!";
    $error    = "Ihre Daten konnten nicht weitergeleitet werden.
    Bitte wenden Sie sich an den Webmaster.";
    $nextPage = "http://xxx.de/main20.htm";
    
    // User - Email
    // Empfaenger, Absender, Befreff, Mailtext
    $ureceiver = $_POST["frage_07"];
    
    // prueft ob die CSV-Datei bereits existiert
    if (!file_exists($filename))
            $answers = $csvHead."\n";
    else
            $answers = "\n";
    // Formulardaten in in einen String schreiben
            $answers.= $_POST["frage_01"];
    for ($i = 2; $i < 8; $i++) {
            $answers.= ";".$_POST["frage_0".$i];
    }
    // Formulardaten in an CSV-Datei anhaengen
    $fpointer = fopen($filename, "a+");
    fputs($fpointer, $answers);
    fclose($fpointer);
    
    // Hier wird der Textstring der Abgrenzung generiert
    $boundary = md5(uniqid(rand()));
    // Das sind die Kopfzeilen der Multipart Mail
    $header = "MIME-Version: 1.0\n";
    $header.= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n";
    // zusaetzliche Header
    $header .= "From: ".$sender."\n\n";
    // HTML-Text
    $text.= "--".$boundary."\n";
    $text.= "Content-Type: text/html; charset=\"UTF-8\"\n";
    $text.= "Content-Transfer-Encoding: 8bit\n\n";
    $text.= "
    <html>
     <head>
      <title>".$subject."</title>
     </head>
     <body>
      ".$mailText."
     </body>
    </html>\n";
    // CSV-Datei
    $text.= "--".$boundary."\n";
    $text.= "Content-Type: text/comma-separated-values name=".$filename."\n";
    $text.= "Content-Transfer-Encoding: base8\n";
    $text.= "Content-Disposition: attachment; filename=".$filename."\n\n";
    // die Datei wird komplett in einen String eingelesen und in die Mail eingefuegt
    $attachment = file_get_contents($filename);
    $text.= $attachment."\n";
    // abschliessnde Begrenzung der Multipart-Mail
    $text.= "--".$boundary."--\n"; 
    
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
     <head>
      <title>Danke</title>
      <link rel='stylesheet' type='text/css' href='../style.css'>
      <style type='text/css'>
            body.main { background: #323232;  }
      </style>
     </head>
     <body>
    <?
    
    // EMail abschicken
    if (mail($receiver, $subject, $text, $header)) {
    ?>
            echo "<h1>".$thanks."</h1>";
            // mail($ureceiver, $usubject, $umailtext, "from:$usender");
    } else {
            echo "<h1>".$error."</h1>";
    }
    ?>
      weiter
     </body>
    </html>
    1000 Dank im Vorraus für jede Antwort!

  • #2
    was meinst du mit "Falsch" dargestellt ????

    Wenn dann liegts an der Codierung. Schon mal die Postdaten ausgeben lassen ?? werden diese richtig dargestellt ??

    Also ... Werden die Umlaute korrekt übergeben oder schreibt er die Umlaute nur falsch in die Datei ???

    Kommentar


    • #3
      nun wenn die post daten richtig angezeigt werden, liegts daran:

      $text.= "Content-Transfer-Encoding: base8\n";

      Kommentar


      • #4
        Ich vermute auch, dass es an der Codierung liegt, aber wo genau ist der Fehler?

        Ich habe mir die POST-Daten schon ausgeben lassen, die sind korrekt, erst in der Email, genauer gesagt in der angehängten CSV-Datei werden die Daten falsch dargestellt.

        Beispiel:
        Jäger wird als Jäger dargestellt,
        ein Ö als ö
        ...

        Kommentar


        • #5
          ok, und was soll ich statt base8 dann nehmen?

          Kommentar


          • #6
            http://en.wikipedia.org/wiki/MIME#Co...nsfer-Encoding

            http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html

            ausserdem solltest du evtl. mal hier nachschaun wenn du jetzt schon Porbleme bekommst.
            http://phpmailer.sourceforge.net/

            Kommentar


            • #7
              Danke für die Links aber ich bin nicht fündig geworden...

              Ich habe schon (bevor ich gepostet habe) anstatt base8 8bit, 7bit, base64, quoted-printable und binary getestet.
              Der einzige Unterschied war, dass man bei base64 überhaupt nichts mehr lesen konnte, sonst war es immer das gleiche...

              Kann es sein, dass der Fehler doch woanders ist, oder gibt es noch einen Codiertyp?

              Kommentar


              • #8
                Welche Codierung wird am Server verwendet?

                Gegebenenfalls musst du mit mb_convert_encoding()
                von der Servercodierung auf '8bit' konvertieren und dann bei Content-Transfer-Encoding natuerlich auch '8bit' schreiben.

                Ich hatte das Problem auch beim Emails versenden.

                Kommentar


                • #9
                  der Server verwendet LC_CTYPE=de_DE.UTF-8

                  Jetzt mal eine blöde Frage: Wie kann ich von der Servercodierung auf 8bit konvertieren??

                  -------------------------------------------------------------------------------------
                  edit
                  -------------------------------------------------------------------------------------

                  Sorry, bin kurz auf der Leitung gestanden

                  Vielen Dank!
                  Jetzt funktionierts!

                  Kommentar


                  • #10
                    Paasst

                    Kommentar

                    Lädt...
                    X