cr: Imap Codierung klappt nicht ganz

Hallo,

ich rufe emails über folgendes Script ab:

  
$headers = "From: $userfrom <$userfrom>\r\n";  
$headers .= "MIME-Version: 1.0\r\n";  
$headers .= "Content-type: text/plain; charset=utf-8\r\n";  
$headers .="Content-Transfer-Encoding: 8bit";  
  
$mailbox = imap_open("{imapurl}INBOX", imapusername, imapuserpass);  
  
$MC = imap_check($mailbox);  
  
$result = imap_fetch_overview($mailbox,"1:{$MC->Nmsgs}",0);  
foreach($result as $overview)  
{	  
	if("gesuchterinhalt" == htmlspecialchars(strtolower(trim($overview->subject))))  
	{  
		$message = imap_fetchbody($mailbox,$overview->msgno,1);  
		  
		$test = imap_fetchstructure($mailbox,$overview->msgno);  
		if($test->encoding == 0)  
		{  
			$message ="enc0".$message;  
		}  
		elseif($test->encoding == 1)  
		{  
			$message ="enc1".$message;  
		}  
		elseif($test->encoding == 2)  
		{  
			$message = "enc2".$message;  
		}  
		elseif($test->encoding == 3)  
		{  
			$message = "enc3".base64_decode($message);  
		}  
		elseif($test->encoding == 4)  
		{  
			$message = "enc4".quoted_printable_decode($message);  
		}  
		$new_text = trim($message);  
		  
		$new_datei = fopen("files/$unixtimestamp.txt", 'w');  
		if(fwrite($new_datei, "$new_text|||")) {  
if(imap_mail($email, "Antwort", "Inhalt: $new_text",  $headers))  
		

In der .txt speichert es den code zwar ab, jedoch wenn ich diesen auf einer utf-8 codierten seite ausgebe kommt datensalat. In der Antwortemail ist alles lesbar.

Wo ist der Fehler?

  1. Hi,

    ich rufe emails über folgendes Script ab:

    darüber möchte ich mich im Moment (noch) nicht auslassen, aber ...

    In der .txt speichert es den code zwar ab, jedoch wenn ich diesen auf einer utf-8 codierten seite ausgebe kommt datensalat. In der Antwortemail ist alles lesbar.
    Wo ist der Fehler?

    Schwer zu sagen. Insbesondere, weil wir weder den Inhalt deiner Mails kennen, noch dessen tatsächliche Codierung. Ohne Musterdaten und ein paar Debug-Informationen an strategisch günstiger Stelle ist eine Aussage fast unmöglich.

    Zur Ästhetik des Codes: Anstatt einer langen Folge von if ... elseif ... elseif wäre vermutlich eine switch-Anweisung schlauer.

    So long,
     Martin

    --
    Der Mensch denkt, Gott lenkt.
    Der Mensch dachte, Gott lachte.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi,

      hi

      ähm hier mal zur email was:

      Date: Wed, 22 Aug 2012 15:01:56 +0200
      From: xyz
      To: xyz
      Subject: subject
      User-Agent: Internet Messaging Program (IMP) H4 (5.0.19)
      Content-Type: text/plain; charset=ISO-8859-1; format=flowed; DelSp=Yes
      MIME-Version: 1.0
      Content-Disposition: inline
      Content-Transfer-Encoding: 8bit

      1. Tach!

        ähm hier mal zur email was:

        Mal angenommen die Mail hat Recht,

        Content-Type: text/plain; charset=ISO-8859-1; format=flowed; DelSp=Yes

        dann sagt sie hier, ihr Inhalt sei ISO-8859-1-kodiert. Wenn du den in eine UTF-8-Seite einfügen willst, musst du ihn umkodieren.

        dedlfix.

        1. hi:

          das hab ich auch grad eben gefunden...danke für den hinweiß:
           komisch ist das ich den webmailer auf uft-8 umgestellt habe...

            
          $message = mb_convert_encoding($message, 'utf-8', 'ISO-8859-1');  
          
          

          was ich nun nur noch suche ist eine möglichkeit zu checken welches charset genutzt wird...daran verzweifel ich noch... ;)

          1. Hi,

            was ich nun nur noch suche ist eine möglichkeit zu checken welches charset genutzt wird...daran verzweifel ich noch... ;)

            var_dump($test);

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. ah danke!

              wie kann ich aber auf den charset zugreifen - ich komme nur soweit hier:

              print_r($test->parameters[0]);

          2. Tach!

            was ich nun nur noch suche ist eine möglichkeit zu checken welches charset genutzt wird...daran verzweifel ich noch... ;)

            Das steht doch in der Content-Type-Zeile im Header der Mail. Du kannst dich nur darauf verlassen, dass das stimmt, ansonsten besteht keine Möglichkeit, herauszufinden welchen Kodierung der Absender gemeint hat. Man kann zwar auf korrektes UTF-8 prüfen, aber bei ISO-8859-... geht es nicht ohne Sinnanalyse des Textes. Außerdem musst du die Möglichkeit in Betracht ziehen, dass der Absender keine Angabe gemacht hat. Dann bleibt dir nichts anderes übrig, als von irgendeinem Default-Wert auszugehen.

            dedlfix.

    2. Hi,

      Zur Ästhetik des Codes: Anstatt einer langen Folge von if ... elseif ... elseif wäre vermutlich eine switch-Anweisung schlauer.

      Schlauer? Inwiefern? Nichmal groß eleganter, wie ich finde. Na ja, Geschmackssache. Ich würde diesen if-else-Block etwas anders formatieren und mehr meinem Coding-Style anpassen.

      Happy Coding
      c

      1. [latex]Mae  govannen![/latex]

        Zur Ästhetik des Codes: Anstatt einer langen Folge von if ... elseif ... elseif wäre vermutlich eine switch-Anweisung schlauer.
        Schlauer? Inwiefern? Nichmal groß eleganter, wie ich finde.

        Ja, „switch“ ist IMO irgendwie kömplett dämlich definiert. Dies liegt hauptsächlich am jeweils pro „case“ erforderlichen „break“. Hätte man das Verhalten dahingehend definiert, daß das nächste case - Schlüsselwort die switch- Anweisung beendet und ein Schlüsselwort definiert, das explizit den nächsten case-Block ausführen läßt, wäre switch wirklich eleganter, da dieser Fall wesentlich seltener vorkommt.

        Bringt nur leider jetzt nichts mehr, sich dazu Gedanken zu machen.

        Stur lächeln und winken, Männer!
        Kai

        --
        It all began when I went on a tour, hoping to find some furniture
         Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
        SelfHTML-Forum-Stylesheet
        1. Hallo,

          Ja, „switch“ ist IMO irgendwie kömplett dämlich definiert. Dies liegt hauptsächlich am jeweils pro „case“ erforderlichen „break“.

          nein, es ist ja gerade nicht erforderlich. Für viele Fälle ja, weil man nur exakt einen Block pro Bedingung bzw. pro Fall ausführen möchte. Aber gerade gestaffelte Anweisungen lassen sich mit einer switch-Struktur sehr schön realisieren - etwa wenn Fall A bedeutet, das U(), V() und W() ausgeführt werden sollen, im Fall B nur noch V() und W(), und im Fall C nur noch W().

          Zugegeben, das ist nicht der übliche Fall (und hier trifft er definitiv nicht zu), aber ich habe solche Konstruktionen schon mehr als einmal genutzt.

          Hätte man das Verhalten dahingehend definiert, daß das nächste case - Schlüsselwort die switch- Anweisung beendet und ein Schlüsselwort definiert, das explizit den nächsten case-Block ausführen läßt, wäre switch wirklich eleganter, da dieser Fall wesentlich seltener vorkommt.

          Das ist auch wieder wahr ...

          Ich nutze aber switch dennoch lieber als eine Kette von gleichartigen if-Statements, weil es die zugrundeliegende Denkweise besser abbildet - meist habe ich *einen* Ausdruck, und möchte auf mehrere Werte dieses Ausdrucks reagieren. Da finde ich es blöd, einen Teil des Ausdrucks immer wieder notieren zu müssen.

          Ciao,
           Martin

          --
          Die letzten Worte des Systemadministrators:
          Nur gut, dass ich ein intaktes Backup habe.
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. [latex]Mae  govannen![/latex]

            Ja, „switch“ ist IMO irgendwie kömplett dämlich definiert. Dies liegt hauptsächlich am jeweils pro „case“ erforderlichen „break“.

            nein, es ist ja gerade nicht erforderlich. Für viele Fälle ja, weil man nur exakt einen Block pro Bedingung bzw. pro Fall ausführen möchte.

            Und genau das entspricht der if .. elseif .. elseif .. else - Struktur, von der hierzuthread die Rede war. hier wäre jeweils ein break erforderlich. somit ist switch hier eher unelegant (zu schreiben)

            Aber gerade gestaffelte Anweisungen lassen sich mit einer switch-Struktur sehr schön realisieren - etwa wenn Fall A bedeutet, das U(), V() und W() ausgeführt werden sollen, im Fall B nur noch V() und W(), und im Fall C nur noch W().
            Zugegeben, das ist nicht der übliche Fall (und hier trifft er definitiv nicht zu), aber ich habe solche Konstruktionen schon mehr als einmal genutzt.

            Natürlich. Das ist einer der Sonderfälle, bei dem switch seine ganze Stärke ausspielen kann, aber eben nicht der Normalfall. Dieser ist entweder - oder  - oder und da müssen eben leider diese dämlichen breaks mit rein. Ich hätte es wesentlich intuitiver empfunden, wenn

            switch ($i) {  
                case 0:  
                    U();  
                case 1:  
                    V();  
                case 2:  
                    W();  
            }
            

            sich wie if .. elseif .. elseif ... verhalten würde.

            Deinen Sonderfall würde man dann beispielsweise per

            switch ($i) {  
                case 0:  
                    U();  
                    nextcase;  
                case 1:  
                    V();  
                    nextcase;  
                case 2:  
                    W();  
            }
            

            abbilden können. In _diesem_ Fall hat man dann natürlich das Mehr an Schreibarbeit, welches man momentan bei entweder-oder-switch
             hat

            Ich nutze aber switch dennoch lieber als eine Kette von gleichartigen if-Statements, weil es die zugrundeliegende Denkweise besser abbildet - meist habe ich *einen* Ausdruck, und möchte auf mehrere Werte dieses Ausdrucks reagieren. Da finde ich es blöd, einen Teil des Ausdrucks immer wieder notieren zu müssen.

            Es kommt darauf an. switch ist irgendwie in jeder Form schlecht zu schreiben, entweder man nutzt die Notation wie oben, dann hat man hinter der letzten Anweisung eine Einrückungsänderung von zwei Einheiten, wodurch die schließende Klammer ziemlich alleine steht (was durch Verwendung der alternativen Syntax etwas besser wird) oder man zieht die case-Blöcke auf die gleiche Ebene wie switch selbst, das ist allerdings nicht mehr so übersichtlich. Insofern entscheide ich über die Verwendung von switch gegenüber if ... elseif meist Stubbe.

            Stur lächeln und winken, Männer!
            Kai

            --
            It all began when I went on a tour, hoping to find some furniture
             Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
            SelfHTML-Forum-Stylesheet
            1. مرحبا

              Dieser ist entweder - oder  - oder und da müssen eben leider diese dämlichen breaks mit rein.

              Geht doch auch ohne.

              function switchcontent ($key)  
              {  
                  switch ($key) {  
                    case 1:  
                        return printf('Key: %s', $key);  
                    case 2:  
                        return printf('Key: %s', $key);  
                    case 3:  
                        return printf('Key: %s', $key);  
                  }  
              }  
                
              switchcontent (isset($_GET['var']) ? $_GET['var'] : 1 );
              

              Ich arbeite gerne mit Switch, wenn es sich gerade anbietet, selbst mit den Breaks. Im Fall des OP fänd ich einen switch-Block garnicht mal so verkehrt.

              mfg

              1. مرحبا

                Geht doch auch ohne.

                und Anonym geht's auch ;)

                $switch = function ($key) {  
                    switch ($key) {  
                      case 1:  
                          return printf('Key: %s', $key);  
                      case 2:  
                          return printf('Key: %s', $key);  
                      case 3:  
                          return printf('Key: %s', $key);  
                    }  
                };  
                  
                #  
                $switch(isset($_GET['var']) ? $_GET['var'] : 1 );
                

                mfg

                1. مرحبا

                  Geht doch auch ohne.

                  und Anonym geht's auch ;)

                  Das kann man sich auch Online ansehen: http://codepad.viper-7.com/kekl92 (Ausgabe)

                  mfg

              2. Moin!

                Dieser ist entweder - oder  - oder und da müssen eben leider diese dämlichen breaks mit rein.

                Geht doch auch ohne.

                function switchcontent ($key)

                {
                    switch ($key) {
                      case 1:
                          return printf('Key: %s', $key);
                      case 2:
                          return printf('Key: %s', $key);
                      case 3:
                          return printf('Key: %s', $key);
                    }
                }

                switchcontent (isset($_GET['var']) ? $_GET['var'] : 1 );

                
                >   
                >   
                >   
                > Ich arbeite gerne mit Switch, wenn es sich gerade anbietet, selbst mit den Breaks. Im Fall des OP fänd ich einen switch-Block garnicht mal so verkehrt.  
                  
                Switch-Statements sollte man bestmöglich vermeiden, denn switch hat diverse Probleme - weniger technischer Natur, sondern vielmehr im Hinblick auf Fehleranfälligkeit und Code-Klarheit.  
                  
                1\. Die einfachen Switch-Anwendungen, so wie beispielsweise auch deine, kann man viel besser mit einer Lookup-Tabelle lösen. Die Lookup-Tabelle ist darüber hinaus auch einfacher nach extern zu bewegen und dort pflegbar, da sie effektiv nur ein Array ist, welches sowohl statisch im Code stehen kann, als auch in Extra-Dateien oder Datenbanken.  
                  
                2\. Switch-Code erhöht massiv die Komplexität des Codes. Pro case-Eintrag steigt z.B. die zyklomatische Komplexität um 1 - und schon bei Werten ab 10 wird angeraten, diese Komplexität zu verringern, ab 20 ist die Komplexität eigentlich unbeherrschbar geworden - man kann also in einer Funktion maximal 10 case-Abschnitte haben, und selbst dann sind ansonsten keinerlei weitere Verzweigungen erlaubt, um die Komplexität im erwünschten Rahmen zu halten. Komplexe Funktionen sind fehleranfällig!  
                  
                3\. Code-Klarheit: Bei switch kann man die Break-Anweisungen weglassen, damit die Programmausführung im nächsten Case weitergeht. Normal ist aber, dass das Break überall steht. Was ist jetzt, wenn das Break fehlt? Ist das absichtlich weggelassen worden, oder sollte man es hinzufügen? Vor allem: Was ist, wenn manche anderen Case-Statements das break ebenfalls manchmal haben, manchmal nicht? Man muss dann den Code untersuchen und verstehen, man kann nicht die Dauer-Regel anwenden, dass das Break immer dazugehört.  
                  
                4\. Wer es auf die Spitze treiben will, der schiebt die Bedingungsauswertung ins case hinein:  
                ~~~php
                switch(true) {  
                	case $x >= 4 || $ < 0:  
                		echo $x;  
                		break;  
                	case ($y > 0 && $x < 100) || $y < 0:  
                		echo $y;  
                		break;  
                	default:  
                		echo '0';  
                }  
                
                

                Damit ist dann garantiert Ende der Verständlichkeit. Wenn dann noch ein Break fehlt...

                Aber selbstverständlich ist Jedermann frei in der Entscheidung, mit welchen Programmierkonstrukten er sich das Leben schwer machen will... :)

                - Sven Rautenberg

                1. Hi,

                  1. Wer es auf die Spitze treiben will, der schiebt die Bedingungsauswertung ins case hinein:

                  switch(true) {

                  case $x >= 4 || $ < 0:
                  echo $x;
                  break;
                  case ($y > 0 && $x < 100) || $y < 0:
                  echo $y;
                  break;
                  default:
                  echo '0';
                  }

                    
                  Auch ich musste an das [true-case-Paradigma](http://thedailywtf.com/Comments/A_Truly_Selective_Case.aspx) denken :)  
                    
                  Bis die Tage,  
                  Matti
                  
                  -- 
                  [Webapplikationen in C++ entwickeln](http://tntnet.org/)
                  
                2. مرحبا

                  Switch-Statements sollte man bestmöglich vermeiden, denn switch hat diverse Probleme - weniger technischer Natur, sondern vielmehr im Hinblick auf Fehleranfälligkeit und Code-Klarheit.

                  Wenn man so überschaubare bedingungen hat, wie in diesem Thread?

                  1. Die einfachen Switch-Anwendungen, so wie beispielsweise auch deine, kann man viel besser mit einer Lookup-Tabelle lösen.

                  Poste doch mal ein Bsp..

                  1. Switch-Code erhöht massiv die Komplexität des Codes. Pro case-Eintrag steigt z.B. die zyklomatische Komplexität um 1 - und schon bei Werten ab 10 wird angeraten, diese Komplexität zu verringern, ab 20 ist die Komplexität eigentlich unbeherrschbar geworden

                  Ich verwende Switch bis max. 10 bedingungen, und auch nicht in jedem fall. Nur wenn es mir Sinnvoll erscheint.
                  https://forum.selfhtml.org/?t=210836&m=1438156
                  Hier wird lediglich eine Variable in den bedingungen geändert, ich würde das mit der Anonymen Funktion lösen.

                  1. Code-Klarheit: Bei switch kann man die Break-Anweisungen weglassen, damit die Programmausführung im nächsten Case weitergeht. Normal ist aber, dass das Break überall steht. Was ist jetzt, wenn das Break fehlt?

                  Dann ist wohl ein return im Spiel ;)

                  Was ist, wenn manche anderen Case-Statements das break ebenfalls manchmal haben, manchmal nicht?

                  Dann wäre wohl das Script defekt.

                  Aber selbstverständlich ist Jedermann frei in der Entscheidung, mit welchen Programmierkonstrukten er sich das Leben schwer machen will... :)

                  Eben, jeder hat sein eigenes Kreuz zu tragen ;)

                  mfg

          2. Om nah hoo pez nyeetz, Der Martin!

            In vielen Programmiersprachen kann switch nur auf diskrete (als Gegenteil zu kontinuierlich) Werte prüfen. Damit ist in einigen Fällen die Verwendung von if-else-Konstruktionen vorprogrammiert (Pleonasmus!), da etwa

            switch (foo)
              case <1:
              ...

            nicht funktioniert, obwohl man es gern anwenden würde, etwa bei der Ermittlung von Noten aus Prozentzahlen.

            Matthias

            --
            1/z ist kein Blatt Papier.

            1. @@Matthias Apsel:

              nuqneH

              switch (foo)
                case <1:
                ...

              nicht funktioniert

              Aber switch (min(foo, 1)) bzw. switch (max(foo, 1)).

              Qapla'

              --
              Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
      2. Tach!

        Zur Ästhetik des Codes: Anstatt einer langen Folge von if ... elseif ... elseif wäre vermutlich eine switch-Anweisung schlauer.
        Schlauer? Inwiefern? Nichmal groß eleganter, wie ich finde.

        Ich finde es übersichtlicher. switch testet einen Ausdruck auf verschiedene Werte. Man sieht da also gleich, dass dieser eine Ausdruck auf diversen Inhalt geprüft werden soll und nicht verschiedene Bedingungen geprüft werden sollen, die nicht zwangsweise zusammenhängen.

        dedlfix.