Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Mails und MySQL

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Mails und MySQL

    Ich sitz grad an nem Webmail und lasse mir von verschiedenen Pop-Konten Emails auslesen und in ner Datenbank speichern. Soweit so gut...
    Wie kann ich die Emails wieder auslesen, sodaß bei Plain-Nachrichten die Formatierung beibehalten wird. Momentan laufen die Mails in ein Blob-Feld, ist das Falsch? Kann es sein, daß ich die Mails irgendwie kodieren muß, damit ich sie richtig formatiert zurückbekomme?

    Dasselbe Problem hab ich nicht nur mit dem Mailbody, sondern auch mit Anhängen.
    Hab ich irgeneinen größeren Fehler gemacht?
    Code:
    function pop($UserID, $popserver, $username, $password, $host_webmail, $user_webmail, $pwd_webmail, $database_webmail) {
    
    	$Server = "{".$popserver."/pop3:110}" ;
    	$mbox = imap_open($Server, $username, $password);
    	if ($mbox) {
    		echo("Sie sind mit dem Postfach verbunden!
    
    
    
    "); 
    	} else { die(imap_last_error()); }
    	
    	for ($i = 1; $i <= imap_num_msg($mbox); $i++) {
    	
    		$header = imap_header($mbox, $i);
    		$Structure = imap_fetchstructure($mbox, $i);
    		/* ?><PRE><? print_r($header) ?></PRE><? */
    		/* ?><PRE><? print_r($Structure) ?></PRE><? */
    		
    		$SenderInfo = imap_fetchbody($mbox, $i, 0);
    		
    		$answered = $header->Answered;
    		$ccaddress = $header->ccaddress;
    		$ccMailbox = "";
    		$ccHost = "";
    		for ($j = 0; $j < count($header->cc); $j++) {
    			$ccMailbox .= $header->cc[$j]->mailbox.";";
    		 	$ccHost  .= $header->cc[$j]->host.";";
    		}
    		$ccMailbox = substr($ccMailbox, 0, strlen($ccMailbox)-1);
    		$ccHost = substr($ccHost, 0, strlen($ccHost)-1);
    		
    		
    		$bccaddress = $header->bccaddress;
    		$bccMailbox = "";
    		$bccHost = "";
    		for ($j = 0; $j < count($header->cc); $j++) {
    			$bccMailbox .= $header->bcc[$j]->mailbox.";";
    		 	$bccHost  .= $header->bcc[$j]->host.";";
    		}
    		$bccMailbox = substr($bccMailbox, 0, strlen($bccMailbox)-1);
    		$bccHost = substr($bccHost, 0, strlen($bccHost)-1);
    		
    		
    		/* print_r ($ccMailbox); */
    		$date =  $header->Date;
    		$fromaddress = $header->fromaddress;
    		$fromPersonal ="";
    		$fromHost = "";
    		$fromMailbox ="";
    		for ($j = 0; $j < count($header->from); $j++) {
    			$fromPersonal .= $header->from[$j]->personal.";";
    			$fromMailbox .= $header->from[$j]->mailbox.";";
    		 	$fromHost  .= $header->from[$j]->host.";";
    		}
    		/* print_r($fromPersonal); */
     		$fromPersonal = substr($fromPersonal, 0, strlen($fromPersonal)-1);
    		$fromMailbox = substr($fromMailbox, 0, strlen($fromMailbox)-1);
    		$fromHost = substr($fromHost, 0, strlen($fromHost)-1);
    		
    		
    		$MailDate = $header->MailDate;
    		$message_id = $header->message_id;
    		$Msgno = $header->Msgno;
    		$recent = $header->Recent;
    		$replytoaddress = $header->reply_toaddress;
    		
    		
    		$replytoPersonal ="";
    		$replytoMailbox ="";
    		$replytoHost ="";
    		
    		for ($j = 0; $j < count($header->reply_to); $j++) {
    			$replytoMailbox .= $header->reply_to[$j]->personal.";";
    			$replytoPersonal .= $header->reply_to[$j]->mailbox.";";
    		 	$replytoHost  .= $header->reply_to[$j]->host.";";
    		}
    		$replytoMailbox = substr($replytoMailbox, 0, strlen($replytoMailbox)-1);
    		$replytoPersonal = substr($replytoPersonal, 0, strlen($replytoPersonal)-1);
    		$replytoHost = substr($replytoHost, 0, strlen($replytoHost)-1);
    		
    		$senderaddress = $header->senderaddress;
    		$senderMailbox ="";
    		$senderPersonal ="";
    		$senderHost ="";
    		
    		for ($j = 0; $j < count($header->sender); $j++) {
    			$senderMailbox .= $header->sender[$j]->mailbox.";";
    			$senderPersonal .= $header->sender[$j]->personal.";";
    		 	$senderHost  .= $header->sender[$j]->host.";";
    		}
    		$senderMailbox = substr($senderMailbox, 0, strlen($senderMailbox)-1);
    		//$senderPersonal = substr($senderPersonal, 0, strlen($senderPersonal)-1);
    		$senderHost = substr($senderHost, 0, strlen($senderHost)-1);
    		
    		
    		$Size = $header->Size;
    		$subject = $header->Subject;
    		$toaddress = $header->toaddress;
    		
    		$toaddress = $header->senderaddress;
    		$toMailbox ="";
    		
    		$toHost ="";
    		
    		for ($j = 0; $j < count($header->to); $j++) {
    			$toMailbox .= $header->to[$j]->mailbox.";";
    			$toHost  .= $header->to[$j]->host.";";
    		}
    		$toMailbox = substr($toMailbox, 0, strlen($toMailbox)-1);
    		$toHost = substr($toHost, 0, strlen($toHost)-1);
    		
           	$udate = $header->udate;
    		$unseen = $header->Unseen;
    		$Flagged = $header->Flagged;
    		$Deleted = $header->Deleted;
    		$Draft = $header->Draft;
    		
    		
    				
    		$body = ( imap_body ($mbox, $i));
    
    		$body = ereg_replace("'","\'",$body);
    		$body = ereg_replace('"',"\"",$body);
    		
    		$subject = ereg_replace("'","\'",$subject);
    		$subject = ereg_replace('"',"\"",$subject);
    		
    		$SenderInfo = ereg_replace("'","\'",$SenderInfo);
    		$SenderInfo = ereg_replace('"',"\"",$SenderInfo);
    		
    		
    		
    		$Werte = "answered".chr(2).$answered.chr(2)."ccaddress".chr(2).$ccaddress.chr(2)."ccMailbox".chr(2).$ccMailbox.chr(2)."ccHost".chr(2).$ccHost.chr(2)."date".chr(2).$date.chr(2)."fromaddress".chr(2).$fromaddress.chr(2)."fromPersonal".chr(2).$fromPersonal.chr(2)."fromMailbox".chr(2).$fromMailbox.chr(2)."fromHost".chr(2).$fromHost.chr(2)."MailDate".chr(2).$MailDate.chr(2)."message_id".chr(2).$message_id.chr(2)."Msgno".chr(2).$Msgno.chr(2)."recent".chr(2).$recent.chr(2)."replytoaddress".chr(2).$replytoaddress.chr(2)."replytoPersonal".chr(2).$replytoPersonal.chr(2)."replytoMailbox".chr(2).$replytoMailbox.chr(2)."replytoHost".chr(2).$replytoHost.chr(2)."senderaddress".chr(2).$senderaddress.chr(2)."senderMailbox".chr(2).$senderMailbox.chr(2)."senderPersonal".chr(2).$senderPersonal.chr(2)."senderHost".chr(2).$senderHost.chr(2)."Size".chr(2).$Size.chr(2)."subject".chr(2).$subject.chr(2)."toaddress".chr(2).$toaddress.chr(2)."toMailbox".chr(2).$toMailbox.chr(2)."toHost".chr(2).$toHost.chr(2)."udate".chr(2).$udate.chr(2)."unseen".chr(2).$unseen.chr(2)."Flagged".chr(2).$Flagged.chr(2)."Deleted".chr(2).$Deleted.chr(2)."Draft".chr(2).$Draft.chr(2)."body".chr(2).$body.chr(2)."UserNr".chr(2).$UserID.chr(2)."SenderInfo".chr(2).$SenderInfo.chr(2)."bccaddress".chr(2).$bccaddress.chr(2)."bccMailbox".chr(2).$bccMailbox.chr(2)."bccHost".chr(2).$bccHost;
    
    
    		
    	$pruefUID = selectString($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Mail", "message_id", "message_id", $message_id);
    	if ($pruefUID != $message_id) {
    		SectionEintrag($mbox, $i, $Structure, $message_id, $host_webmail, $user_webmail, $pwd_webmail, $database_webmail);
    		insertString ($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Mail", $Werte);
    	}
    		
    		
    	}
    imap_close($mbox);
    }
    
    function SectionEintrag($mbox, $Msgno, $Structure, $message_id, $host_webmail, $user_webmail, $pwd_webmail, $database_webmail) {
    	if (! $Structure->parts) {
    		$type = $Structure->type;
    		$subtype = $Structure->subtype;
    		$encoding = $Structure->encoding;
    		$bytes = $Structure->bytes;
    		$attribute = $Structure->parameters[0]->attribute;
    		$value = $Structure->parameters[0]->value;
    		$disposition = $Structure->disposition;
    		$section = imap_fetchbody($mbox, $Msgno, 1);
    			
    		$section = ereg_replace("'","\'",$section);
    		$section = ereg_replace('"',"\"",$section);
    		$Werte = "type".chr(2).$type.chr(2)."subtype".chr(2).$subtype.chr(2)."encoding".chr(2).$encoding.chr(2)."bytes".chr(2).$bytes.chr(2)."attribute".chr(2).$attribute.chr(2)."value".chr(2).$value.chr(2)."disposition".chr(2).$disposition.chr(2)."Section".chr(2).$section.chr(2)."message_id".chr(2).$message_id.chr(2)."SectionID".chr(2)."1";
    	
    		insertString($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Sections", $Werte);
    		
    		
    	} else {
    		for ($zz = 0; $zz < (count($Structure->parts)); $zz++) { 
    			$type = $Structure->parts[$zz]->type;
    			$subtype = $Structure->parts[$zz]->subtype;
    			$encoding = $Structure->parts[$zz]->encoding;
    			$bytes = $Structure->parts[$zz]->bytes;
    			$attribute = $Structure->parts[$zz]->parameters[0]->attribute;
    			$value = $Structure->parts[$zz]->parameters[0]->value;
    			$disposition = $Structure->parts[$zz]->disposition;
    	
    	
    			?><PRE><? print_r($Structure) ?></PRE><? 
    			$section = imap_fetchbody($mbox, $Msgno, $zz+1);
    			/* print($section);
    			echo("<hr>"); */
    			$section = ereg_replace("'","\'",$section);
    			$section = ereg_replace('"',"\"",$section);
    			
    			
    			
    			
    			$Werte = "type".chr(2).$type.chr(2)."subtype".chr(2).$subtype.chr(2)."encoding".chr(2).$encoding.chr(2)."bytes".chr(2).$bytes.chr(2)."attribute".chr(2).$attribute.chr(2)."value".chr(2).$value.chr(2)."disposition".chr(2).$disposition.chr(2)."Section".chr(2).$section.chr(2)."message_id".chr(2).$message_id.chr(2)."SectionID".chr(2).$zz;
    	
    			insertString($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Sections", $Werte);
    		}
    	}
    }

  • #2
    Moin

    MEDIUMTEXT müsste eigentlich für eine kodierte Mail ausreichen, aber das ist Geschmacksache. Der Trick ist, wie du richtig erkannt hast, die Daten in die Datenbank zu schreiben und unverändert wieder zu lesen. Das funktioniert meistens schon mit:

    Code:
    $data = base64_encode($data);
    ... Schreibroutine in die DB
    und beim Lesen

    Code:
    $data = base64_decode($data_aus_mysql);
    // Ausgabe als HTML
    print htmlentities($data);
    Damit lassen sich teilweise ganze PHP-Strukturen unverändert in die Datenbank abspeichern und wieder rekonstruieren. Beispiel:

    Code:
    $arr = array (
        'subject' => 'Hello Bill!',
        'to' => 'bill@msn.com',
        'from' => 'marketing@msn.com',
        'body' => 'Blah blah blah.\nIf compiles, it sells, Bill!\n\n'
        );
    $data = base64_encode(serialize($data));
    // Schreibroutine in die DB
    (...)
    
    // ...und später das Wiedereinlesen von $arr 
    $data = mysql_fetch...usw.
    $arr = unserialize(base64_decode($data));
    // Gucken was drin steht:
    print_r($arr);

    Hast du in deinem PHP auch noch die ZipLib eincompiliert (was eigentlich schon seit einigen Versionen standard ist), solltest du vor dem MIME-kodieren mit base64_encode größere Datenvariablen mit gzcompress() packen, da a) base64_encode() ca. 30% mehr Datenplatz braucht als die ursprüngliche zu kodierende Datenmenge und b) bei HTML-Anwendungen deine übertragene Datenmenge zwischen Webserver und Datenbankserver deutlich reduziert wird.

    Dann sieht das Packen unter Umständen so aus:

    Code:
    $data = base64_encode(gzcompress(serialize($data)));
    Das Wiedereinlesen kannst du dir womöglich schon ausdenken

    Grüsse

    Lev

    Kommentar


    • #3
      Fettes Merci!
      Das ist bislang die einzige Antwort, die Sinn macht und mir weiter hilft!

      Kommentar

      Lädt...
      X