SetaPDF
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 25.07.2005, 22:26   #1
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User

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
steffenk ist offline   Mit Zitat antworten


Alt 25.07.2005, 22:34   #2
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
ö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
Stuck Mojo ist offline   Mit Zitat antworten
Alt 25.07.2005, 22:43   #3
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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
steffenk ist offline   Mit Zitat antworten
Alt 10.09.2005, 12:04   #4
321
TP-Specialist
 
Benutzerbild von 321
 
Registriert seit: Nov 2004
Ort: Die Insel in Europa die aus Europa erst Europa macht _________________________ Nähe Lenzburg
321 hilft, wo's geht321 hilft, wo's geht321 hilft, wo's geht
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!
321 ist offline   Mit Zitat antworten
Alt 10.09.2005, 13:03   #5
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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
steffenk ist offline   Mit Zitat antworten
Alt 21.12.2005, 00:09   #6
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's geht
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;
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank

Geändert von DSB (21.12.2005 um 19:15 Uhr).
DSB ist offline   Mit Zitat antworten
Alt 20.07.2006, 14:07   #7
TP-Senior
 
Benutzerbild von Kowkase
 
Registriert seit: May 2004
Ort: Brandenburg
Kowkase macht alles soweit korrekt
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
Kowkase ist offline   Mit Zitat antworten
Alt 20.07.2006, 18:34   #8
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's geht
Klar.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 21.07.2006, 07:57   #9
TP-Senior
 
Benutzerbild von Kowkase
 
Registriert seit: May 2004
Ort: Brandenburg
Kowkase macht alles soweit korrekt
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?
Kowkase ist offline   Mit Zitat antworten
Alt 21.07.2006, 08:17   #10
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's geht
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
DSB ist offline   Mit Zitat antworten
Alt 24.07.2006, 18:39   #11
TP-Senior
 
Benutzerbild von Kowkase
 
Registriert seit: May 2004
Ort: Brandenburg
Kowkase macht alles soweit korrekt
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
Kowkase ist offline   Mit Zitat antworten
Alt 25.07.2006, 14:43   #12
TP-Senior
 
Benutzerbild von zy0n
 
Registriert seit: Feb 2006
Ort: Göttingen
zy0n ist auf einem guten Weg
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
zy0n ist offline   Mit Zitat antworten
Alt 02.08.2006, 15:04   #13
TP-Senior
 
Benutzerbild von Kowkase
 
Registriert seit: May 2004
Ort: Brandenburg
Kowkase macht alles soweit korrekt
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
Kowkase ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik > Traum-Scripts
Mail-Skript Mail-Skript
« Umlaute in Komplettprojekt ersetzen | MySQL und Pager Klasse im Bundle »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen