Ergebnis 1 bis 13 von 13

Thema: Mail-Skript

  1. #1
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869

    Mail-Skript

    Lange hab ich mit der richtigen Zusammensetzung von Mailheadern gekämpft.

    Nun habe ich ein Skript gefunden, mit dem man Mails komponieren kann, die man nach eigenen Vorstellungen zusammensetzen kann - HTML oder Text, beides, mit oder ohne Anhang.

    Zusätzlich ist eine Funktion drin, die die Emailadresse auf Gültigkeit (korrekter Aufbau) überprüft.

    Hier nun das Skript:

    PHP-Code:
    <?php 


    function validate_email($email){ 
        
    /* 
        Hilfsfunktion zur Syntax-Überprüfung einer Email Adresse 
        Parameter:     String (Email Adresse) 
        Ausgabe:     Boolean (TRUE/FALSE) 
                    TRUE: Syntax gültig 
                    FALSE Syntax ungültig 
        */ 
        
    if ( !eregi("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$"$email) ) { 
            return 
    false
        } else { 
            return 
    true
        } 


    function 
    send_MIME_email$email ){ 
        
    /* 
        Funktion zum Senden einer MIME_Email 
        Parameter:    [Array] 
                    "recip":    Email Empfänger (String) 
                    "sender":    Email Absender (String) 
                    "subject":    Betreff (String) 
                    "content":    [Array] 
                                "plain":    Nachricht im Plaintextformat (String) 
                                "html":        Nachricht im HTML-Format (String) 
                    "attachment":    Pfad der anzuhängenden Datei (String) 
        Ausgabe:     Boolean (TRUE/FALSE) 
                    TRUE: Email wurde versendet 
                    FALSE: Email wurde nicht versendet 
        */ 
                                 
        
    if( empty($email["recip"]) || empty($email["sender"]) || empty($email["subject"]) ) { 
            
    // recip, sender oder subject wurden nicht angegeben 
            
    return false
        } 
          
        if( !
    validate_email($email["recip"]) || !validate_email($email["sender"]) ) { 
            
    // der Aufruf der Hilfsfunction oben ("validate_email") gab FALSE zurück, 
            // die Email Adresse von Sender und/oder Empfänger ist also ungültig 
            
    return false
        } 
          
        if( empty(
    $email["content"]["plain"]) && empty($email["content"]["html"]) ) { 
            
    // es wurde weder Plaintext-Inhalt noch HTML-Inhalt angegeben, 
            // die Nachricht ist also leer 
            
    return false
        } 
         
        
    // Anders als bei einer "normalen" Mail wird bei einer MIME Mail 
        // alles, was versendet werden soll, in den "Header" gepackt. 
        // Die einzelnen MIME-Types werden durch eine feste Textzeile 
        // eine voneinander getrennt, die "boundary". Diese wird hier 
        // erst einmal aus dem Zeitstempel erzeugt: 
        
    $boundary strtoupper(md5(uniqid(time()))); 
         
        
    // Dann wird der Header gefüllt: 
        
    $mail_header "From: ".$email["sender"]; 
         
        
    // Hier erhält der Mail Client die Information, 
        // dass es sich um eine MIME Mail handelt... 
        
    $mail_header .= "\nMIME-Version: 1.0"
         
        
    // ...und die Trennkennung - die "boundary" wird mitgeteilt, damit 
        // die einzelnen Teile nicht als ein Brei verstanden werden 
        
    $mail_header .= "\nContent-Type: multipart/alternative; boundary=".$boundary
        
    $mail_header .= "\n\nThis is a multi-part message in MIME format"
         
        
    // wenn Plaintext Inhalt angegeben wurde... 
        
    if( !empty($email["content"]["plain"]) ){ 
            
    // ...wird erstmal die "boundary" in den Header geschrieben, 
            // ein neuer MIME-type beginnt... 
            
    $mail_header .= "\n--".$boundary
            
    // der MIME-type wird angegeben 
            
    $mail_header .= "\nContent-Type: text/plain"
            
    // ebenso die Codierung 
            
    $mail_header .= "\nContent-Transfer-Encoding: 8bit"
            
    // und dann der eigentliche Inhalt 
            
    $mail_header .= "\n\n".$email["content"]["plain"]; 
        } 
         
        
    // wenn HTML-Inhalt angegeben wurde... 
        
    if( !empty($email["content"]["html"]) ){ 
            
    // ...wird erstmal die "boundary" in den Header geschrieben, 
            // ein neuer MIME-type beginnt... 
            
    $mail_header .= "\n--".$boundary
            
    // MIME-type und Codierung werden angegeben 
            
    $mail_header .= "\nContent-Type: text/html"
            
    $mail_header .= "\nContent-Transfer-Encoding: 8bit"
            
    // dann folgt wieder der eigentliche Inhalt 
            
    $mail_header .= "\n\n".$email["content"]["html"]; 
        } 
         
        
    // wenn eine Datei zum anhängen angegeben wurde... 
        
    if( !empty($email["attachment"]) ){ 
            
    $file $email["attachment"]; 
            
    $filename basename$file ); 
             
            
    // ...existiert die Datei überhaupt und ist sie lesbar? 
            
    if( @is_file($file) && @is_readable($file) ){ 
                
    // ja, also wird sie geöffnet... 
                
    $fp = @fopen$file"rb" ); 
                if( 
    $fp ){ 
                    
    // ...und in eine Variable ($buffer) eingelesen, 
                    
    $buffer fread$fpfilesize($file) ); 
                    
    // dann BASE64 codiert, weil es sich binäre Daten handelt 
                    
    $buffer base64_encode$buffer ); 
                    
    // und auf 72 Zeichen pro Zeile gestutzt. 
                    
    $buffer chunk_split$buffer72 ); 
                    
    // Die Datei wird wieder geschlossen, wir sind ja ordentlich. 
                    
    fclose($fp); 
                     
                    
    // Jetzt kommt wieder die "boundary" in den Header, 
                    
    $mail_header .= "\n--".$boundary
                    
    // der MIME-type und hier zusätzlich der Dateiname werden angegeben. 
                    
    $mail_header .= "\nContent-Type: application/octet-stream; name=\"".$filename."\""
                    
    // die Codierung ist hier BASE64 
                    
    $mail_header .= "\nContent-Transfer-Encoding: base64"
                    
    // und dem Mail Client wird mitgeteilt, dass es sich um einen Anhang handelt. 
                    
    $mail_header .= "\nContent-Disposition: attachment; filename=\"".$filename."\""
                    
    // Jetzt folgt die BASE64-codierte Datei 
                    
    $mail_header .= "\n\n".$buffer
                } else { 
                    
    // Die Datei konnte nicht geöffnet werden 
                

            } 
        } 
         
        
    // Jetzt muss die erzeugte Mail nur noch versendet werden. 
        // der PHP Befehl "mail" wird mit den Parametern 
        // mail( recipient, subject, body, header ) aufgerufen und 
        // gibt TRUE oder FALSE zurück, dieser Rückgabewert wird 
        // einfach weitergeleitet 
        
    if( !@mail($email["recip"],$email["subject"],"",$mail_header) ) { 
            return 
    false
        } else { 
            return 
    true
        } 


    // ------------------------------------------------------- 
    // ANWENDUNG 
    // ------------------------------------------------------- 

    // Die Funktion erwartet ein Array als Parameter: 
    $MIME_email = array(); 

    // Empfänger("recip"), Absender("sender") 
    // und Betreff ("subject") werden gesetzt: 
    $MIME_email["recip"] = "recip@domain.de"
    $MIME_email["sender"] = "sender@domain.de"
    $MIME_email["subject"] = "subject"

    // Jetzt kommt der eigentliche Inhalt, der in zwei Teile 
    // gegliedert wird, deshalb zunächst wieder ein Array: 
    $MIME_email["content"] = array(); 

    // Jetzt kommt der Plaintext der Email 
    $MIME_email["content"]["plain"] = "plaintext ausgabe"

    // und der HTML-Part: 
    $MIME_email["content"]["html"] = "<HTML><HEAD><TITLE>HTML mail</TITLE></HEAD>" 
        
    ."<BODY bgcolor='#000000' text='#FFFFFF'>html ausgabe</BODY></HTML>"

    // vielleicht noch ein Dateianhang? 
    // Der Pfad muss relativ zum PHP Skript angegeben werden. 
    $MIME_email["attachment"] = "test.zip"


    /* 
    Das Array sieht jetzt so aus: 
    $MIME_email = Array( 
        "recip" => "recip@domain.de", 
        "sender" => "sender@domain.de", 
        "subject" => "subject", 
        "content" => Array( 
            "plain" => "plaintext ausgabe", 
            "html" => "<HTML><HEAD>...</HTML>" 
            ), 
        "attachment" => "test.zip" 
    ); 

    Das ganze wird jetzt an die Funktion "send_MIME_email" übergeben 
    */ 

    if( !send_MIME_email$MIME_email ) ){ 
        
    // MIME email konnte nicht gesendet werden 
    } else { 
        
    // MIME email wurde gesendet 


    ?>

    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer

  2. #2
    TP-Specialist Avatar von Stuck Mojo
    Registriert seit
    Feb 2001
    Ort
    Helmstedt/Wolfsburg
    Beiträge
    4.108
    öhm... ohne deine Funktion schlecht zu machen, gibts da doch deutlich flexiblere Klassen für:
    http://www.phpguru.org/static/mime.mail.html oder/und http://pear.php.net/package/Mail_Mime

    Gruss
    Jan

  3. #3
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    ist nicht meine

    Aber sie ist schön klein und für manche Sachen benötigt man einfach nur eine funktionierende und vom Spamassasin o.ä. akzeptierte Mail.

    Aber danke für die Links - das sind grössere Pakete und demzufolge auch leistungsfähigere.

    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer

  4. #4
    321
    321 ist offline
    TP-Specialist Avatar von 321
    Registriert seit
    Nov 2004
    Ort
    Die Insel in Europa die aus Europa erst Europa macht _________________________ Nähe Lenzburg
    Beiträge
    4.248
    Zitat Zitat von St@eff.en
    ...
    Zusätzlich ist eine Funktion drin, die die Emailadresse auf Gültigkeit (korrekter Aufbau) überprüft.

    Hier nun das Skript:

    PHP-Code:
    <?php 
    ...
    Das ganze wird jetzt an die Funktion "send_MIME_email" übergeben 
    */ 

    if( !
    send_MIME_email$MIME_email ) ){ 
        
    // MIME email konnte nicht gesendet werden 
    } else { 
        
    // MIME email wurde gesendet 


    ?>
    Wird nicht meistens eine Verteiler-Liste angewendet? Sprich Massenversand, NL, Werbung, etc.?

    Auswelchen Gründen sollte die Mail nicht gesendet werden können?
    [321 Name="Joe"]
    wie immer, lieber gleich mit notepad, dem Editor meines Vertrauens
    [/321]


    use my HTML-Tester

    Motto'06: Mut zur deutschen Sprache!

  5. #5
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    es gibt nur einen Grund, warum die Mail nicht gesendet wird - wenn die php-Funktion mail(...) scheitert. Das liegt dann an nicht vorhandenem oder falsch konfiguriertem Mailserver.

    Verteilerlisten sind doch kein Problem, Empfänger können beliebig viele Emailadressen beinhalten.

    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer

  6. #6
    DSB
    DSB ist offline
    TP-Veteran Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Die Aussage, dass bei einer MIME-Mail der body mit in den Header gehört ist nicht korrekt. Das wird spätestens beim Versenden eines Anhangs offenbar.
    Lediglich Outlook Express deutet die Email richtig, alle anderen getesteten Programme wie Outlook, TheBat und Thunderbird können mit dem Anhang dann nichts anfangen.
    Ich hatte die Probleme beim Versenden eines PDFs als Anhang.

    Hiermit klappt es:
    Code:
    		$DateinameMail = basename($this->anhang); 
    		$Trenner = md5(uniqid(time())); 
    
    		$header= "From: MySQLDumper <info@mysqldumper.de>\n"; 
    		$header .= "MIME-Version: 1.0\n"; 
    		$header .= "Content-Type: multipart/mixed;\n";
    		$header .= " boundary=$Trenner"; 
    		$header .= "\n\n";
    
    		//der Rest kommt in Body
    		$body= "This is a multi-part message in MIME format\n"; 
    		$body.= "--$Trenner\n"; 
    		$body.= "Content-Type: text/plain; charset=iso-8859-15\n"; 
    		$body.= "Content-Transfer-Encoding: quoted-printable\n\n"; 
    		$body.= $this->output;    
    
    		$body.= "\n"; 	
    		$body.= "--$Trenner	"; 
    		$body.= "\n"; 
    		$body.= "Content-Type: APPLICATION/PDF; name=\"$DateinameMail\"\n"; 
    		$body.= "Content-transfer-encoding: base64\n"; 
    		$body.= "Content-Disposition: attachment; filename=\"$DateinameMail\"\n"; 	
    		$body.= "\n\n"; 
    		$Dateiinhalt = fread(fopen($this->anhang, "r"), filesize($this->anhang)); 
    		$body.= chunk_split(base64_encode($Dateiinhalt)); 
    		$body.= "\n"; 
    		$body.= "--$Trenner--\n\n"; 
    
    	    if( !@mail($this->empfaenger,$this->betreff,$body,$header) ) return false;  
    	    else return true;
    Geändert von DSB (21.12.2005 um 19:15 Uhr)
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  7. #7
    TP-Senior Avatar von Kowkase
    Registriert seit
    May 2004
    Ort
    Brandenburg
    Beiträge
    162
    Hallo DSB,

    beim durchsuchen des Forums nach PDF-Beiträgen bin ich über einen von Dir gestolpert.
    Ich will ein automat8isch generiertes PDF-Dokument in dem Moment wo es erstellt wurde automatisch an eine fest definierte Mailadresse weitereiten lasse und es parrallel am Bildschirm ausgeben.
    Währe das mit Deinem Script möglich?

    Gruß, Kowkase

  8. #8
    DSB
    DSB ist offline
    TP-Veteran Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Klar.
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  9. #9
    TP-Senior Avatar von Kowkase
    Registriert seit
    May 2004
    Ort
    Brandenburg
    Beiträge
    162
    verstehe ich das richtig, dass das mit dem obigen Script möglich ist? Kommt das dann als eigener <?PHP ?> Block daher, sprich im gleichen Dokument in dem auch das PDF erzeugt wird?

  10. #10
    DSB
    DSB ist offline
    TP-Veteran Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Zitat Zitat von Kowkase
    verstehe ich das richtig, dass das mit dem obigen Script möglich ist?
    Achso, nein.
    Das ist ein Auszug aus einer Klasse (wie Du unschwer an der Variablen $this->betreff) erkennen kannst und kein fertiges Script.
    Ich wollte nur das Prinzip verdeutlichen mit dem ich das gelöst habe.

    Steffens Script ist lauffähig.
    Ich dachte, Deine Frage bezog sich darauf.
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  11. #11
    TP-Senior Avatar von Kowkase
    Registriert seit
    May 2004
    Ort
    Brandenburg
    Beiträge
    162
    High Stoeffen,

    kann man das Script so anpassen, dass es Daten die in einem PHP-Formular aufgenommen werden und dann in ein PDF verwandelt auf dem Server zu liegen kommen automatisch versenden kann?
    Ich habe mein Konstrukt soweit, dass bis hin zum ablegen auf dem Server alles läuft. Der Name des Dokuments ergibt sich aus dem Namen des Formulars, ist sozusagen jeweils eindeutig.
    Trotz Deiner riesigen Bemühungen die Erklärungen in Deinem Script "Idiotensicher" zu machen krieg ich's irgendwie nicht hin, dass er irgendwas versendet.
    Das Anpassen der Mailadresse in Zeile 152 scheint also nicht ausreichend zu sein.

    Gruß, Kowkase

  12. #12
    TP-Senior Avatar von zy0n
    Registriert seit
    Feb 2006
    Ort
    Göttingen
    Beiträge
    139
    Zitat Zitat von Kowkase
    High Stoeffen,

    kann man das Script so anpassen, dass es Daten die in einem PHP-Formular aufgenommen werden und dann in ein PDF verwandelt auf dem Server zu liegen kommen automatisch versenden kann?
    Ich habe mein Konstrukt soweit, dass bis hin zum ablegen auf dem Server alles läuft. Der Name des Dokuments ergibt sich aus dem Namen des Formulars, ist sozusagen jeweils eindeutig.
    Trotz Deiner riesigen Bemühungen die Erklärungen in Deinem Script "Idiotensicher" zu machen krieg ich's irgendwie nicht hin, dass er irgendwas versendet.
    Das Anpassen der Mailadresse in Zeile 152 scheint also nicht ausreichend zu sein.

    Gruß, Kowkase

    Ein Beispiel dazu findest du da:

    http://de2.php.net/manual/de/ref.mail.php#61644

  13. #13
    TP-Senior Avatar von Kowkase
    Registriert seit
    May 2004
    Ort
    Brandenburg
    Beiträge
    162

    Thumbs up

    danke für den Link. Sehr gut, dass Script war wirklich rel. einfach anzupassen.

    parrallel hatte ich noch bei http://www.fpdf.de nachgefragt und auch dort prima Unterstützung gefunden.

    = Prob gelöst und wieder viel dazu gelernt.

    Vielen Dank an alle Beteiligten

    Kowkase

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51