Antworten auf deine Fragen:
Neues Thema erstellen

Probleme mit EMail Anhängen

MrManko

Nicht mehr ganz neu hier

Hallo,

ich habe ein kleines Problem mit dem Versenden von Anhängen in E-Mail Nachrichten. Mein erstes Problem ist, dass ich mich das erste mal damit beschäftige und dementsprechend noch nicht so viel Ahnung von der Materie habe, das andere Problem ist, dass ich es zwar geschafft habe eine E-Mail mit Anhang zu verschicken, dabei aber sämtlicher Inhalt der Email verloren geht (Es wird also kein Text verschickt)

Hier einmal der Quelltext:

PHP:
require_once 'classes/email.class.php';
    
    $attachment = array();
    $attachment[] = "test.pdf";
    
    $mail = new mail("empfaenger@server.tld", "no-reply@absender.tld", "Ihre Online Rechnung", "Vllt klappt wenigstens das", false, $attachment);
    
    if($mail->send_mail()) {
        echo "Mail ist verschickt";
    } else {
        echo "Mail konnte nicht verschickt werden";
    }
Und hier die dazugehörige Klasse (selbst entwickelt):

PHP:
class mail {
        private $to;
        private $from;
        private $subject;
        private $text;
        private $html = false;
        private $attachments = array();
        private $header;
        private $eol;
        
        public function __construct($to, $from, $subject, $text, $html = false, $attachment = array()) {
            if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
              $this->eol = "\r\n";
            } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
              $this->eol = "\r";
            } else {
              $this->eol = "\n";
            }
            
            $this->to = $to;
            $this->from = $from;
            $this->subject = $subject;
            $this->text = $text;
            
            $this->create_common_headers();
            $this->set_html($html);
            $this->set_attachments($attachment);
            
        }
        
        private function set_html($html) {
            if($html != false) {
                if(is_bool($html)) {
                    $this->add_html();
                } else {
                    die("Parameter muss vom Typ Boolean sein");
                }
            }
        }
            
        private function set_attachments($attachments) {
            if(is_array($attachments)) {
                if(count($attachments) > 0) {
                    $this->attachments = $attachments;
                    $this->add_attachments();
                }
            } else {
                die("Es muss ein Array übergeben werden");
            }
        }
        
        public function send_mail() {
            if(mail($this->to, $this->subject, $this->text, $this->header)) {
                return true;
            } else {
                return false;
            }
            
            /*echo "<pre>";
            echo $this->header;
            echo "</pre>";*/
        }
        
        private function create_common_headers() {
            $this->header .= "From: ".$this->from.$this->eol;
            $this->header .= "Reply-To: ".$this->from.$this->eol;
            $this->header .= "Return-Path: ".$this->from.$this->eol;
            $this->header .= "X-Mailer: PHP v".phpversion().$this->eol;
            
            $this->header .= 'MIME-Version: 1.0'.$this->eol; 
        }
        
        private function add_attachments() {
            foreach($this->attachments as $value) {
                $f_name = $value;
                $handle = fopen($f_name, 'rb');
                $f_contents = fread($handle, filesize($f_name));
                $f_contents = chunk_split(base64_encode($f_contents));
                $f_type = filetype($f_name);
                fclose($handle);
                
                $this->header .= "Content-Type: application/pdf; name=\"".$value."\"".$this->eol;
                $this->header .= "Content-Transfer-Encoding: base64".$this->eol;
                $this->header .= "Content-Disposition: attachment; filename=\"".$value."\"".$this->eol.$this->eol; // !!Hier zweimal EOL !! GAAAANZ WICHTIG !!
                $this->header .= $f_contents.$this->eol.$this->eol;  
            }
        }
        
        private function add_html() {
            $this->header .= "Content-Type: text/html; charset=iso-8859-1".$this->eol;
            $this->header .= "Content-Transfer-Encoding: 8bit".$this->eol;
        }
    }
Wie gesagt, die Email wird gesendet und auch der Anhang kommt korrekt an, nur der Text fehlt, wenn ich den Anhang entferne wird alles korrekt übertragen, auch HTML Mails sind dann kein Problem.

