Zurück   Flashforum > Flash und Server > PHP und MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 19-08-2003, 09:20   #1 (permalink)
User
 
Benutzerbild von Gosub
 
Registriert seit: Jul 2003
Ort: München
Beiträge: 53
[tutorial] HTML-Mail und AntiSPAM

ich hatte kürzlich folgendes problem: ein PHP-script sollte eine HTML-mail verschicken - eigentlich kein thema. ich habe nur aus routine getestet und.... nix kam an. hä? hat lange gedauert, bis ich kapiert habe, dass die auf meinem server installierte ANTI-SPAM-software die emails als SPAM erkannt und markiert hat. die dinger landeten kommentarlos auf dem müll.

also meine empfehlung an alle, die HTML-mail verschicken wollen: die meisten ANTI-SPAM-tools markieren solche mails als SPAM, die ausschliesslich HTML-content haben. deshalb besser auch eine text/plain variante anbieten und das ganze als MIME email verschicken, wenn ihr sicher sein wollt, dass die mail auch ankommt.

kleines script dazu:
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 


?>
Angehängte Dateien
Dateityp: zip Mimemail.zip (2,5 KB, 326x aufgerufen)

Geändert von bobby (11-08-2004 um 15:15 Uhr)
Gosub ist offline   Mit Zitat antworten
Alt 23-06-2004, 10:00   #2 (permalink)
Neuer User
 
Benutzerbild von alexm
 
Registriert seit: Jun 2004
Ort: Wien
Beiträge: 101
dein script funktioniert wunderbar. auch mein gmx account akzeptiert das erhaltene mail voll und ganz. einziges problem:

wie "embedde" ich hier nun bilder in der html-mail?

hab folgende zeile probiert:

PHP-Code:
$MIME_email["content"]["html"] = "<HTML><HEAD><TITLE>HTML mail</TITLE></HEAD>" 
    
."<BODY bgcolor='#000000' text='#FFFFFF'>html ausgabe<br><img src='http://...../testbild.jpg'></BODY></HTML>"
mir wird dann zwar der text aber nicht das bild angezeigt.
alexm ist offline   Mit Zitat antworten
Alt 23-06-2004, 10:19   #3 (permalink)
User
 
Benutzerbild von Gosub
 
Registriert seit: Jul 2003
Ort: München
Beiträge: 53
Hm. Eigentlich alles richtig, absoluter http-pfad, es sollte so funktionieren. Wird wenigstens der Platzhalter für das Bild angezeigt? Ist der Pfad im Mail-Sourcecode richtig? Erlaubt der Mail-Client das Laden von Bildern?

GOsub
Gosub ist offline   Mit Zitat antworten
Alt 23-06-2004, 10:44   #4 (permalink)
Neuer User
 
Benutzerbild von alexm
 
Registriert seit: Jun 2004
Ort: Wien
Beiträge: 101
nein leider auch kein platzhalter.

ich denk schon dass das gmx das erlaubt. ich bild mir ein ich hab schon mal ein html mail bekommen wo ein bild drinnen war.

pfad ist auch korrekt, habs grad mit copy&paste vom code in den browser gecheckt.

Geändert von alexm (23-06-2004 um 10:46 Uhr)
alexm ist offline   Mit Zitat antworten
Alt 23-06-2004, 10:47   #5 (permalink)
Neuer Benutzer
 
Benutzerbild von webxvideo
 
Registriert seit: Nov 2003
Ort: berlin
Beiträge: 883
Ich denke Ihr versucht die Spamfilter zu umgehen.
Ein absoluter Pfad zu einem Bild ist auch ein Kriterium für Spam-Filter.

Ich weiß im Moment nicht wie, aber ich glaube Bilder lassen sich auch in einer von PHP generierten Mail einbetten.
webxvideo ist offline   Mit Zitat antworten
Alt 23-06-2004, 10:53   #6 (permalink)
Neuer User
 
Benutzerbild von alexm
 
Registriert seit: Jun 2004
Ort: Wien
Beiträge: 101
@webxvideo:
wäre schön wenn ich mich mit dem zeugs so gut auskennen würde dass ich da so weit vorrausdenke.
aber offensichtlich muss man das weils sonst nicht funktioniert.

hab jetzt das ganze mal an meinen yahoo account geschickt und dort gehts.
allerdings greift dort das bgcolor tag nicht ...
also offensichtlich ist das html mailen so oder so glückssache wie´s beim empfänger ankommt und aussieht. oder?
alexm ist offline   Mit Zitat antworten
Alt 23-06-2004, 11:21   #7 (permalink)
User
 
Benutzerbild von Gosub
 
Registriert seit: Jul 2003
Ort: München
Beiträge: 53
versuch doch mal, den Port im Pfad mit anzugeben:
<img src="http://www.domain.net:8080/bild.jpg">

Alternativ kann das Bild - wie webxvideo sagt - auch mitgeschickt werden, das ist aber etwas komplizierter und kann je nach Client zu anderen Problemen führen. Das Bild muss dann zunächst Base64-kodiert werden:


