php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 05-09-2006, 18:19
CoderboyPB
 Newbie
Links : Onlinestatus : CoderboyPB ist offline
Registriert seit: Sep 2006
Ort: Paderborn
Beiträge: 18
CoderboyPB ist zur Zeit noch ein unbeschriebenes Blatt
CoderboyPB eine Nachricht über ICQ schicken
Question Mail-Attachment wird nicht versendet

Hallo Leute,

ich habe eine Fileupload-Funktion geschrieben, die zum Einsatz kommt, wenn User eine Community ein Foto hochladen.
Da die Fotos direkt verfügbar sind (Spielerfotos bei einem Amateurfußballportal), sollen die Admins wenigstens per Mail über neu hochgeladene Fotos informiert werden.

Ich stand nun vor der Wahl, ob ich einen Link auf das neue Foto generiere, oder es als Attachment direkt in der mail anzeigen lasse.

Ich fand die Lösung mit dem Attachment sinnvoller.

Als ich in der Online-Doku der mail()-Funktion bei php.net nicht weiterkam - Mir war lediglich klar, dass das Attachment wohl in den Mailheader gehört, nicht aber, WIE ...

OK, also Gegoogelt und damit dieses Forum gefunden.
Im Trash-Archiv fand ich auch eine Komplett-Lösung von 'Koala', die ich entsprechend meiner Anforderungen, adaptiert habe.

Leider treten hierbei aber Fehler auf:
Die Mail wird zwar ordentlich versendet, aber leider ohne Attachment, statt dessen steht der Mail-Header im Klartext in der Mail.

Hier nun meine PHP-Funktion und anschließend die daraus generierte Mail:

Der Übergabe-Parameter ist der temporäre Dateiname des Uploadformulars:

Wäre wirklich nett, wenn mir jemand da mal weiterhelfen könnte.

PHP-Code:
:
$source $_FILES['foto']['tmp_name'];
@
mail_foto($source); // @ da die Mail versendet wird