Hoffe einer von euch hat da eine Ahnung, woran das liegen könnte, ist aber auch echt ein Gewusel mit den ganzen Kopfdaten einer Email oO

MfG
MrManko
 

K

kyle66

Guest

AW: Probleme mit EMail Anhängen

Hallo,

falls du Anhänge verssendest, musst du den Text auch in den Header schreiben. Der 3. Parameter der mail-Funktion bleibt als leer ""

Der Code für den Header würde also beispielhaft so lautet
Code:
$trenner = md5(uniqid(time()));
$dateiinhalt = chunk_split(base64_encode($dateiinhalt));

$this->header = "From: ".$this->from.$this->eol;
$this->header .= 'MIME-Version: 1.0'.$this->eol;
$this->header .= "Content-Type: multipart/mixed; boundary=$trenner".$this->eol;
$this->header .= "This is a multi-part message in MIME format".$this->eol;
$this->header .= "--".$trenner.$this->eol;
$this->header .= "Content-Type: text/plain".$this->eol;
$this->header .= "Content-Transfer-Encoding: 8bit".$this->eol;
$this->header .= "Hier jetzt der Text";
$this->header .= "--".$trenner.$this->eol;
$this->header .= "Content-Type: application/pdf; name=".$filename.".pdf".$this->eol;
$this->header .= "Content-Transfer-Encoding: base64".$this->eol;
$this->header .= "Content-Disposition: attachment; filename=".$filename.".pdf".$this->eol;
$this->header .= $dateiinhalt;
unset($dateiinhalt);
$add_header .= $this->eol;;
$add_header .= "--".$trenner."--";
mail($this->to, $this->subject, "", $this->header)

Du musst also als Content-Type der Mail "multipart/mixed" sowie einen Trenner der einzelnen Teile angeben. Und dann zu jedem Part selbst noch den jeweiligen Content-Type


Grüße
kyle
 

MrManko

Nicht mehr ganz neu hier

AW: Probleme mit EMail Anhängen

Okay, werde ich morgen umsetzen und dann hier berichten, obs geklappt hat, gehe aber mal davon aus ;-) :p

Jetzt ist aber für heute erstmal Feierabend ^^

MfG
MrManko
 

MrManko

Nicht mehr ganz neu hier

AW: Probleme mit EMail Anhängen

Mit dem Hinweis von klappt's nun. Hab jetzt die Klasse angepasst und sie versendet nun reine Textmails mit und ohne Anhang und auch HTML Mails mit und ohne Anhang. Und das alles nur durch den Aufruf des Konstruktors ^^

Falls wer interesse an einer sehr sehr sehr einfachen Email Klasse hat, einfach melden :p

MfG
MrManko
 
C

csvip

Guest

AW: Probleme mit EMail Anhängen

Hi MrManko,

ich versuche auch verzweifelt eine Email mit Anhang einzurichten, finde im Internet aber nichts, könntest du mir weiterhelfen?

Danke im Vorraus

CSVIP
 

MrManko

Nicht mehr ganz neu hier

AW: Probleme mit EMail Anhängen

@csvip

Wenn du das ganze mit einer Klasse lösen möchtest, dann stelle ich dir meine gern zur Verfügung, aber ich bin jetzt nicht ein Meister der OOP. Die Klasse funktioniert und ist einfach in der Handhabung, aber ich denke da lässt sich noch einiges machen.

Hier hast du den Quelltext, wenn du Interesse hast:

PHP:
class mail {
    private $to;
    private $from;
    private $subject;
    private $text;
    private $html = false;
    private $attachments = array();
    private $header;
    private $eol;
    private $trenner;
        
