php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.05.2005, 18:30  
Gast
 
Beiträge: n/a
Standard Attachment aus E-Mail korrekt wiedergeben

Hallo

wir haben es endlich geschafft die E-Mails mit Attachment zu empfangen und alles auf einer Seite anzuzeigen. Bis auf die Attachments, die in einem Array gespeichert sind.

Das Array heisst $attachment und mit $attachment[0]["filename"] holen wir den Dateinamen des ersten Attachments raus. Mit $attachment[0]["filedata"] holen wir die eigentliche Datei des Attachments, also das Attachment selbst. Und das ist ein wirrer Code, sieht etwa so aus:

§%&%@@@@FFASD§r54!"§"$ bla blubb ....

bestimmt binär oder base64 kram. Okay, das lässt sich mit base64_decode() ja hübsch umrechnen. Die Frage ist jetzt, wie man diese Datei möglichst easy als JPG-Bild ausspucken kann.

Eine Idee:

- ein extra php skript das nichts anderes ausspuckt als

PHP-Code:
<?php
header
("Content-Type: image/jpeg");

echo 
$attachment[0]["filedata"];
?>
tja, und in diesem Skript muss irgendwo oben nochmal das Attachment aus der entsprechenden Mail gefischt werden. Das ganze wird mit einem img src=attachment.php?mail_uid=34r524rtegsetd oder so eingebunden.

Hoffe bis hierhin sind die Ansätze prinzipiell korrekt.

Und dann die Frage was ist mit Attachments, die keine Bilder sind? z.B. ein PDF File? am Filename erkennt man ja den Typ. Soweit, so gut.

Postet einfach mal alles was euch dazu einfällt und uns weiterbringt. Wäre ja nen Witz das nicht gebacken zu kriegen
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.05.2005, 19:28  
Erfahrener Benutzer
 
Registriert seit: 19.06.2004
Beiträge: 665
konsti
Standard

also wie gesagt, wenn das base64 ist erst base64_decode() und dann in eine (temporäre) datei speichern, und diese dann mittels <img .../> einbinden

wenn du ein pdf oder so hast, auch in eine datei speichern und dann entweder mittels <embed ...> einbinden oder einfach verlinken
__________________
http://www.silvercoding.de
------------
ElePHPant Edit
konsti ist offline  
Alt 06.05.2005, 20:12  
Gast
 
Beiträge: n/a
Standard

äh... ja... aber wieso soll man die denn erst als temporäre datei abspeichern? Wenn man mit PHP eine Grafik erstellt, z.b. einen Chart für Statistiken, dann wird ja auch keine temporäre Datei irgendwo abgelegt. Man erzeugt die Datei einfach in einem rutsch und im img src tag wird die php eingebunden, die den richtigen header ausspuckt und dann die bild-daten.

müsste doch mit nem pdf genauso gehen oder nicht? (natürlich nicht im img src tag)
 
Alt 06.05.2005, 21:30  
Gast
 
Beiträge: n/a
Standard

NewBert und ich sind am selben Problem dran. Prinzipiell will er aber (soweit ich das verstanden habe) die Attachments quasi in roher Form in der Datenbank speichern und diese dann mittels separatem script (attachment.php) "on the fly" anzeigen oder erstellen lassen. Ich möchte die Anhänge gleich direkt beim Auslesen aus der Mail auf der Platte abspeichern, und danach den Pfad zum File mit dem email zusammen in der DB speichern.
Ist aber wohl ein und dasselbe Problem, nämlich aus diesem Furz-Code %&%@@@@FFASD§r54!"§"$ bla blubb .... das File wiederherzustellen.

Deine Idee Bert, dem Browser den header zu übergeben und das "rohe" bild einfach mit echo auszuspucken hat auf die Schnelle so nicht funktioniert. Der Browser antwortete mit "Grafik kann nicht angezeigt werden, weil sie Fehler enthält".


EDIT: so jetzt hat's geklapt. Musste es ja noch mit base64_decode() decodieren.

PHP-Code:
<?php
header
("Content-Type: image/jpeg");
echo 
base64_decode($attachment[0]['filedata']);
?>
Jetzt sollte ich doch im Prinzip den Inhalt decodiert in ein file mit der Endung JPG speichern können und das Teil dann normal per URL aufrufen? Grad' mal probieren

Jep, ohne Probleme:

PHP-Code:
<?php
$pic 
base64_decode($attachment[0]['filedata']);
    
    
    
$filename 'test.jpg';
    
$handle fopen($filename"w+");
    
fwrite($handle$pic);
    
fclose($handle);
?>
 
Alt 06.05.2005, 21:55  
Gast
 
Beiträge: n/a
Standard

Nachdem wir den Anhang (also den namen vom Anhang) ausm Mail gezogen haben können wir folgendes durchlaufen lassen:

PHP-Code:
<?php
$file_type_list
"gif,txt,jpg,jpeg,doc,zip,rar,bmp,JPG"//usw. Liste von erlaubten Dateiendungen
//Dateiendung aus Dateiname extrahieren
$type substr(strrchr($attachment[0]['filename'], '.'), 1);     
//Prüfen ob Dateiendung in der Typenliste vorhanden ist
$match strpos ("$file_type_list"$type); 
if (
$match === false) { 
    
//Dateiendung nicht erlaubt. Evtl reply-mail an Sender, dass dieser Dateityp nicht akzeptiert wird
}
else {
       
//erlaubt, decoden und in DB werfen, oder decoden und in File speichern
}
?>
Ich kenn' mich da mit dem Dateiaufbau aber zu wenig aus, was ist base64 codierung denn genau?! Und kann ich jeden Dateitypen einfach mit base64_decode decoden?! Das wär ja voll easy, dann wäre das "GROSSE PROBLEM" ja schon gelöst NewBert
Ich probier's mal eben aus.
 
Alt 06.05.2005, 22:27  
Gast
 
Beiträge: n/a
Standard

hey, echt geile Arbeit dsxs. congrats!

hab noch nen kleinen Bug entdeckt bei:

PHP-Code:
<?php
$type 
substr(strrchr($attachment[0]['filename'], '.'), 1);  
?>
strchr liefert den Reststring nach dem ersten vorkommen des Zeichens, in diesem Fall also der Punkt. Was, wenn die Datei so heisst? bilder.super.genial.jpg.zip?

Punkte sind ja auch erlaubt im Dateinamen. Man müsste da von hinten dran gehen, also das letzte Element nach einem Punkt heran ziehen. Spontan fällt mir was ein:

mal ein Versuch on the fly:

PHP-Code:
<?php

 
if ( eregi(".jpg$",  $dateiname) ||
      
eregi(".jpeg$"$dateiname) ||
      
eregi(".png$",  $dateiname) ||
      
eregi(".gif$" $dateiname)) {

  
move_uploaded_file (...); //oder so ähnlich. halt was machen.

 
}
?>
man beachte diese geilen dollarzeichen, die sagen dem php der soll die Dateinamen von hinten angucken. Macht ja auch sinn
 
Alt 06.05.2005, 22:35  
Gast
 
Beiträge: n/a
Standard

mit regexp geht das noch ein bisschen eleganter aber hab gerade kopfschmerzen. höre zu laut musik.

ja wegen diesen Attachments überlege ich aber noch ob es wirklich sinnvoll ist die in der DB abzuladen. Glaub das ist ne Performance-Bremse kann mich aber auch irren ??? robo was sagst du dazu (ich weis, das du das liest )

wogegen es dumm wäre sie als file abzulegen, zumindest in meinem fall. könnte dann ja jeder x-beliebige runter laden wenn man da nicht wieder was mit geschütztem ordner und einem skript das die files ausspuckt hätte. Stelle mir das so vor:

Attachments in einen Ordner namens "anlagen" und dann dem Ordner die Leserechte entziehen so das von aussen niemand die Dateien im Browser aufrufen kann. Dann mit einem Skript bei Anforderung prüfen, ob der user das Recht hat die entsprechende Datei zu öffnen, und dann die Datei über das script includen und den korrekten Header ausgeben (z.b. "image / jpeg" oder "application / octet-stream"). Halt je nach dem was das für ne Datei ist. Und da PHP ja Zugriff auf den Ordner hat, kommt über dieses Skript nur der an die Datei, der auch darf.´

