funktion send_html_and_text_mail

Alles, was PHP betrifft, kann hier besprochen werden.

Postby Straffi » 14. January 2004 08:19

Moin DJ DHG,

... sollte nicht zuerst der empfänger kommen?


Yepp, genau in der Reihenfolge wird die mail()-Funktion ja auch aufgerufen:
Code: Select all
// Jetzt die mail-funktion
mail($An, $Betreff, $Text, $Header);


Ok, für eine bessere Übersicht könnte man die Parameter der eigenen Funktion in die selbe Reihenfolge bringen.
Eine "richtige" Mailanwendung in PHP lässt sich einfacher mit den Mail-Klassen von PEAR erstellen ( http://pear.php.net/packages.php?catpid=14&catname=Mail ).



mfg straffi
User avatar
Straffi
 
Posts: 120
Joined: 07. October 2003 17:48

Postby Stefan » 14. January 2004 12:43

Seruvs TTP,

kannst du mir das Script nicht so editieren, dass es eine ganze datei ist, also mit <? beginnend und mit ?> aufhörend, dass ich nur die passenden emailadressen angeben muss und den HTML-Text?



Bitteschön:

An der Stelle an der die Inhalte bestimmt werden, wähle die"<<<EOF" Syntax, weil Du im HTML Teil durchaus eine Fehler erzeugen könntest, sobald Hochkommas ins Spiel kommen.
bsp. $konf['Inhalt_HTML'] ="<span class="">blah</span>";
Das erste Hochkomma nach class=" würde auch das Ende des Strings bedeuten und somit eine Fehlerausgabe erzeugen.
Variablen werden zu allem Glück auch noch expandiert :-)
Bilder im HTML Quelltext solltest Du am besten von einem externen Server holen(<img src="http://domäne.de/bild.jpg">) da mache mailclients(wie meiner) solche Outlook HTML Mistdinger(bilder als Anhang) nicht interpretiert. Grundsätzlich solltest Du noch wissen, das HTML mails zwar bequem und beliebt, aber auch gefährlich sein können und deshalb von machen(wie mir) komplett abgelehnt werden. Aber zum Glück hast Du ja noch den text/plain Teil :-).

Ganz wichtig ist, dass in der Zeile in der "<<<TEXT" steht, nichts
anderes mehr steht, auch kein leerzeichen. Benutze eine Editor, er Dir auch die Leerzeichen anzeigt.

Ausserdem wird explizit zwischen normalem Text und HTML Inhalt unterschieden.
Warum? Weil das extrahieren des Textes aus dem HTML code mittels "strip_tags" gerade bei z.b Tabellenkonstrukten eine sehr unschöne bis nicht mehr lesbare Ausgabe erzeugt.

Ausserdem hast Du noch die Wahl, ob Du CC oder BCC Empfänger belieferen willst(bsp. Newsletter o.ä[<- kein SPAM]).

hier noch die Lösung wie Du mehre Empfänger adressieren kannst, die aus irgend einem "Speicher" kommen.
Code: Select all
$bccEmpfArray = array(
 "asdfadf@blah.de",
 "asdfadf@blah.de",
 "asdfadf@blah.de"
 );

// initialisiere "$bccEmpf" String
$bccEmpf ="";
for($i=0;$i<count($bccEmpfArray);$i++):
  $bccEmpf .= $ccEmpfArray[$i].",";
endfor;
// Alle ccEmpfänger per Kommata getrennt ** letztes Kommata entfernt
$bccEmpf = ereg_replace(",$","",$bccEmpf);

//
// [....]
//

 $konf['bcc_Empfaenger']   = $bccEmpf;


Mit den "ccEmpfänger" machst Du das analog. Musst es nicht benutzen.

Genug der Worte, hier der Quelltext. Müsste eigentlich sofort funktionieren. Wenn nicht, meld Dich einfach