    public function __construct($to, $from, $subject, $text, $html = false, $attachment = array()) {
        if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
            $this->eol = "\r\n";
        } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
            $this->eol = "\r";
        } else {
            $this->eol = "\n";
        }
            
        $this->to = $to;
        $this->from = $from;
        $this->subject = $subject;
        $this->text = $text;
        $this->trenner = md5(uniqid(time()));
            
        $this->create_common_headers($attachment);
        $this->set_attachments($attachment);
        $this->set_html($html);
    }
        
    private function set_html($html) {
        if($html != false) {
            if(is_bool($html)) {
                $this->add_text('html');
            } else {
                die("Parameter muss vom Typ Boolean sein");
            }
        } else {
            $this->add_text('plain');
        }
    }
            
    private function set_attachments($attachments) {
        if(is_array($attachments)) {
            if(count($attachments) > 0) {
                $this->attachments = $attachments;
                $this->add_attachments();
            }
        } else {
            die("Es muss ein Array übergeben werden");
        }
    }
        
    public function send_mail() {
        if(count($this->attachments) > 0) {
            if(mail($this->to, $this->subject, '', $this->header)) {
                return true;
            } else {
                return false;
            }
        } else {
            if(mail($this->to, $this->subject, $this->text, $this->header)) {
                return true;
            } else {
                return false;
            }
        }        
    }
        
    private function create_common_headers($attachment) {
        $this->header .= "From: ".$this->from.$this->eol;
        $this->header .= "Reply-To: ".$this->from.$this->eol;
        $this->header .= "Return-Path: ".$this->from.$this->eol;
        $this->header .= "X-Mailer: PHP v".phpversion().$this->eol;
        if(count($attachment) > 0) {    
            $this->header .= 'MIME-Version: 1.0'.$this->eol; 
            $this->header .= 'Content-Type: multipart/mixed; boundary='.$this->trenner.$this->eol;
            $this->header .= 'This is a multipart message in MIME format'.$this->eol;
        }
    }
        
    private function add_attachments() {
        foreach($this->attachments as $value) {
            $f_name = $value;
            $handle = fopen($f_name, 'rb');
            $f_contents = fread($handle, filesize($f_name));
            $f_contents = chunk_split(base64_encode($f_contents));
            $f_type = filetype($f_name);
            fclose($handle);
                
            $this->header .= '--'.$this->trenner.$this->eol;
            $this->header .= "Content-Type: application/pdf; name=\"".$value."\"".$this->eol;
            $this->header .= "Content-Transfer-Encoding: base64".$this->eol;
            $this->header .= "Content-Disposition: attachment; filename=\"".$value."\"".$this->eol.$this->eol; // !!Hier zweimal EOL !! GAAAANZ WICHTIG !!
            $this->header .= $f_contents.$this->eol.$this->eol;  
        }
    }
        
    private function add_text($type) {
        if(count($this->attachments) > 0) {
            $this->header .= '--'.$this->trenner.$this->eol;
        }
        $this->header .= "Content-Type: text/".$type."; charset=iso-8859-1".$this->eol;
        $this->header .= "Content-Transfer-Encoding: 8bit".$this->eol;
        if(count($this->attachments) > 0) {
            $this->header .= $this->text.$this->eol;
        }
    }            
}
Und so wird das ganze dann angewendet:

PHP:
$mail_text = "Dein Text für die E-Mail, HTML ist erlaubt";
$anhaenge = array(); // Anhänge müssen als Array übergeben werden
$anhaenge[0] = "pfad/zu/deiner/datei.endung";
$anhaenge[1] = "pfad/zu/deiner/datei.endung";

$mail = new mail("empfanger@domain.tld", "absender@domain.tld", "Betreff", $mail_text, true, $anhaenge);

// Wenn "true"durch ein "false" ersetzt wird, dann darf kein HTML im Mailtext vorkommen
Ich hoffe ich konnte dir weiterhelfen und wenn Probleme auftreten, dann melde dich einfach bei mir, gerne auch per PN =)
 
C

csvip

Guest

AW: Probleme mit EMail Anhängen

Könntest Du mir den kompletten Code einmal schreiben, kann mit den 2 verschiedenen Dingen, die Du mir hier gepostet hast nichts anfangen.

lg sven
 

MrManko

Nicht mehr ganz neu hier

AW: Probleme mit EMail Anhängen

Eigentlich habe ich dir schon den kompletten Code schon geschrieben, aber ich versuche es nocheinmal und ausführlicher zu erklären:

