Hans: Anhang wird nicht mit verschickt

Hallo,

mit diesem Code versuche ich, eine mail mit Anhang zu verschicken.
die Mail kommt auch an, der Anhang leider nicht (es kommt auch nirgendwo eine Fehlermeldung).

$Dateiname = "test.htm";
 $DateinameMail = "test.htm";

$Header = "From: Tester test@test.de";

$Trenner = md5(uniqid(time()));
 $Header .= "\n";
 $Header .= "MIME-Version: 1.0";
 $Header .= "\n";
 $Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
 $Header .= "\n\n";
 $Header .= "This is a multi-part message in MIME format";
 $Header .= "\n";
 $Header .= "--$Trenner";
 $Header .= "\n";
 $Header .= "Content-Type: text/html";
 $Header .= "\n";
 $Header .= "Content-Transfer-Encoding: 8bit";
 $Header .= "\n\n";
 $Header .= $mailtext;
 $Header .= "\n";
 $Header .= "--$Trenner";
 $Header .= "\n";
 $Header .= "Content-Type: text/html; name=$DateinameMail";
 $Header .= "\n";
 $Header .= "Content-Transfer-Encoding: base64";
 $Header .= "\n";
 $Header .= "Content-Disposition: attachment; filename=$DateinameMail";
 $Header .= "\n\n";
 $Dateiinhalt .= fread(fopen($Dateiname, "r"), filesize($Dateiname));
 //$Header .= chunk_split(base64_encode($Dateiinhalt));
 $Header .= "\n";
 $Header .= "--$Trenner--";

if(mail($Empfaenger, $Betreff, "", $Header))
{
print 'Die Mail wurde erfolgreich verschickt!';
}

Weiß jemand Rat?
Ich denke mal es liegt irgendiwe an transfer-enconding...

Danke!

  1. Hello,

    $Header .= "Content-Disposition: attachment; filename=$DateinameMail";
     $Header .= "\n\n";
     $Dateiinhalt .= fread(fopen($Dateiname, "r"), filesize($Dateiname));
     //$Header .= chunk_split(base64_encode($Dateiinhalt));
     $Header .= "\n";
     $Header .= "--$Trenner--";

    Wieso hast Du den chunked Dateiinhalt denn auskommentiert im Header?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo,

      weil es IMHO bei  8bit Kodierung nicht nötig ist, es funktioniert aber uach nicht, wenn ich den Kommentar entferne.

      Mfg Hans

      PS: Bin auch aus dem Harz (Clausthal)

      1. Hello,

        weil es IMHO bei  8bit Kodierung nicht nötig ist, es funktioniert aber uach nicht, wenn ich den Kommentar entferne.

        Was ist nicht nötig? Das Attachement auch mitzuschicken?
        Aber Du musst andere Paramter für Chunk_Split() verwenden --> (..,76,"\n");

        PS: Bin auch aus dem Harz (Clausthal)

        Und was treibst Du da so?

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. booah,

          wer sagts denn, ES GEHT!

          Danke!

          Ich bin Schüler (Robert Koch Schule)

          Mfg Hans

    2. Hello,

      Hello,

      $Header .= "Content-Disposition: attachment; filename=$DateinameMail";
       $Header .= "\n\n";
       $Dateiinhalt .= fread(fopen($Dateiname, "r"), filesize($Dateiname));
       //$Header .= chunk_split(base64_encode($Dateiinhalt));
       $Header .= "\n";
       $Header .= "--$Trenner--";

      Wieso hast Du den chunked Dateiinhalt denn auskommentiert im Header?

      Was ich vergaß eben: Chunk_split() hat falsche Defaults für die Aufteilung eines base64-attachements. Da musst Du (76,"\n") benutzen, sonst klappt es nicht.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hallo,

        wie dann bitte?

        Was ich vergaß eben: Chunk_split() hat falsche Defaults für die Aufteilung eines base64-attachements. Da musst Du (76,"\n") benutzen, sonst klappt es nicht.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        Ich wohne übrigens in CL-Z

        1. Hello,

          wie dann bitte?

          Na, mit den anderen Parametern:

          $Header .= chunk_split(base64_encode($Dateiinhalt),76,"\n");

          Was ich vergaß eben: Chunk_split() hat falsche Defaults für die Aufteilung eines base64-attachements. Da musst Du (76,"\n") benutzen, sonst klappt es nicht.

          siehe http://de2.php.net/manual/de/function.chunk-split.php

          Bei base64-Beeichen ist nur "\n" erlaubt, nicht "\r\n"

          Steht auch irgendwo in RFC 1872 o.ä.

          Ich wohne übrigens in CL-Z

          Ja, aber was treibst Du da so? Bist Du Webseiten-Eersteller oder Bäcker oder Lehrer...?

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Was ich vergaß eben: Chunk_split() hat falsche Defaults für die Aufteilung eines base64-attachements. Da musst Du (76,"\n") benutzen, sonst klappt es nicht.

            siehe http://de2.php.net/manual/de/function.chunk-split.php

            Bei base64-Beeichen ist nur "\n" erlaubt, nicht "\r\n"

            Steht auch irgendwo in RFC 1872 o.ä.

            Nein, base64 ist in RFC 2045, Abschnitt 6.8, definiert und da steht nirgends etwas davon, dass \r\n nicht erlaubt sei. Lediglich folgendes:

            "The encoded output stream must be represented in lines of no more
               than 76 characters each. All line breaks [..] must be ignored by
               decoding software."

            76 Zeichen verwendet chunk_split() bereits standardmäßig, über das exakte Zeilenendeformat kein Wort (oder habe ich was übersehen?). Wenn es also wirklich daran liegen sollte, ist da irgendwas am Server kaputt, anders ist das nicht zu erklären.

            Gruß,
              soenk.e

            1. Hello,

              Bei base64-Beeichen ist nur "\n" erlaubt, nicht "\r\n"

              Steht auch irgendwo in RFC 1872 o.ä.

              Nein, base64 ist in RFC 2045, Abschnitt 6.8, definiert und da steht nirgends etwas davon, dass \r\n nicht erlaubt sei. Lediglich folgendes:

              Das haben wir hier, als ich es damals herausgefunden hatte, aber irgendwo implizit in einer RFC gefunden. Es sit bestimmt noch was darüber im Archiv.

              "The encoded output stream must be represented in lines of no more
                 than 76 characters each. All line breaks [..] must be ignored by
                 decoding software."

              Ja, das stimmt. Genau diese Diskussion hatten wir schon einmal und dann kam irgend jemand mit der Fundstelle, dass bei base64-Blöcken nur "\n" erlaubt ist, sonst werden die nicht wieder richtig dekodiert.

              http://selfhtml.bitworks.de/mime_mail.php.txt

              Das eine "light"-Version meines Mailers, der auch automatisch Bilder ersezt etc...
              Die funktioniert. Ich wollte nur die Sache mit den \r\n im Header nochmal reparieren und die wirre Attach-Array-Geschichte nochmal etwas aufräumen. Man lernt ja dazu ... *g*

              Die Funktion funktioniert aber so. (*uff* was ist das für ein Satz?)

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
  2. mit diesem Code versuche ich, eine mail mit Anhang zu verschicken.
    die Mail kommt auch an, der Anhang leider nicht (es kommt auch nirgendwo eine Fehlermeldung).

    $Trenner = md5(uniqid(time()));

    Nur nebenbei: Das ist reichlich sinnlos. uniqid() erzeugt, wie Du ja sicher in der Anleitung gelesen hast, eine Kennung basierend auf der aktuellen Zeit. Klatscht man die aktuelle Zeit nochmals davor, wird die Kennung nur länger, aber die Eindeutigkeit nicht besser (erst recht nicht, wenn zwei zeitmäßig synchron laufende Rechner involviert sind, Stichwort UTC / NTP).

    Der erste Parameter für uniqid() ist eher für etwas Systemidentifizierendes gedacht, zum Beispiel die IP-Adresse. Du kannst auch rand() bzw. mt_rand() benutzen, um die Kennung durch eine Zufallszahl zu ergänzen.
    Ob das alles in diesem Fall überhaupt nötig ist, lasse ich mal dahingestellt.

    $Header .= "\n";

    Und nur der Korrektheit halber: Die Syntax für Kopfzeilen lautet

    field =  field-name ":" [ field-body ] CRLF

    Also \r\n und nicht \n am Ende. Siehe RFC 822, Abschnitt 3.2.

    $Header .= "MIME-Version: 1.0";
    $Header .= "\n";
    $Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
    $Header .= "\n\n";

    Mit \n\n (bzw. eigentlich \r\n\r\n, s.o.) leitest Du den Körper der Mail ein. Sowas hat eigentlich in $Header nichts zu suchen.

    $Header .= $mailtext;

    Und weiter: Was macht der Text in $Header?

    $Dateiinhalt .= fread(fopen($Dateiname, "r"), filesize($Dateiname));
    //$Header .= chunk_split(base64_encode($Dateiinhalt));

    Wenn man die Zeile auskommentiert, in der die Datei in die Mail kopiert wird, ist es kein Wunder, dass die Datei nicht ankommt.

    if(mail($Empfaenger, $Betreff, "", $Header))

    Du verschiffst die komplette Mail über die Kopfzeilen. Das mag funktionieren, aber es wäre schöner, wenn Du den Inhalt als dritten Parameter und _nur_ die Kopfzeilen als vierten übergibst. Die Kopfzeilen sind dabei nur die drei bis zum ersten \r\n\r\n (wie oben kommentiert).

    Gruß,
      soenk.e

    1. Hallo,

      ich habe den Kommentar jetzt entfernt, das Resultat ist dasselbe.
      Ic denke, es hängt mit

      $Header .= chunk_split(base64_encode($Dateiinhalt));

      bzw.

      $Header .= "Content-Transfer-Encoding: base64";

      zusammen. Das RFC-Schema änder ich sobald, der Anhang mit verschickt wird.

      Danke,
      Hans

      1. ich habe den Kommentar jetzt entfernt, das Resultat ist dasselbe.

        Wie kommt die Mail denn an, ist das MIME-Gerüst da, nur der Dateiinhalt fehlt, ist die Mail abgeschnitten, wurde sie in eine einfache Textmail konvertiert? Was steht im Kopf? Bitte mal eine komplette, empfangene Mail posten.

        Gruß,
          soenk.e

        1. Hallo,

          also hier die Mail:

          .
          .
          .

          To: mailadresse (kein Bock auf spam)
          Subject: Meine erste Mail mit Anhang
          From: Mein Name meine@mailadresse.de
          MIME-Version: 1.0
          Content-Type: multipart/mixed; boundary=c7c64070764ae9a1587f79cf548c7c59
          X-Scanned-By: MIMEDefang 2.38
          Sender: www@server1.xenet.de

          Emailtext, der angegeben wurde

          Also kompleet, nur dass der Anhang fehlt...

          1. danke,

            es geht schon...

            1. danke,

              es geht schon...

              Woran lag's?

              Gruß,
                soenk.e

              1. Hallo,

                Toms Tip mit den Parametern hat mir geholfen, allerdings wird der Anhang mit

                Content-Disposition: attachment; filename=test.htm überschrieben.

                wieso denn das?

                danke...

                1. Hello,

                  Toms Tip mit den Parametern hat mir geholfen, allerdings wird der Anhang mit

                  Content-Disposition: attachment; filename=test.htm überschrieben.

                  wieso denn das?

                  Wie meist Du das jetz mit dem "überschrieben"?
                  Was wird überschrieben? Wer überschreibt das?

                  Schick mir doch mal so eine mail auf meinen Account tom@bitworks.de

                  Harzliche Grüße aus http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
                  1. hallo,

                    eben passiert...

                    1. (Die Datei wird jeztz mit  ... Bestaetigung.htm überschrieben)

                      1. (Die Datei wird jeztz mit  ... Bestaetigung.htm überschrieben)

                        Falls Ihr da zu einem Ergebnis kommt: Täte mich interessieren.

                        Gruß,
                          soenk.e

                        PS: Die Mail, die Du hier vorgelegt hast, ist nicht komplett. Da fehlen sämtliche MIME-Angaben im Körper sowie bestimmt eine ganze Reihe im Kopf (insbesondere die Received-Zeilen).

                        1. Hallo,

                          sind die restlichen Zeilen nicht jetzt unwichtig? Nur der Inhalt des Anhangs ist nicht einwandfrei, hat das eventuell mit fread (Binärdaten) zu tun?

                          1. Hello,

                            sind die restlichen Zeilen nicht jetzt unwichtig? Nur der Inhalt des Anhangs ist nicht einwandfrei, hat das eventuell mit fread (Binärdaten) zu tun?

                            Wenn man sooo einen Sche..-Fehler sucht, sind alle Zeilen wichtig:

                            Das kommt da an und dann kommt der Mailserver durcheinander.

                            --61f5d304cd53f6c4bf77335dbd08e04d
                            Content-Type: text/html; name=Bestaetigung.htm

                            Content-Disposition: attachment; filename=Bestaetigung.htm

                            --61f5d304cd53f6c4bf77335dbd08e04d--

                            Zwischen Content-Type und Content-Disposition darf keine Leerzeile stehen und außerdem fehlt das Content-Tranfer-Encoding:

                            Schau Dir mal an was http://selfhtml.bitworks.de/mime_mail.php.txt macht. Das funktioniert so. Muss nur nochmals dran gefeilt werden
                            1. im Header sind "\r\n" statt "\n" vorgeschrieben und die etwas wirre Array-Geschichte mit dem Attach-Array würde ich heute auch anders machen, es also nicht vorher invertieren

                            Harzliche Grüße aus http://www.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            1. Das kommt da an und dann kommt der Mailserver durcheinander.

                              --61f5d304cd53f6c4bf77335dbd08e04d
                              Content-Type: text/html; name=Bestaetigung.htm

                              Content-Disposition: attachment; filename=Bestaetigung.htm

                              Zwischen Content-Type und Content-Disposition darf keine Leerzeile stehen und außerdem fehlt das Content-Tranfer-Encoding:

                              Um mal die Ehre der Mailserver zu retten: Hier verschluckt sich nicht die Mailserversoftware selbst (die interessiert es nicht, was in der Mail steht), sondern diese hier: "X-Scanned-By: MIMEDefang 2.38".

                              Gruß,
                                soenk.e

                            2. Hallo,

                              da bin ich wieder..

                              danke erstmal, aber das  content-transfer-encoding hatte ich auskommentiert. Mache ich den Kommentar weg, wird der Anhang wieder nicht mitversendet.
                              Das Leerzeilenentfernen war ebenfalls erfolglos, aber ich gucke mir mal die Klasse an...

                              Mfg Hans

              2. Hello,

                danke,

                es geht schon...

                Woran lag's?

                am chunk_split() des base64-Bereiches möchte ich wetten. Hab eich auch mal drei Tage gesucht, das zu finden. Damit kann man den SMTP-Server zum Absturz bringen. Warum weiß ich aber leider nicht.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
  3. Hallo!

    mit diesem Code versuche ich, eine mail mit Anhang zu verschicken.
    die Mail kommt auch an, der Anhang leider nicht (es kommt auch nirgendwo eine Fehlermeldung).

    Ich verstehe nicht wieso alle Welt ständig das Rad neu erfinden will ;-)

    Wenn ich einen Anhang verschicken will, verwende ich schlicht und einfach PEAR::Mail_Mime, das funktioniert dann z.B. so:

    <?php
    include('Mail.php');
    include('Mail/mime.php');

    $text = 'Text version of email';
    $file = $_SERVER['DOCUMENT_ROOT'].'/test.txt';
    $crlf = "\n";
    $hdrs = array(
                  'From'    => 'absender@example.com',
                  'Subject' => 'Test-Message mit Anhang'
                  );

    $mime = new Mail_mime($crlf);

    $mime->setTXTBody($text);
    $mime->addAttachment($file, 'text/plain');

    $body = $mime->get();
    $hdrs = $mime->headers($hdrs);

    $mail =& Mail::factory('mail');
    $mail->send('empfaenger@example.com', $hdrs, $body);
    ?>

    Siehe http://pear.php.net/manual/en/package.mail.mail-mime.php
    Instalation: http://pear.php.net/manual/en/installation.php

    Grüße
    Andreas

    --
    SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
    1. Hallo Andreas

      Wenn ich einen Anhang verschicken will, verwende ich schlicht und einfach PEAR::Mail_Mime

      kann man damit auch mehrere Dateianhänge verschicken?

      1. Hi!

        Wenn ich einen Anhang verschicken will, verwende ich schlicht und einfach PEAR::Mail_Mime

        kann man damit auch mehrere Dateianhänge verschicken?

        Ich habs noch nicht probiert, aber ich denke schon.

        $mime->setTXTBody() vs. $mime->addAttachment()

        lässt mich das zumindest vermuten.

        Grüße
        Andreas

        --
        SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
    2. Ich verstehe nicht wieso alle Welt ständig das Rad neu erfinden will ;-)

      Instalation: http://pear.php.net/manual/en/installation.php

      Bis man das durchgelesen, verstanden und ausgeführt hat, ist das Rad dreimal neu gebaut und man hat sogar noch was dazugelernt ;)

      Gruß,
        soenk.e

      1. Hi!

        Instalation: http://pear.php.net/manual/en/installation.php

        Bis man das durchgelesen, verstanden und ausgeführt hat, ist das Rad dreimal neu gebaut und man hat sogar noch was dazugelernt ;)

        Ja, aber das macht man nur einmal, danach gibts Räder vom Fließband ;-)

        Wenn man selber Zugriff auf die Shell hat, dann reicht ja schon ein

        pear install Mail_Mime

        und sonst muss man im Fall von Shared Hosting den Provider bitten, oder selbst Hand anlegen: http://pear.php.net/manual/de/installation.shared.php#installation.shared.ftp

        Also halb so wild ;-)

        Grüße
        Andreas

        --
        SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
  4. Hallo,

    Ich benutze jetzt doch lieber die Klasse, danke für jegliche Hilfe!

    MfG Hans