Code: Select all
<?PHP
//Funktion sende_mail
function sende_mail($AbsName,$AbsMail,$Betreff,$Empfaenger,$cc,$bcc,$TEXT,$HTML)
{
/**
 * Initialisiere  Kopfzeilen der Mail
 */
 $KopfZeile = "Return-Path: <".$AbsMail.">\n";
 $KopfZeile = "From: ".$AbsName." <".$AbsMail.">\n";

/**
 * Wenn Empfänger für Kopie oder Blindkopie angegeben, dann schreibe die
 * passenden Kopfzeilen
 */
 if(!empty($cc))
 $KopfZeile .= "cc: ".$cc."\n";
 if(!empty($bcc))
 $KopfZeile .= "bcc: ".$bcc."\n";

/**
 * Generiere einen Boundary ** Abgrenzung der Inhalte
 * Bestimme den MIME Typ des Inhaltes
 */
 $boundary = strtoupper(md5(uniqid(time())));
 $KopfZeile .= "MIME-Version: 1.0\n";
 $KopfZeile .= "Content-Type: multipart/alternative; boundary=".$boundary."\n";

/**
 * Schreibe den Mailinhalt
 */
 // Textteil
 $KopfZeile .= "--".$boundary."\n";
 $KopfZeile .= "Content-Type: text/plain\n";
 $KopfZeile .= "Content-Transfer-Encoding: 8bit\n\n";
 $KopfZeile .= $TEXT."\n";
 // HTMLteil
 $KopfZeile .= "--".$boundary."\n";
 $KopfZeile .= "Content-Type: text/html; charset=iso-8859-1\n";
 $KopfZeile .= "Content-Transfer-Encoding: 8bit\n\n";
 $KopfZeile .= $HTML;
 $KopfZeile .= "\n--".$boundary."--";

/**
 * Alle Kopfzeilen da, sende die Mail.
 * Prüfe, ob der versand erfolgreich.
 */
 if(@mail($Empfaenger,$Betreff,"",$KopfZeile)):
   return true;
 else:
   return false;
 endif;
}
/***** ENDE function sende_mail($AbsName,$AbsMail,$Betreff,$Empfaenger,$cc,$bcc,$TEXT,$HTML) ****/

/**
 * Wenn Du mehrer mails(kein Spam) verschicken willst, nimm Deine eigene
 * Emailadresse als Hauptempfänger und die anderen als bbc_Empfänger.
 * WARUM? -> http://www.trollpress.de/bcc/
 */
 $konf['AbsenderName']    = "TTP";
 $konf['AbsenderAdresse'] = "";
 $konf['Betreff']         = "Neues von TTP";
 $konf['Empfaenger']      = "";

/**
 * Mehrer Empfänger mit Kommata separieren
 * z.B $konf['bccEmpfaenger'] = "empf@enger.de, undnoch@einer.de, usw@etc.de";
 * Nach dem letzten Eintrag darf keine Komma mehr stehen.
 */
 $konf['cc_Empfaenger']   = "";
 $konf['bcc_Empfaenger']  = "";

/**
 * Meldungen
 */
 $konf['MailErfolg']     = "Email erfolgreich verschickt.";
 $konf['MailMisserfolg'] = "Es gab einen Fehler beim versenden!";

/**
 * Inhalt der Mail bestimmen.
 */

 //  Text Inhalt
 $konf['Inhalt_TEXT'] =
<<<TEXT

Thema 1
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
  nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
  Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
  suscipit lobortis nisl ut aliquip ex ea commodo consequat.

Link zum Thema 1 -> http://domäne.tld

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Thema 2
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
  nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
  Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
  suscipit lobortis nisl ut aliquip ex ea commodo consequat.

Link zum Thema 2 -> http://domäne.tld

TEXT;
/******* TEXT ENDE ******************************/

// HTML Inhalt
 $konf['Inhalt_HTML'] =
<<<HTML

<html>
<head>
   <title>Lecker Wurst</title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