PHP-Code:
<?
$fp 
fopen($imgfile,'rb');
$buffer fread($fp,filesize($imgfile));
fclose($fp);
$imgdata chunk_split(base64_encode($buffer));

echo 
"<img src='data:image/jpg;base64,".$imgdata."'>";
?>
GOsub
Gosub ist offline   Mit Zitat antworten
Alt 13-08-2005, 20:01   #8 (permalink)
Affine Abbildung
 
Benutzerbild von Samuel
 
Registriert seit: Feb 2002
Ort: Bremen
Beiträge: 15.089
Danke für die Ergänzung,

allerdings ist dieser Beitrag ein wenig alt
__________________
Solange sich auch nur einer an ihn erinnert, solange auch nur ein Herz mit Leidenschaft schlägt - wie kann ein Traum da sterben?

If you use the wrong line ending characters when writing your files, you might find that other applications that open those files will "look funny". - PHP.net

Hier ruhn meine Gebeine - ich wollt, es wären Deine.

Try to look unimportant, they may be low on ammo!

Was ist euer Lieblings-Datentyp? Schreibt mir!
Samuel ist offline   Mit Zitat antworten
Alt 13-08-2005, 21:48   #9 (permalink)
.ad
 
Benutzerbild von bobby
 
Registriert seit: Jun 2001
Ort: zürich
Beiträge: 10.731
Zitat:
Zitat von Samuel
Danke für die Ergänzung,

allerdings ist dieser Beitrag ein wenig alt
dafür ist er im tut-bereich verlinkt
__________________
http://www.radiocity.ch
bobby ist offline   Mit Zitat antworten
Alt 13-08-2005, 21:49   #10 (permalink)
Affine Abbildung
 
Benutzerbild von Samuel
 
Registriert seit: Feb 2002
Ort: Bremen
Beiträge: 15.089
Ja, dacht ich mir, ich fänds schön, fällt mir gerade ein, dass man eventuell die Threads als TUT oder so kennzeichnen könnte, also in den Bereichen, damit man weiß, was es ist
__________________
Solange sich auch nur einer an ihn erinnert, solange auch nur ein Herz mit Leidenschaft schlägt - wie kann ein Traum da sterben?

If you use the wrong line ending characters when writing your files, you might find that other applications that open those files will "look funny". - PHP.net

Hier ruhn meine Gebeine - ich wollt, es wären Deine.

Try to look unimportant, they may be low on ammo!

Was ist euer Lieblings-Datentyp? Schreibt mir!
Samuel ist offline   Mit Zitat antworten
Alt 04-10-2005, 18:41   #11 (permalink)
Neuer User
 
Registriert seit: Dec 2004
Beiträge: 3
Attachment

Hi,

bei mir klappt das mit dem Attachment nicht. Wenn ich das Skript verwende, wie es ist, kommt eine Mail mit dem korrekten Text an, aber kein Attachment, obwohl die Email beim Runterladen ungefähr die Größe des Attachments hat.

Wenn ich den Header auf
$mail_header .= "\nContent-Type: multipart/mixed boundary=".$boundary;
umstelle und die HTML Komponente weglasse, funktioniert es...

Warum klappt denn die Einstellung mit Alternativ nicht? Das wäre doch der richtige Content-Type. Müsste nicht generell in dem Skript noch zum Abschluss der MIME Mail vor dem Versand die boundary wiederholt werden mit
$mail_header .= "\n--".$boundary."--";

Irgendeine Idee, was ich machen kann, damit auch alternativ funktioniert?

Danke, Soren

Geändert von Soren (05-10-2005 um 06:18 Uhr)
Soren ist offline   Mit Zitat antworten
Alt 13-02-2006, 11:36   #12 (permalink)
Neuer User
 
Registriert seit: Dec 2004
Beiträge: 3
Liest hier noch jemand?

HI,

wenn noch irgendwer diesen Thread liest:
Irgendeine Idee, warum in meinen Emails die Leerzeichen verschwinden? An einigen Stellen (interessanterweise immer an unterschiedlichen) kleben alle Wörter komplett zusammen.

Ich habe den HTML Teil mit Tags versehen und für den Plain Teil einfach auf die HTML Version strip_tags angewandt.

Danke, Soren
Soren ist offline   Mit Zitat antworten
Alt 20-04-2006, 12:37   #13 (permalink)
Neuer User
 
Registriert seit: Aug 2002
Ort: Weimar
Beiträge: 36
Anhang Problem

Ich habe das gleiche Problem mit dem Anhang, der wird einfach nicht mitgesendet...
Hat Schon Jemand eine Lösung dazu gefunden??
__________________
frustra laborat, qui omnibus placere studet!
Titus ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


LinkBacks (?)
LinkBack zu diesem Thema: http://www.flashforum.de/forum/php-und-mysql/tutorial-html-mail-und-antispam-91380.html
Erstellt von Für Art Datum Hits
[PHP] HTML - Plain Weiche bei Emails Dieses Thema Refback 31-05-2011 09:51 7
Wie versende ich die korrekten Mail Header? - php.de Dieses Thema Refback 07-09-2009 11:33 22


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele