Anzeige

Probleme mit EMail Anhängen

Probleme mit EMail Anhängen | PSD-Tutorials.de

Erstellt von MrManko, 01.08.2011.

  1. MrManko

    MrManko Nicht mehr ganz neu hier

    Dabei seit:
    28.03.2007
    Beiträge:
    187
    Geschlecht:
    männlich
    Ort:
    Far Far Away
    Software:
    Windows 8.1, Visual Studio 2012, Notepad++
    Probleme mit EMail Anhängen
    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:
    1.  
    2. require_once 'classes/email.class.php';
    3.    
    4.     $attachment = array();
    5.     $attachment[] = "test.pdf";
    6.    
    7.     $mail = new mail("empfaenger@server.tld", "no-reply@absender.tld", "Ihre Online Rechnung", "Vllt klappt wenigstens das", false, $attachment);
    8.    
    9.     if($mail->send_mail()) {
    10.         echo "Mail ist verschickt";
    11.     } else {
    12.         echo "Mail konnte nicht verschickt werden";
    13.     }
    14.  
    Und hier die dazugehörige Klasse (selbst entwickelt):

    PHP:
    1.  
    2. class mail {
    3.         private $to;
    4.         private $from;
    5.         private $subject;
    6.         private $text;
    7.         private $html = false;
    8.         private $attachments = array();
    9.         private $header;
    10.         private $eol;
    11.        
    12.         public function __construct($to, $from, $subject, $text, $html = false, $attachment = array()) {
    13.             if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
    14.               $this->eol = "\r\n";
    15.             } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
    16.               $this->eol = "\r";
    17.             } else {
    18.               $this->eol = "\n";
    19.             }
    20.            
    21.             $this->to = $to;
    22.             $this->from = $from;
    23.             $this->subject = $subject;
    24.             $this->text = $text;
    25.            
    26.             $this->create_common_headers();
    27.             $this->set_html($html);
    28.             $this->set_attachments($attachment);
    29.            
    30.         }
    31.        
    32.         private function set_html($html) {
    33.             if($html != false) {
    34.                 if(is_bool($html)) {
    35.                     $this->add_html();
    36.                 } else {
    37.                     die("Parameter muss vom Typ Boolean sein");
    38.                 }
    39.             }
    40.         }
    41.            
    42.         private function set_attachments($attachments) {
    43.             if(is_array($attachments)) {
    44.                 if(count($attachments) > 0) {
    45.                     $this->attachments = $attachments;
    46.                     $this->add_attachments();
    47.                 }
    48.             } else {
    49.                 die("Es muss ein Array übergeben werden");
    50.             }
    51.         }
    52.        
    53.         public function send_mail() {
    54.             if(mail($this->to, $this->subject, $this->text, $this->header)) {
    55.                 return true;
    56.             } else {
    57.                 return false;
    58.             }
    59.            
    60.             /*echo "<pre>";
    61.             echo $this->header;
    62.             echo "</pre>";*/
    63.         }
    64.        
    65.         private function create_common_headers() {
    66.             $this->header .= "From: ".$this->from.$this->eol;
    67.             $this->header .= "Reply-To: ".$this->from.$this->eol;
    68.             $this->header .= "Return-Path: ".$this->from.$this->eol;
    69.             $this->header .= "X-Mailer: PHP v".phpversion().$this->eol;
    70.            
    71.             $this->header .= 'MIME-Version: 1.0'.$this->eol;
    72.         }
    73.        
    74.         private function add_attachments() {
    75.             foreach($this->attachments as $value) {
    76.                 $f_name = $value;
    77.                 $handle = fopen($f_name, 'rb');
    78.                 $f_contents = fread($handle, filesize($f_name));
    79.                 $f_contents = chunk_split(base64_encode($f_contents));
    80.                 $f_type = filetype($f_name);
    81.                 fclose($handle);
    82.                
    83.                 $this->header .= "Content-Type: application/pdf; name=\"".$value."\"".$this->eol;
    84.                 $this->header .= "Content-Transfer-Encoding: base64".$this->eol;
    85.                 $this->header .= "Content-Disposition: attachment; filename=\"".$value."\"".$this->eol.$this->eol; // !!Hier zweimal EOL !! GAAAANZ WICHTIG !!
    86.                 $this->header .= $f_contents.$this->eol.$this->eol;  
    87.             }
    88.         }
    89.        
    90.         private function add_html() {
    91.             $this->header .= "Content-Type: text/html; charset=iso-8859-1".$this->eol;
    92.             $this->header .= "Content-Transfer-Encoding: 8bit".$this->eol;
    93.         }
    94.     }
    95.  
    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
     
    #1      
  2. kyle66

    kyle66 Guest

    Probleme mit EMail Anhängen
    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 (Text):
    1.  
    2. $trenner = md5(uniqid(time()));
    3. $dateiinhalt = chunk_split(base64_encode($dateiinhalt));
    4.  
    5. $this->header = "From: ".$this->from.$this->eol;
    6. $this->header .= 'MIME-Version: 1.0'.$this->eol;
    7. $this->header .= "Content-Type: multipart/mixed; boundary=$trenner".$this->eol;
    8. $this->header .= "This is a multi-part message in MIME format".$this->eol;
    9. $this->header .= "--".$trenner.$this->eol;
    10. $this->header .= "Content-Type: text/plain".$this->eol;
    11. $this->header .= "Content-Transfer-Encoding: 8bit".$this->eol;
    12. $this->header .= "Hier jetzt der Text";
    13. $this->header .= "--".$trenner.$this->eol;
    14. $this->header .= "Content-Type: application/pdf; name=".$filename.".pdf".$this->eol;
    15. $this->header .= "Content-Transfer-Encoding: base64".$this->eol;
    16. $this->header .= "Content-Disposition: attachment; filename=".$filename.".pdf".$this->eol;
    17. $this->header .= $dateiinhalt;
    18. unset($dateiinhalt);
    19. $add_header .= $this->eol;;
    20. $add_header .= "--".$trenner."--";
    21. mail($this->to, $this->subject, "", $this->header)
    22.  
    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
     
    #2      
  3. MrManko

    MrManko Nicht mehr ganz neu hier

    Dabei seit:
    28.03.2007
    Beiträge:
    187
    Geschlecht:
    männlich
    Ort:
    Far Far Away
    Software:
    Windows 8.1, Visual Studio 2012, Notepad++
    Probleme mit EMail Anhängen
    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
     
    #3      
  4. fakerer

    fakerer Aktives Mitglied

    Dabei seit:
    03.08.2008
    Beiträge:
    804
    Geschlecht:
    männlich
    Probleme mit EMail Anhängen
    #4      
  5. MrManko

    MrManko Nicht mehr ganz neu hier

    Dabei seit:
    28.03.2007
    Beiträge:
    187
    Geschlecht:
    männlich
    Ort:
    Far Far Away
    Software:
    Windows 8.1, Visual Studio 2012, Notepad++
    Probleme mit EMail Anhängen
    AW: Probleme mit EMail Anhängen

    Mit dem Hinweis von kyle66 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
     
    #5      
  6. csvip

    csvip Noch nicht viel geschrieben

    Dabei seit:
    21.08.2011
    Beiträge:
    6
    Geschlecht:
    männlich
    Probleme mit EMail Anhängen
    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
     
    #6      
  7. Steven1990

    Steven1990 Noch nicht viel geschrieben

    Dabei seit:
    20.01.2011
    Beiträge:
    3
    Geschlecht:
    männlich
    Probleme mit EMail Anhängen
    AW: Probleme mit EMail Anhängen

    Huhu,

    gibt doch genug Vorlagen im Internet ;)

    z.B. hier
     
    #7      
  8. MrManko

    MrManko Nicht mehr ganz neu hier

    Dabei seit:
    28.03.2007
    Beiträge:
    187
    Geschlecht:
    männlich
    Ort:
    Far Far Away
    Software:
    Windows 8.1, Visual Studio 2012, Notepad++
    Probleme mit EMail Anhängen
    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:
    1.  
    2. class mail {
    3.     private $to;
    4.     private $from;
    5.     private $subject;
    6.     private $text;
    7.     private $html = false;
    8.     private $attachments = array();
    9.     private $header;
    10.     private $eol;
    11.     private $trenner;
    12.        
    13.     public function __construct($to, $from, $subject, $text, $html = false, $attachment = array()) {
    14.         if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
    15.             $this->eol = "\r\n";
    16.         } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
    17.             $this->eol = "\r";
    18.         } else {
    19.             $this->eol = "\n";
    20.         }
    21.            
    22.         $this->to = $to;
    23.         $this->from = $from;
    24.         $this->subject = $subject;
    25.         $this->text = $text;
    26.         $this->trenner = md5(uniqid(time()));
    27.            
    28.         $this->create_common_headers($attachment);
    29.         $this->set_attachments($attachment);
    30.         $this->set_html($html);
    31.     }
    32.        
    33.     private function set_html($html) {
    34.         if($html != false) {
    35.             if(is_bool($html)) {
    36.                 $this->add_text('html');
    37.             } else {
    38.                 die("Parameter muss vom Typ Boolean sein");
    39.             }
    40.         } else {
    41.             $this->add_text('plain');
    42.         }
    43.     }
    44.            
    45.     private function set_attachments($attachments) {
    46.         if(is_array($attachments)) {
    47.             if(count($attachments) > 0) {
    48.                 $this->attachments = $attachments;
    49.                 $this->add_attachments();
    50.             }
    51.         } else {
    52.             die("Es muss ein Array übergeben werden");
    53.         }
    54.     }
    55.        
    56.     public function send_mail() {
    57.         if(count($this->attachments) > 0) {
    58.             if(mail($this->to, $this->subject, '', $this->header)) {
    59.                 return true;
    60.             } else {
    61.                 return false;
    62.             }
    63.         } else {
    64.             if(mail($this->to, $this->subject, $this->text, $this->header)) {
    65.                 return true;
    66.             } else {
    67.                 return false;
    68.             }
    69.         }        
    70.     }
    71.        
    72.     private function create_common_headers($attachment) {
    73.         $this->header .= "From: ".$this->from.$this->eol;
    74.         $this->header .= "Reply-To: ".$this->from.$this->eol;
    75.         $this->header .= "Return-Path: ".$this->from.$this->eol;
    76.         $this->header .= "X-Mailer: PHP v".phpversion().$this->eol;
    77.         if(count($attachment) > 0) {    
    78.             $this->header .= 'MIME-Version: 1.0'.$this->eol;
    79.             $this->header .= 'Content-Type: multipart/mixed; boundary='.$this->trenner.$this->eol;
    80.             $this->header .= 'This is a multipart message in MIME format'.$this->eol;
    81.         }
    82.     }
    83.        
    84.     private function add_attachments() {
    85.         foreach($this->attachments as $value) {
    86.             $f_name = $value;
    87.             $handle = fopen($f_name, 'rb');
    88.             $f_contents = fread($handle, filesize($f_name));
    89.             $f_contents = chunk_split(base64_encode($f_contents));
    90.             $f_type = filetype($f_name);
    91.             fclose($handle);
    92.                
    93.             $this->header .= '--'.$this->trenner.$this->eol;
    94.             $this->header .= "Content-Type: application/pdf; name=\"".$value."\"".$this->eol;
    95.             $this->header .= "Content-Transfer-Encoding: base64".$this->eol;
    96.             $this->header .= "Content-Disposition: attachment; filename=\"".$value."\"".$this->eol.$this->eol; // !!Hier zweimal EOL !! GAAAANZ WICHTIG !!
    97.             $this->header .= $f_contents.$this->eol.$this->eol;  
    98.         }
    99.     }
    100.        
    101.     private function add_text($type) {
    102.         if(count($this->attachments) > 0) {
    103.             $this->header .= '--'.$this->trenner.$this->eol;
    104.         }
    105.         $this->header .= "Content-Type: text/".$type."; charset=iso-8859-1".$this->eol;
    106.         $this->header .= "Content-Transfer-Encoding: 8bit".$this->eol;
    107.         if(count($this->attachments) > 0) {
    108.             $this->header .= $this->text.$this->eol;
    109.         }
    110.     }            
    111. }
    112.  
    Und so wird das ganze dann angewendet:

    PHP:
    1.  
    2. $mail_text = "Dein Text für die E-Mail, HTML ist erlaubt";
    3. $anhaenge = array(); // Anhänge müssen als Array übergeben werden
    4. $anhaenge[0] = "pfad/zu/deiner/datei.endung";
    5. $anhaenge[1] = "pfad/zu/deiner/datei.endung";
    6.  
    7. $mail = new mail("empfanger@domain.tld", "absender@domain.tld", "Betreff", $mail_text, true, $anhaenge);
    8.  
    9. // Wenn "true"durch ein "false" ersetzt wird, dann darf kein HTML im Mailtext vorkommen
    10.  
    Ich hoffe ich konnte dir weiterhelfen und wenn Probleme auftreten, dann melde dich einfach bei mir, gerne auch per PN =)
     
    #8      
  9. csvip

    csvip Noch nicht viel geschrieben

    Dabei seit:
    21.08.2011
    Beiträge:
    6
    Geschlecht:
    männlich
    Probleme mit EMail Anhängen
    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
     
    #9      
  10. MrManko

    MrManko Nicht mehr ganz neu hier

    Dabei seit:
    28.03.2007
    Beiträge:
    187
    Geschlecht:
    männlich
    Ort:
    Far Far Away
    Software:
    Windows 8.1, Visual Studio 2012, Notepad++
    Probleme mit EMail Anhängen
    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:
    1.  
    2. <?php
    3. include 'email.class.php';
    4. ?>
    5.  
    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:
    1.  
    2. <?php
    3. include 'email.class.php';
    4.  
    5. $mail_text = "Dein Text für die E-Mail, HTML ist erlaubt";
    6. $anhaenge = array(); // Anhänge müssen als Array übergeben werden
    7. $anhaenge[0] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
    8. $anhaenge[1] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
    9.  
    10. $mail = new mail("empfanger@domain.tld", "absender@domain.tld", "Betreff", $mail_text, true, $anhaenge);
    11. ?>
    12.  
    Zur Erklärung des Konstruktors hier eine kleine Doku:

    Code (Text):
    1. 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:
    1.  
    2. <?php
    3. include 'email.class.php';
    4.  
    5. $mail_text = "Dein Text für die E-Mail, HTML ist erlaubt";
    6. $anhaenge = array(); // Anhänge müssen als Array übergeben werden
    7. $anhaenge[0] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
    8. $anhaenge[1] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
    9.  
    10. $mail = new mail("empfanger@domain.tld", "absender@domain.tld", "Betreff", $mail_text, true, $anhaenge);
    11.  
    12. if($mail->send_mail()) {
    13.     echo "E-Mail wurde erfolgreich verschickt";
    14. } else {
    15.     echo "E-Mail konnt nicht verschickt werden";
    16. }
    17. ?>
    18.  
    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.

    http://ul.to/1xu1ud1q

    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: 24.08.2011
    #10      
  11. csvip

    csvip Noch nicht viel geschrieben

    Dabei seit:
    21.08.2011
    Beiträge:
    6
    Geschlecht:
    männlich
    Probleme mit EMail Anhängen
    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:
    1. $anhaenge[0] = "pfad/zu/deiner/datei.endung"; // Das ist eine Datei, die als Anhang an die Mail gehängt wird
    2. $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
     
    #11      
  12. MrManko

    MrManko Nicht mehr ganz neu hier

    Dabei seit:
    28.03.2007
    Beiträge:
    187
    Geschlecht:
    männlich
    Ort:
    Far Far Away
    Software:
    Windows 8.1, Visual Studio 2012, Notepad++
    Probleme mit EMail Anhängen
    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:
    1.  
    2. $anhang = "test.pdf"
    3.  
    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
     
    #12      
x
×
×