body,td,a{
  background-color:#ffffcc;
  color:#3399cc;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 12px;
}
</style>
</head>
<body>

<table border="1" cellpadding="5" cellspacing="0">
<tr>
  <td style="width:120px;vertical-align:top;">
     <strong>Thema 1</strong>
     <br>
      <br>
     <a href="http://schwaademaache.de">LinkzumThema 1</a>
      <br>
      <br>
      <img src="http://schwaademaache.de/wirschd/schwaademaache.jpg" alt="Lecker" width="100">
    <br>
      Bild zum Thema
   </td>
  <td style="width:350px;vertical-align:top;">
     Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
   </td>
</tr>
<tr>
  <td style="width:120px;vertical-align:top;">
     <strong>Thema 2</strong>
      <br>
      <br>
     <a href="http://schwaademaache.de">LinkzumThema 2</a>
  </td>
  <td style="width:350px;vertical-align:top;">
      Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
   </td>
</tr>
</table>
</body>
</html>

HTML;
/******* HTML ENDE ******************************/
// ENDE Konfiguration
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
   <title>e-Mails verschicken</title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>


<?PHP
/**
 * Rufe die Funktion auf, und prüfe gleichzeitig ob sie erfolgreich war.
 */
 if (sende_mail(
               $konf['AbsenderName'],
               $konf['AbsenderAdresse'],
                      $konf['Betreff'],
                      $konf['Empfaenger'],
                      $konf['cc_Empfaenger'],
                      $konf['bcc_Empfaenger'],
                    $konf['Inhalt_TEXT'],
                      $konf['Inhalt_HTML']
                      ) == true ):
   echo $konf['MailErfolg'];
 else:
   echo $konf['MailMisserfolg'];
 endif;
?>


</body>
</html>


Hoffe es hilft.

beste Grüße
Stefan

PS: Ach ja, Du hast es schon gelesen, wenn Du mit Deiner lokalen Kiste was verschicken willst, wird die Post von vielen relays vermutlich abgelehnt, da die als Absender "wwwrun@localhost" o.ä nicht akzeptieren.
hast Du eine Subdomäne bei z.B dyndns.org, gib Deinem Server diesen Namen. z.B "ttp.dyndns.org" richte Dir einen User/Postfach in Sendmail ein, und schon kannste als "ttp@ttp.dnydns.org" mails versenden und empfangen. Im Mailclient musste halt die Einstellungen "localhost POP/smtp" verwenden. Ich kanns jetzt nicht definitv sagen, aber bei mir funktioniert das auf alle Fälle schon zwei Jahrs so.
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby TTP » 14. January 2004 16:39

hmm
Code: Select all
Parse error: parse error in /home/www/web40/html/test/xmail.php on line 85


85 <<<TEXT

muss das nicht <<<FORMULAR heißen?


PS: hab die 2.te Seite übersehen *todlach*
User avatar
TTP
 
Posts: 310
Joined: 30. August 2003 19:38
Location: Wolfsburg

Postby Stefan » 14. January 2004 16:52

Sehr merkwürdig, hab grad auch nochmal probiert und es funktioniert??

Du darfs wie geschrieben keine Zeichen mehr in diese Zeile haben.
Auch keine Leerzeichen. Lösche alles in der Zeile hinter <<<TEXT weg.

Ja, es kann auch "<<<FORMULAR" heissen, wie Du willst. Musst nur aufpassen, das Du dann auch mit "FORMULAR;" den "Block" wieder zumachst.

Gruss
Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby TTP » 14. January 2004 20:23

bei mir gehts irgendwie nicht, läuft dein server auch im safe-mode?
User avatar
TTP
 
Posts: 310
Joined: 30. August 2003 19:38
Location: Wolfsburg

Postby TTP » 14. January 2004 20:28

ich habs =))

