ö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
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
}
?>
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
ö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
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
Wird nicht meistens eine Verteiler-Liste angewendet? Sprich Massenversand, NL, Werbung, etc.?Zitat von St@eff.en
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!
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
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)
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
Klar.![]()
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?
Achso, nein.Zitat von Kowkase
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.
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
Zitat von Kowkase
Ein Beispiel dazu findest du da:
http://de2.php.net/manual/de/ref.mail.php#61644
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)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)