 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
25.07.2005, 22:26
|
#1
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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( $fp, filesize($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( $buffer, 72 );
// 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
}
?>
|
|
|
25.07.2005, 22:43
|
#3
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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.
|
|
|
10.09.2005, 12:04
|
#4
|
|
TP-Specialist
Registriert seit: Nov 2004
Ort: Die Insel in Europa die aus Europa erst Europa macht _________________________ Nähe Lenzburg
|
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!
|
|
|
10.09.2005, 13:03
|
#5
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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.
|
|
|
21.12.2005, 00:09
|
#6
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
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).
|
|
|
20.07.2006, 14:07
|
#7
|
|
TP-Senior
Registriert seit: May 2004
Ort: Brandenburg
|
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
|
|
|
20.07.2006, 18:34
|
#8
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
Klar. 
|
|
|
21.07.2006, 07:57
|
#9
|
|
TP-Senior
Registriert seit: May 2004
Ort: Brandenburg
|
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?
|
|
|
21.07.2006, 08:17
|
#10
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
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.
|
|
|
24.07.2006, 18:39
|
#11
|
|
TP-Senior
Registriert seit: May 2004
Ort: Brandenburg
|
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
|
|
|
25.07.2006, 14:43
|
#12
|
|
TP-Senior
Registriert seit: Feb 2006
Ort: Göttingen
|
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
|
|
|
02.08.2006, 15:04
|
#13
|
|
TP-Senior
Registriert seit: May 2004
Ort: Brandenburg
|
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 in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
| | |