Code: Select all
<?PHP
//Funktion sende_mail
function sende_mail($AbsName,$AbsMail,$Betreff,$Empfaenger,$cc,$bcc,$TEXT,$HTML)
{
/**
 * Initialisiere  Kopfzeilen der Mail
 */
 $KopfZeile = "Return-Path: <".$AbsMail.">\n";
 $KopfZeile = "From: ".$AbsName." <".$AbsMail.">\n";

/**
 * Wenn Empfänger für Kopie oder Blindkopie angegeben, dann schreibe die
 * passenden Kopfzeilen
 */
 if(!empty($cc))
 $KopfZeile .= "cc: ".$cc."\n";
 if(!empty($bcc))
 $KopfZeile .= "bcc: ".$bcc."\n";

/**
 * Generiere einen Boundary ** Abgrenzung der Inhalte
 * Bestimme den MIME Typ des Inhaltes
 */
 $boundary = strtoupper(md5(uniqid(time())));
 $KopfZeile .= "MIME-Version: 1.0\n";
 $KopfZeile .= "Content-Type: multipart/alternative; boundary=".$boundary."\n";

/**
 * Schreibe den Mailinhalt
 */
 // Textteil
 $KopfZeile .= "--".$boundary."\n";
 $KopfZeile .= "Content-Type: text/plain\n";
 $KopfZeile .= "Content-Transfer-Encoding: 8bit\n\n";
 $KopfZeile .= $TEXT."\n";
 // HTMLteil
 $KopfZeile .= "--".$boundary."\n";
 $KopfZeile .= "Content-Type: text/html; charset=iso-8859-1\n";
 $KopfZeile .= "Content-Transfer-Encoding: 8bit\n\n";
 $KopfZeile .= $HTML;
 $KopfZeile .= "\n--".$boundary."--";

/**
 * Alle Kopfzeilen da, sende die Mail.
 * Prüfe, ob der versand erfolgreich.
 */
 if(@mail($Empfaenger,$Betreff,"",$KopfZeile)):
   return true;
 else:
   return false;
 endif;
}
/***** ENDE function sende_mail($AbsName,$AbsMail,$Betreff,$Empfaenger,$cc,$bcc,$TEXT,$HTML) ****/

/**
 * Wenn Du mehrer mails(kein Spam) verschicken willst, nimm Deine eigene
 * Emailadresse als Hauptempfänger und die anderen als bbc_Empfänger.
 * WARUM? -> http://www.trollpress.de/bcc/
 */
 $konf['AbsenderName']    = "";
 $konf['AbsenderAdresse'] = "";
 $konf['Betreff']         = "";
 $konf['Empfaenger']      = "";

/**
 * Mehrer Empfänger mit Kommata separieren
 * z.B $konf['bccEmpfaenger'] = "empf@enger.de, undnoch@einer.de, usw@etc.de";
 * Nach dem letzten Eintrag darf keine Komma mehr stehen.
 */
 $konf['cc_Empfaenger']   = "";
 $konf['bcc_Empfaenger']  = "";

/**
 * Meldungen
 */
 $konf['MailErfolg']     = "Email erfolgreich verschickt.";
 $konf['MailMisserfolg'] = "Es gab einen Fehler beim versenden!";

/**
 * Inhalt der Mail bestimmen.
 */

 //  Text Inhalt
 $konf['Inhalt_TEXT'] =
<<<FORMULAR

Thema 1
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
  nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
  Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
  suscipit lobortis nisl ut aliquip ex ea commodo consequat.

Link zum Thema 1 -> http://domäne.tld

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Thema 2
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
  nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
  Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
  suscipit lobortis nisl ut aliquip ex ea commodo consequat.

Link zum Thema 2 -> http://domäne.tld

FORMULAR;
/******* TEXT ENDE ******************************/

// HTML Inhalt
 $konf["Inhalt_HTML"] =
<<<FORMULAR

<html>
<head>
   <title>Lecker Wurst</title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
