Bastian: Mailversand mit Anhang

Hallo zusammen

Ich habe im Netz verschiedene Skripts gefunden, mit denen man E-Mails mit Anhängen per PHP versenden kann. Das klappt bei mir nun fast... :-)

Hier mein Code:

$grenze = "grenzlinie";
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: $absender\n";
$headers .= "Content-Type: multipart/mixed;\n\tboundary=$grenze\n";
$nachricht ="\n--$grenze\n";
$nachricht .="Content-transfer-encoding: 7BIT\r\n";
$nachricht .="Content-type: text/plain\n\n";
$nachricht .= $text;
$nachricht .="\n\n";
$nachricht .="\n--$grenze\n";

$nachricht .="Content-Type: application/msword;\n\tname=" . $datei . "\n";
$nachricht .="Content-Transfer-Encoding: base64\n";
$nachricht .="Content-Disposition: attachment;\n\tfilename=" . $titel . ".doc\n\n";

$zeiger_auf_datei=fopen("$datei","rb");
$inhalt_der_datei=fread($zeiger_auf_datei,filesize("$datei"));
fclose($zeiger_auf_datei);
$inhalt_der_datei=chunk_split(base64_encode($inhalt_der_datei));
$nachricht .= $inhalt_der_datei;
$nachricht .= "\n\n";
$nachricht .= "--$grenze";
mail($email, $betreff, $nachricht, $headers);

Die drei hervorgehobenen Zeilen in der Mitte lösen wohl das Problem aus. $datei ist das relative Verzeichnis der anzuhängenden Worddatei. $titel ist der Titel, den die Datei im Mailclient bekommen soll (ohne Dateiendung).

Die E-Mail wird korrekt gesendet, die angehängte Datei trägt zwar den Titel, aber die Dateiendung .doc ist verschwunden.

Kann mir da jemand helfen?

Merci und Gruss
Bastian

  1. Hallo Bastian,

    $nachricht .="Content-Disposition: attachment;\n\tfilename=" . $titel . ".doc\n\n";

    Die drei hervorgehobenen Zeilen in der Mitte lösen wohl das Problem aus. $datei ist das relative Verzeichnis der anzuhängenden Worddatei. $titel ist der Titel, den die Datei im Mailclient bekommen soll (ohne Dateiendung).

    Die E-Mail wird korrekt gesendet, die angehängte Datei trägt zwar den Titel, aber die Dateiendung .doc ist verschwunden.

    was erwartest du denn? In deinem Fall ist $titel die einzig relevante Information, die du zum Dateinamen überträgst. Und du sagst selbst, $titel enthalte keine Dateiendung. Also?

    Davon abgesehen frage ich mich, warum du deine Variablen oft nochmal in Anführungszeichen setzt, z.B. fopen("$datei","rb") oder filesize("$datei"). Was willst du damit erreichen? Ein kleiner Schritt mehr Arbeit für den Parser? Denn einen nachvollziehbaren Zweck hat das sonst nicht.

    So long,
     Martin

    --
    Okay, Alkohol ist keine Antwort.
    Aber manchmal vergisst man beim Trinken wenigstens die Frage.
    1. hi,

      $nachricht .="Content-Disposition: attachment;\n\tfilename=" . $titel . ".doc\n\n";

      was erwartest du denn? In deinem Fall ist $titel die einzig relevante Information, die du zum Dateinamen überträgst. Und du sagst selbst, $titel enthalte keine Dateiendung. Also?

      Schau dir die von dir zitierte Code-Zeile noch mal an - was hängt er denn da hinter $titel noch an ... Also?

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Obwohl ich pädagogisch geschicktes Nachfragen schätze, nützt es mir wenig, wenn es zu verschleiert daherkommt.

        @Martin:
        Die Anführungszeichen standen so im Skript, welches ich übernommen habe. Dass es unnötig und ineffizient ist, weiss ich auch. Ich werde das Skript entschlacken, sobald es funktioniert.

        @wahsaga:
        An den Titel soll .doc gehängt werden. So wollte ich es eigentlich. Im Mailclient erscheint aber bloss eine Datei mit dem Titel (ohne Endung).

        1. versuch mal $titel . ".doc.doc..usw", wenn er dann .doc anzeigt, liegts am Mailclient..

          1. versuch mal $titel . ".doc.doc..usw", wenn er dann .doc anzeigt, liegts am Mailclient..

            Wie muss ich das verstehen? Die Endung einfach zweimal anhängen?
            Ich teste es mit Apple Mail. Wenn die Endung fehlt, kann das System nicht erkennen, welche Applikation zu öffnen ist.

            Eigenartig ist: Wenn ich statt $titel den Pfad $datei verwende (der .doc beinhaltet), dann funktionierts mit dem Mailclient. Aber eine angehängte Datei mit einem Pfad als Namen ist nicht sehr schön...

            1. Okay, Fehler gefunden!

              Da es sich um einen Dateititel ($titel) mit mehreren Worten handelt, muss er im Content-Disposition in doppelten Anführungszeichen gesetzt werden.

      2. Hallo wahsaga,

        Schau dir die von dir zitierte Code-Zeile noch mal an - was hängt er denn da hinter $titel noch an ... Also?

        also brauche ich vielleicht eine neue Brille?
        Oder noch wahrscheinlicher: Mal wieder mehr als fünf Stunden Schlaf. Das wäre klasse. Am kommenden Wochenende sehe ich eine Chance. Und nächste Woche erst recht: Ich habe Urlaub.  *freu*

        Sorry, Bastian, dann war mein Einwand natürlich völlig daneben. Aber bist du sicher, dass das Attachment *wirklich* ohne Dateiendung ankommt? Ich frage jetzt bewusst so provokativ, weil zwei sehr verbreitete Mailclients (nämlich Outlook und Outlook Express) gern die Endung ausblenden, so wie es auch der Windows-Explorer in der Defaulteinstellung tut. Du bist also sicher, dass du nicht auf diesen gemeinen Trick hereingefallen bist?

        Ciao,
         Martin

        --
        Die Zeit, die man zur Fertigstellung eines Projekts wirklich braucht, ist immer mindestens doppelt so lang wie geplant.
        Wurde dieser Umstand bei der Planung bereits berücksichtigt, gilt das Prinzip der Rekursion.