Die Klasse steckst du am Besten in eine eigene Datei und inkludierst diese in die PHP Datei, von der du deine Mail mit Anhang verschicken möchtest. Dazu erstellst du eine PHP Dateu und überträgst meine gepostete Klasse per Copy & Paste.

Der Teil zum include sieht dann z.B. so aus:

PHP:
<?php
include 'email.class.php';
?>
Danach musst du nur noch den Konstruktor mit deine Daten füttern und danach die E-Mail abschicken und das wars auch schon. Das ganze könnte dann so aussehen:

PHP:
<?php
include 'email.class.php';

$mail_text = "Dein Text für die E-Mail, HTML ist erlaubt";
$anhaenge = array(); // Anhänge müssen als Array übergeben werden
$anhaenge[0] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
$anhaenge[1] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird

$mail = new mail("empfanger@domain.tld", "absender@domain.tld", "Betreff", $mail_text, true, $anhaenge);
?>
Zur Erklärung des Konstruktors hier eine kleine Doku:

Code:
void __construct(string $empfaenger, string $absender, string $betreff, string $mail_text, bool $html, array $anhaenge)
Um jetzt die E-Mail abzuschicken benutzt du die send_mail() Methode der Klasse, welche einen Wert des Typen boolean zurückgibt, mit dem du in einer einfache If-Else Konstruktion prüfen kannst, ob deine E-Mail überhaupt versendet wurde:

PHP:
<?php
include 'email.class.php';

$mail_text = "Dein Text für die E-Mail, HTML ist erlaubt";
$anhaenge = array(); // Anhänge müssen als Array übergeben werden
$anhaenge[0] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
$anhaenge[1] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird

$mail = new mail("empfanger@domain.tld", "absender@domain.tld", "Betreff", $mail_text, true, $anhaenge);

if($mail->send_mail()) {
    echo "E-Mail wurde erfolgreich verschickt";
} else {
    echo "E-Mail konnt nicht verschickt werden";
}
?>
Eigentlich ist die Benutzung der Klasse ganz einfach, das einzige wo du halt drauf achten musst, ist, wenn du HTML in deinem Mailtext benutzt, dass der Schalter für HTML im Konstruktor auch auf true steht und das Anhänge immer als Array übergeben werden, selbst wenn du nur eine Datei anhängst.

Und da du fleißig meinen Text gelesen hast, habe ich dir auch noch ein funktionierendes Beispiel hochgeladen, welches du downloaden und benutzen kannst ^^ Du musst nur noch deine Daten korrekt eintragen und schon kannst du deine elektronische Post via PHP quer um den Globus jagen.



Edit: In der jetzigen Form eignet sich das Skript nur bedingt für einen Newsletter, also ich würde dir davon abraten, da die mail() funktion genutzt wird. Es ist zwar möglich, durch eine Schleife mehrere Empfänger zu bedienen, aber wie gesagt, es ist noch nicht dafür ausgelegt.
 
Zuletzt bearbeitet:
C

csvip

Guest

AW: Probleme mit EMail Anhängen

Hi, danke für Deine Antwort, habe das problemlos aufem Server geladen und jetzt verstehe ich nur eine sache nicht

PHP:
$anhaenge[0] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
$anhaenge[1] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird

welche datei.endung muss da rein? Ein Ordner ein Bild?
Jede Datei die mir geshcickt wird heißt anders, was soll da rein?

LG Sven
 

MrManko

Nicht mehr ganz neu hier

AW: Probleme mit EMail Anhängen

Wenn du das Skript mal angesehn hast, welches ich hochgeladen hatte, dann steht da halt der Anhang drin. Bei mir stand da ja
PHP:
$anhang = "test.pdf"

Diese test.pdf wird dann als Anhang an die E-Mail geklatscht. Diese test.pdf liegt im selben verzeichniss, wie das mail skript. Das musst du jetzt nur noch deinen Vorstellungen anpassen.
Weiß nicht, wie ich das besser erklären soll oO
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.619
Beiträge
1.538.363
Mitglieder
67.540
Neuestes Mitglied
Alex Weidner
Oben