body,td,a{
  background-color:#ffffcc;
  color:#3399cc;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 12px;
}
</style>
</head>
<body>

<table border="1" cellpadding="5" cellspacing="0">
<tr>
  <td style="width:120px;vertical-align:top;">
     <strong>Thema 1</strong>
     <br>
      <br>
     <a href="http://schwaademaache.de">LinkzumThema 1</a>
      <br>
      <br>
      <img src="http://schwaademaache.de/wirschd/schwaademaache.jpg" alt="Lecker" width="100">
    <br>
      Bild zum Thema
   </td>
  <td style="width:350px;vertical-align:top;">
     Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
   </td>
</tr>
<tr>
  <td style="width:120px;vertical-align:top;">
     <strong>Thema 2</strong>
      <br>
      <br>
     <a href="http://schwaademaache.de">LinkzumThema 2</a>
  </td>
  <td style="width:350px;vertical-align:top;">
      Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
   </td>
</tr>
</table>
</body>
</html>

FORMULAR;
/******* HTML ENDE ******************************/
// ENDE Konfiguration
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
   <title>e-Mails verschicken</title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>


<?PHP
/**
 * Rufe die Funktion auf, und prüfe gleichzeitig ob sie erfolgreich war.
 */
 if (sende_mail(
               $konf['AbsenderName'],
               $konf['AbsenderAdresse'],
                      $konf['Betreff'],
                      $konf['Empfaenger'],
                      $konf['cc_Empfaenger'],
                      $konf['bcc_Empfaenger'],
                    $konf['Inhalt_TEXT'],
                      $konf['Inhalt_HTML']
                      ) == true ):
   echo $konf['MailErfolg'];
 else:
   echo $konf['MailMisserfolg'];
 endif;
?>


</body>
</html>


3 kleine änderungen und schon *hrhr*

DANKE NOCHMAL AN ALLE!
User avatar
TTP
 
Posts: 310
Joined: 30. August 2003 19:38
Location: Wolfsburg

Postby Stefan » 15. January 2004 10:24

Morsche,

Du brauchst einen Mailclient(Emailprogramm), der Dir die Wahl lässt, ob HTML Inhalte gezeigte werden sollen oder nicht. Ich hab Outlook schon seit Jahren nicht mehr, deshalb kann ich auch garnicht sagen ob Dir Outlook mittlerweile dies bietet. Ist vermutlich 'ne Einstellungssache.
Ich benutzen AK-mail. Standardamässig bekomme ich nur Text angezeigt.
Bei reinen HTML Mails, die gar keinen Textteil haben bekomme ich den HTML Quelltext zu sehen. Bei solchen Mail wie Du sie nun verschickst, kann ich mir die HTML Ansicht "zuschalten" ansonsten sehe ich nur den Textteil.
AK-Mail hat eine wunderbare Thread-Ansicht, aber auch Schwächen, z.B das die HTML Ansicht den IE benutzt.

Vielleicht würde Dir Foxmail gefallen, sieht modern aus und bietet ebenfalls eine Wahl zwischen HTML und TEXT Ansicht. Ebenfalls gibt es dort wie auch in AK-Mail eine Funktion, die es erlaubt Dein Postfach auf dem Server einzusehen und z.B Spam gleich dort zu löschen ohne diese erste herunterzuladen. Bezüglich Spam bietet Foxmail auch einiges an schlaunen Filtern.

Deutsche Fassung des aktuellen foxmail:
http://home.arcor.de/_foxmail/foxmail_d ... 0final.exe

Es gibt noch tausend andere Mailclients. Manche schwören z.B auf "the Bat" und wieder andere finden "Eudora" oder "Pegasus" genial.
Am besten Du hörst mal rum, was die Leute so benutzen und wie sie damit zufrieden sind. Oder probierts selbst mal aus was Dir am besten "reingeht".

beste Grüße
Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Previous

Return to PHP

Who is online

Users browsing this forum: No registered users and 4 guests