Hier nun die Funktion:
PHP-Code:
function mail_foto($file)
{
   
$boundary strtoupper(md5(uniqid(time())));
   
$datei_content chunk_split(base64_encode($file));
    
   
$mail_header .= "\nMIME-Version: 1.0";
   
$mail_header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
   
$mail_header .= "\n\nThis is a multi-part message in MIME format  --  Dies ist eine mehrteilige Nachricht im MIME-Format";
   
   
// Hier faengt der normale Mail-Text an 
   
$mail_header .= "\n--$boundary";
   
$mail_header .= "\nContent-Type: text/plain";
   
$mail_header .= "\nContent-Transfer-Encoding: 8bit";
   
$mail_header .= "\n\n$mail_content";
   
   
// Hier faengt der Datei-Anhang an 
   
$mail_header .= "\n--$boundary";
   
$mail_header .= "\nContent-Type: image/jpeg; name=\"$file\"";
   
   
// Codierung fuer den MIME-Typ des Anhangs 
   
$mail_header .= "\nContent-Transfer-Encoding: base64";
   
$mail_header .= "\nContent-Disposition: attachment; filename=\"$file\"";
   
$mail_header .= "\n\n$datei_content";
   
// Gibt das Ende der eMail aus
   
$mail_header .= "\n--$boundary--";
   
   @
mail("check@mail.de","Check this picture please !","",$mail_header);

Und hier die Mail:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=8B72B7B5636E47E947331346AC56D721

This is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format
--8B72B7B5636E47E947331346AC56D721
Content-Type: text/plain
Content-Transfer-Encoding: 8bit


--8B72B7B5636E47E947331346AC56D721
Content-Type: image/jpeg; name="/home/htdocs/web0/phptmp/phpQjCcm6"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="/home/htdocs/web0/phptmp/phpQjCcm6"

L2hvbWUvaHRkb2NzL3dlYjAvcGhwdG1wL3BocFFqQ2NtNg==


--8B72B7B5636E47E947331346AC56D721--
Mit Zitat antworten
  #2 (permalink)  
Alt 05-09-2006, 18:38
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
L2hvbWUvaHRkb2NzL3dlYjAvcGhwdG1wL3BocFFqQ2NtNg==
Dieser nette String ist das Attachment. Einfach mit base64decode() und mal schauen wie der String dann ausschaut.. Dann solltest du sehen, dass du der Fkt nur den Namen des Bildes übergeben hast und nicht den Inhalt.
PHP-Code:
function mail_foto($file){
    
//so holst du den Inhalt des Files
    
$file readfile($file);
    [...]

Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #3 (permalink)  
Alt 05-09-2006, 19:08
CoderboyPB
 Newbie
Links : Onlinestatus : CoderboyPB ist offline
Registriert seit: Sep 2006
Ort: Paderborn
Beiträge: 18
CoderboyPB ist zur Zeit noch ein unbeschriebenes Blatt
CoderboyPB eine Nachricht über ICQ schicken
Standard

Danke für deine schnelle Antwort.

Bei deiner Lösung bekomme ich das File aber in meine Webseite als Bytecode ausgegeben.

Habe noch mal die Lösung von Koala genauer studiert, und bin auf diese 'Lösung' gekommen:

PHP-Code:
$datei_content fread(fopen($filename,"r"),filesize($filename));
$datei_content chunk_split(base64_encode($datei_content)); 
Das Resultat ist, dass das Foto wohl versendet wird, aber trotzdem nicht als Attachment, sondern wie obensstehend, nur halt um ein vielfaches länger, da jetzt wenigstens schon mal das Foto übertragen wird.

Das ganze sieht jetzt so aus (Habe es verkürzt, geht eigentlich noch weiter ...)

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=0DBC4958D41EA479126AA2C91D7F3D26

This is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format
--0DBC4958D41EA479126AA2C91D7F3D26
Content-Type: text/plain
Content-Transfer-Encoding: 8bit


--0DBC4958D41EA479126AA2C91D7F3D26
Content-Type: image/jpeg; name="/home/htdocs/web0/html/kickerweb/portal/content/vereine/spielerbilder/33.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="/home/htdocs/web0/html/kickerweb/portal/content/vereine/spielerbilder/33.jpg"

/9j/4AAQSkZJRgABAQEARABEAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a

HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy

MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsAOEDASIA

AhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABAUDBgACBwEI/8QASBAAAgEDAwEFBQQHAwsDBQAA

AQIDAAQRBRIhMQYTIkFRFGFxgZEyQlKhBxUjYrHB0TNT4RYXJDRDVHKCkpPwVZTxJmNkc4P/xAAa

AQACAwEBAAAAAAAAAAAAAAADBAECBQAG/8QALREAAgIBBAAGAQMEAwAAAAAAAAECAxEEEiExBRMi

MkFRFBVSYSNxkbEGQlP/2gAMAwEAAhEDEQA/AOOX0YW8YKcgBcfSptQke6ngATiKFIxt9wo5obQn

JhZpBgDx8H41DPaiOVW8PIyV8q2PJFfNROsBFnblCu/J3D58UxtLYYPeyDLED
Mit Zitat antworten
  #4 (permalink)  
Alt 05-09-2006, 19:55
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Works as designed. Der lange String ist die base64encodede Version der Nutzdaten des Bildes. Also musst du diesen String herausschneiden, mittels base64decode wieder zu einem Bild machen und mit den korrekten Headern ausgeben. Dann sollte es funzen

Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #5 (permalink)  
Alt 05-09-2006, 20:39
CoderboyPB
 Newbie
Links : Onlinestatus : CoderboyPB ist offline
Registriert seit: Sep 2006
Ort: Paderborn
Beiträge: 18
CoderboyPB ist zur Zeit noch ein unbeschriebenes Blatt
CoderboyPB eine Nachricht über ICQ schicken
Standard

Danke, Tobi, ich verstehe schon, was du meinst.

Allerdings kenn ich mich damit innerhalb von emails nicht aus.

Könntest du mir bei Gelegenheit diese Codepassage hier mal posten, mit der ich den Mail-Header erweitern muss ?

Das wäre wirklich sehr sehr nett.

Mfg Mirco
Mit Zitat antworten
  #6 (permalink)  
Alt 05-09-2006, 20:46
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Könntest du mir bei Gelegenheit diese Codepassage hier mal posten, mit der ich den Mail-Header erweitern muss ?
Du musst den Mailheader gar nicht erweitern. Zuerst kannst du mittels preg_split() und der Boundary die Email in die Bestandteile aufteilen. Dann suchst du nach den Header Daten des Bildes. Dann musst du den String herausschneiden und mittels base64decode wieder zu einem Bild machen.
Kleiner Nachtrag:
Jede Zeile eines Headers einer Email sollte/muss mittels CRLF abgeschlossen werden, sprich \r\n und nicht \n. Die letzte Headerzeile sollte/muss sogar mit einem doppelten CRLF sprich \r\n\r\n abgeschlossen sein. Das gilt auch für Header der einzelnen Mailbestandteile...
Sonst können Mailclients nix damit anfangen und die meisten werde das Attachment gar nicht sehen.

Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #7 (permalink)  
Alt 05-09-2006, 20:52
Koala
 PHP Junior
Links : Onlinestatus : Koala ist offline
Registriert seit: Jan 2006
Beiträge: 887
Koala ist zur Zeit noch ein unbeschriebenes Blatt
Standard

sach mal....

er will ne mail mit Anhang verschicken und Du rätst ihm die mail
auseinanderzunehmen ????

Erst codiert er den anhang um ihn zu verschicken und dann soll er
ihn wieder decodieren damit er sieht welchen Anhang er verschicken will????

Zeigt denn $mail_header .= "\nContent-Type: text/plain";
überhaupt das Bild in der mail an?

Geändert von Koala (05-09-2006 um 20:55 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 05-09-2006, 20:56
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Auseinandernehmen um zu sehen ob es überhaupt verschickt wird. Wird es auch nur wegen den falschen Headern sieht es kein Client. Die Mailgrösse sollte aber eigentlich bestätigen ob das Bild drann ist oder ned.
Ich habe ihm die Tipp mit den Zeilenenden in der Headern gegeben und grad noch das Auslesen einer Mail mittels php obendraufgelegt. Ok es war nicht unbedingt die Frage

Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #9 (permalink)  
Alt 05-09-2006, 20:58
Koala
 PHP Junior
Links : Onlinestatus : Koala ist offline
Registriert seit: Jan 2006
Beiträge: 887
Koala ist zur Zeit noch ein unbeschriebenes Blatt
Standard

na - die mail wird schon verschickt, das steht ja im Eröffnungsposting.

nur sieht man da eben kein Bild sondern die codierten Daten,
deswegen denk ich daß er vielleicht mit text/html weiterkommt.
Mit Zitat antworten
  #10 (permalink)  
Alt 05-09-2006, 21:10
CoderboyPB
 Newbie
Links : Onlinestatus : CoderboyPB ist offline
Registriert seit: Sep 2006
Ort: Paderborn
Beiträge: 18
CoderboyPB ist zur Zeit noch ein unbeschriebenes Blatt
CoderboyPB eine Nachricht über ICQ schicken
Standard

Auch text/html bringt keine Veränderung. :-(

Bin mir aber zu 100% sicher, dass das Foto verschickt wird, anders kann ich mir das angewachsene Volumen der Mail nicht erklären ...
Mit Zitat antworten
  #11 (permalink)  
Alt 05-09-2006, 21:23
Koala
 PHP Junior
Links : Onlinestatus : Koala ist offline
Registriert seit: Jan 2006
Beiträge: 887
Koala ist zur Zeit noch ein unbeschriebenes Blatt
Standard

mach erst mal das @ weg, damit Du auch ein Ergebnis erhälst.

PHP-Code:
   $mail_header .= "\n--$boundary--";
   
   @
mail("check@mail.de","Check this picture please !","",$mail_header); 
---------

wenn die Sache mit der mail-Funktion nicht geht,
dann nimmst den php-mailer
(ist ne Klasse die Du per include einbindest,
der Aufruf erfolgt (fast) wie bei einer Funktion):

http://phpmailer.sourceforge.net/

PHP-Code:
require("class.phpmailer.php");

$mail = new PHPMailer();

$mail->IsSMTP();                                   // send via SMTP
$mail->Host     "smtp1.site.com;smtp2.site.com"// SMTP servers
$mail->SMTPAuth true;     // turn on SMTP authentication
$mail->Username "jswan";  // SMTP username
$mail->Password "secret"// SMTP password

$mail->From     "from@email.com";
$mail->FromName "Mailer";
$mail->AddAddress("josh@site.com","Josh Adams"); 
$mail->AddAddress("ellen@site.com");               // optional name
$mail->AddReplyTo("info@site.com","Information");

$mail->WordWrap 50;                              // set word wrap
$mail->AddAttachment("/var/tmp/file.tar.gz");      // attachment
$mail->AddAttachment("/tmp/image.jpg""new.jpg"); 
$mail->IsHTML(true);                               // send as HTML

$mail->Subject  =  "Here is the subject";
$mail->Body     =  "This is the <b>HTML body</b>";
$mail->AltBody  =  "This is the text-only body";

if(!
$mail->Send())
{
   echo 
"Message was not sent <p>";
   echo 
"Mailer Error: " $mail->ErrorInfo;
   exit;
}

echo 
"Message has been sent"
Mit Zitat antworten
  #12 (permalink)  
Alt 05-09-2006, 21:35
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@topicstarter
1. Es ist wichtig dass jeder Header mit \r\n abgeschlossen wird.
2. Header von Mailbestandteilen gehören nicht in $mail_header sondern in den content der Mail. Im $mail_header gibst du nur alles das an, was mailweit Gültig ist.
Mach mal für alles was nach $mail_header kommt eine var $content. Dort drauf kommt alles was mit den einzelnen Mailteilen zu tun hat (sprich deren Header) und der gesamte content der Mail (auch die Daten des Attachments)
Ansonsten verwende wie bereits geschrieben eine fertige Klasse.

Gruss

tobi
EDIT:

bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )

Du übergibst gar keinen Inhalt für die Message. In string message gehören auch alle Header der Mailbestandteile rein. In string additional_header nur die Header die die gesamte Mail betreffen

__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

Geändert von jahlives (05-09-2006 um 21:38 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

Formmailer v1.6.1 Bootstrap 4

Formmailer v1.6.1 Bootstrap wurde extra für Bootstrap entwickelt. Mit Bootstrap kann man schnell und einfach kleine oder große Projekte entwickeln, die auf Geräten in allen erdenklichen Formen funktionieren.

18.12.2018 arne-home | Kategorie: PHP/ Formular
HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:29 Uhr.