Mail-Attachment wird nicht versendet

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

  • 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--

  • #2
    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

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

    Kommentar


    • #3
      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

      Kommentar


      • #4
        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

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

        Kommentar


        • #5
          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

          Kommentar


          • #6
            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

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

            Kommentar


            • #7
              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?
              Zuletzt geändert von Koala; 05.09.2006, 19:55.

              Kommentar


              • #8
                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

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

                Kommentar


                • #9
                  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.

                  Kommentar


                  • #10
                    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 ...

                    Kommentar


                    • #11
                      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"

                      Kommentar


                      • #12
                        @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

                        Zuletzt geändert von jahlives; 05.09.2006, 20:38.
                        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

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

                        Kommentar

                        Lädt...
                        X