Hoffe das das so funktioniert. Müsste ja dann in der DB irgendwie vermerken welche Dateien vorhanden sind, wem sie gehören (user-id), vielleicht noch wie gross sie sind, und dann der Datei den gleichen namen geben, wie die id des Datensatzes in der DB. Fertig ist der Schmarrn. (oder???)

wär ja echt viel zu geil
 
Alt 06.05.2005, 23:07  
Gast
 
Beiträge: n/a
Standard

Thx für den Bugfix Bert. An files mit sadf.asdf.xxx hab' ich echt nicht gedacht.
Schickst du mir bitte deine regex wenn dus für dich gecodet hast? Ich kann mit regulären Ausdrücken genausogut umgehen wie ne tibetianische Alpengeiss mit blauen Haaren Bergsteigen kann.

Was die verschiedenen Dateien anbelangt so ist das echt kein Problem, kann man alle (ausser txt zb) mit base64_decode() dekodieren. XLS, DOC, EXE, ZIP, RAR, PDF... klappt alles.

Hier der Code mit dem ich getestet habe:
$nb_attachs = count($attachment);

PHP-Code:
<?php
    
if ($nb_attachs 0) {
        
// es wurden attachments gefunden
        
$a 0;
        while (
$a <= $nb_attachs-1) {
            
//attachments durchgehen, decodieren und abspeichern
            //$type = substr(strrchr($attachment[$a]['filename'], '.'), 1);
            
$filename $attachment[$a]['filename'];
            
$handle fopen("att/".$filename"w+");
            
$input base64_decode($attachment[$a]['filedata']);
            
fwrite($handle$input);
            
fclose($handle);
            
$a++;
        }
?>
Ich ändere das jetzt noch so um, dass pro mail mit attachment ein seperater ordner erstellt wird, wo die Files eins nachm andern reingestellt werden. Zusammen mit allen Infos zur Mail speichere ich diesen Ordnernamen dann in der DB ab.

Natürlich muss der Ordner wo alle Attachments Ordner drin sind mit htaccess geschützt werden. Aber warum willst du's so kompliziert machen Bert? Ich werd das so handlen dass ich im script, wo die Mails aufgelistet, gelesen, beantwortet etc werden den Ordnernamen aus der DB raushole, alle dateien die dort drin sind in ein array knall und dann einfach das durchgehe. So erhalte ich den dateinamen, kann die Grösse ermitteln, und nen Link anbringen, der mich direkt zum geschützten Verzeichnis führt: http://user:razz:ass@host.com/attach...dner/file.asdf

Für mich eindeutig die einfachere Lösung als den ganzen Mist in der DB zu versorgen, dann jedesmal neu zu decodieren.
 
Alt 06.05.2005, 23:09  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

also nur mal eben überflogen und robo gelesen :P

also meine meinung:

-> dateien haben nix in der datenbank zu tun
-> die gehören alle in ein verzeichnis mit nem kryptischen namen, ohne endung nachdem sie base64_encoded sind sind sie btw ca 30 % kleiner. den kryptischen namen kannst du leicht z.b. mittels md5('alterdateiname'.time()); erstellen.
-> der name wird in der db gespeichert zusammen mit der user-id und dem originalnamen und dem "echten" contenttype, den du mit mime_content_type() feststellen kannst.
-> der ordner bekommt ne htaccess mit "DENY FROM ALL" -> keiner kann übers web drauf zugreifen. die dateien nur den nötigsten chmod
-> dann schreibst du dir ein script, was die dateien nur weitergibt wenn die ID des eingeloggten users mit der ID dessen übereinstimmt der in der Datenbank dazu stimmt. dem script übergibst du keinen dateinamen, sondern immer nur fein die ID speichern
-> die datei kann ja vieleicht zusammen mit dem script noch unterscheiden
-> bilder (jpg, png, gif) werden angezeigt und andere bilder werden mittels dem header application octet-stream zum download angeboten

:P :P

mfg
robo47
robo47 ist offline  
Alt 06.05.2005, 23:49  
Gast
 
Beiträge: n/a
Standard

danke robo, mir ist gerade eine metalldampflampe aufgegangen

mit .htaccess kenn ich mich noch nicht so aus, aber denke diesen letzten fetzen kriege ich auch noch in den griff.

ach ja zu deiner Frage wegen base64, dsxs:

Die Dateien lagen ursprünglich mal im Binärcode, also zur Basis 2 vor. Die Mailprogramme bzw. Bodys sind aber nicht 8-bit-sicher, weshalb die Datei auf die basis 64 hochgerechnet / kodiert wird. Theoretisch könntest du das im Kopf machen oder mit Block und Bleistift

Zahlensysteme die mir gerade einfallen:

binär (basis 2)
hexal (basis 6)
oktal (basis
dezimal (basis 10 -> unser lieblingszahlensystem)
hexadezimal (basis 16)

nur mal als Beispiel und wirklich ohne Taschenrechner oder konverter

du hast einen 8bit binärcode, sagen wir mal der sieht so aus:

00101001

und du willst jetzt wissen was das im dezimalsystem für ne zahl wäre, um dann aus der ASCII Tabelle z.b. das entsprechende Zeichen dafür raus zu fischen, oder so ähnlich. let's go:

es ist ein Stellenwertsystem, das bedeutet, das die Position an der die Zahl zu finden ist, ausschlaggebend ist. Man fängt von rechts nach links an, also so < rum. Die letzte Zahl hat eben den kleinsten Wert, nä

es ist also ein Stellenwertsystem zur Basis 2, das wir auf die Basis 10 umrechnen wollen:


1 x 2^0 = 1
0 x 2^1 = 0
0 x 2^2 = 0
1 x 2^3 = 8
0 x 2^4 = 0
1 x 2^5 = 32
0 x 2^6 = 0
0 x 2^7 = 0

1 + 8 + 32 = 41

 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
dateien aus verzeichnis einzeln als mail attachment versenden mathes PHP Tipps 2008 5 17.07.2008 19:45
Unterschied zwischen mail() und popen(/usr/sbin/sendmail)... DonTermi PHP Tipps 2007 8 27.03.2007 13:25
Funktion Mail() verwenden bendigo PHP Tipps 2006 2 05.05.2006 11:44
mail attachment abspeichern PHP Tipps 2006 4 17.03.2006 15:08
mail() und boundary Problem Gef PHP Tipps 2006 4 02.03.2006 00:47
PHP sendet korrekt, aber bei falschem Empf. kommt NIX retour PHP Tipps 2006 10 15.02.2006 22:44
Mail mit mail() kommt nicht an center PHP Tipps 2005-2 5 18.08.2005 13:02
Mail adresse überprüfen? PHP Tipps 2005-2 6 16.06.2005 11:53
Mit der PHP mail() Funktion eine HTMl mail verschicken? PHP Tipps 2005 6 09.05.2005 07:13
php mail() header &amp;amp;amp;amp;amp;amp; Spam Problem PHP-Fortgeschrittene 4 04.05.2005 12:31
[Erledigt] Error Mail() function PHP Tipps 2005 3 14.04.2005 03:32
pear mime mail >> attachment funktioniert nicht PHP Tipps 2005 4 28.01.2005 16:23
Mail versenden - Fehler 553 Anuschka PHP Tipps 2004-2 7 13.12.2004 19:54
mehrere Atachement mit HTML Mime mail class??? 18inch PHP Tipps 2004-2 1 28.11.2004 23:58
mail() - mail header PHP-Fortgeschrittene 2 28.09.2004 15:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
image-jpeg-attachment öffnen, http://www.php.de/php-tipps-2005/22547-attachment-aus-e-mail-korrekt-wiedergeben.html, image-x-png-attachment wie öffnen, application-octet-stream-attachment, image-jpeg-attachment, image-jpg-attachment öffnen, was heißt attachment, application-octet-stream-attachment öffnen, image-jpg-attachment, image-x-png-attachment, image-x-png-attachment öffnen, was heisst attachment, application octet stream attachment, zend mail attachment bild, was bedeutet attachment, attachment jpg öffnen, wie erkennt man ein attachment, attachment datei, php mail anhang kommt kryptisch, attachment datei öffnen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:18 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.