Werbung einblenden Werbung ausblenden


Home / Tutorials / PHP Handbuch / Mail versenden mit PHP


Mail versenden mit PHP
e-Mail mit blind carbon copies (BCC)
Das gleiche Mail an mehrere Empfänger schicken
Mails über einen smtp Server im Netz verschicken
HTML-email verschicken
Email mit Attachement verschicken
Mehrere Dateien als Attachement verschicken
HTML-Mails mit inline Images verschicken

Mail versenden mit PHP

Beim Versenden von mail aus einem HTML Formular heraus, sind unterschiedliche Szenarien zu unterscheiden. Mail kann entweder von dem eigenen, lokalen Rechner verschickt werden, oder von dem Rechner eines Internetproviders. Die erste Situation hat man zum Beispiel, wenn man einen Skript schreibt und testen will, ob er überhaubt funktionniert (weitere Möglichkeit: Man ist selber Provider). Verschickt man Mail von einem Provider aus, ist die Angelegenheit easy and straightforward, da sendmail, auf das PHP im Default, wenn man nichts an der php.ini ändert, zugreift, in dieser Situation schon komplett konfiguriert ist. Zweitens geht es um die Frage, was das Mail genau beinhaltet. Soll die Möglichkeit attachements anzufügen zur Verfügung stehen, sollen reine Text-emails oder HTML-emails verschickt werden, sollen HTML-emails mit Bildern verschickt werden, an wieviele Absender soll das email verschickt werden etc. etc. Beginnen wir mit dem einfachsten Fall. Ein reines Text-email verschicken, wenn der PHP Skript, der es verschickt bei einem Provider liegt. Um überhaupt ein Mail aus einem HTML Formular heraus verschicken zu können, brauchen wir erst mal ein HTML Formular.

<html><head><title>Mail verschicken mit PHP </title></head>
<body>
<form action=maili.php4>
<table>
<tr><td>Nachname</td><td><input type=text name=Nachname></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vorname></td></tr>
<tr><td>Beruf</td><td><input type=text name=Beruf></td></tr>
<tr><td>Telefon</td><td><input type=text name=Telefon></td></tr>
<tr><td>email</td><td><input type=text name=mailaddi></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="abschicken"></td></tr>
</table>
</form>
</body>
</html>

So sieht das Formular dann aus: zeigen Der Skript, der es verschickt, sieht dann einfach so aus:

<?
$mail_empfaenger="infos@infos24.de";
$mail_absender=$mailaddi;
$betreff="Eine Testmail";
$text="Mein Name ist $Vorname $Nachname, von Beruf bin ich $Beruf.
Rufen Sie mich mal an unter der Nummer $Telefon. \n Mit freundlichen Grüssen";
mail($mail_empfaenger, $betreff, $text,"from:$mail_absender");
?>

Man braucht jetzt einen Provider, wo man diesen Skript testen kann. Wir werden einen solchen Testaccount in Kürze zur Verfügung stellen.

e-Mail mit blind carbon copies (BCC)

Will man ein mail an mehrere Empfänger gleichzeitig verschicken, kann man das machen, indem man weitere blind carbon copies (BCC) angibt. Das sieht dann so aus:

<?
mail("Andres_Ehmann@infos24.de",
"Test mit blind carbon copy",
"Man kann auch mehrere emails auf einen Hops verschicken.",
"Bcc: infos@infos24.de\r\nBcc:regionalportal@infos24.de\r\nfrom:schulungen@infos24.de\r\n");
print "email wurde verschickt";
?>

Man bedenke, dass die mail-Funktion nur vier Parameter hat und folglich alles was optional ist in diesem letzten unterzubringen ist. Blind carbon copys haben den unbestechlichen Charme, dass nicht alle Leute, an die das email verschickt wurde, oben aufgelistet sind. Andererseits kann man auch den Standpunkt vertreten, dass das für den Empfänger ein bisschen verblüffend ist. Er sieht als Empfänger eine email Adresse, die nicht seine eigene ist. Es macht also unter Umständen, wenn sich der Benutzerkreis, an den man das mail schickt, nicht kennt, durchaus Sinn, alle Empfänger der mail oben aufzulisten. Das sieht dann so aus:

<?
mail("Andres_Ehmann@infos24.de,infos@infos24.de,miguelin@freenet.de",
"Mails an mehrere Absender schicken",
"Man kann auch mehrere emails auf einen Hops verschicken.",
"from:schulungen@infos24.de\r\n");
print "email wurde verschickt";
?>

Das gleiche Mail an mehrere Empfänger schicken

Diese Variante wiederum hat auch einen Nachteil, sie ist ziemlich langsam. Will man also das gleiche mail an mehrere Empfänger schicken und will man, dass in der Empfänger oben seine eigene mail sieht, dann kann man auch sowas machen:

<?
$email_adressen="Andres_Ehmann@web.de||infos@infos24.de||
Andres_Ehmann@infos@infos24.de||schulungen@infos24.de";
$emails_in_array=explode("||",$email_adressen);

foreach($emails_in_array as $email)
{
mail($email,"Na du Gurke, kriegste auch mal Post","Hallo !
wir haben dich nicht vergessen","from:dein_engel@himmelreich.de\r\n");
print "Mail an $email wurde verschickt <br>";
}
?>

Das scheint ziemlich schnell zu gehen, zumindest haben wir damit auch bei Massenmails, mehr als 2000, noch keine schlechten Erfahrungen gemacht.

Mails über einen smtp Server im Netz verschicken

Bei allen Skripten bisher wurde davon ausgegangen, dass das Umfeld, also sendmail und der smtp-Server steht. Oft will man aber lediglich lokal testen, ob es überhaupt funktionniert. In diesem Falle ist die php.ini im Verzeichnis Windows folgendermassen anzupassen.

[Syslog]
; Whether or not to define the various syslog variables (e.g. $LOG_PID,
; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In
; runtime, you can define these variables by calling define_syslog_variables().
<B>define_syslog_variables = Off</B>

[mail function]
; For Win32 only.
<B>SMTP = mx.freenet.de</B>

; For Win32 only.
<B>sendmail_from =hopsala@freenet.de</B>

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =

Bei SMTP muss ein SMTP Server stehen, auf den man Zugriff hat, bei dem man also eine Email Adresse hat. Diese muss dann unter sendmail_from eingetragen werden. In der Regel hat man ja sowas, weil jeder Internet Zugangs Provider es zur Verfügung stellt. Nachdem man die php.ini korrigiert hat, kann man mit diesem Skript ausprobieren, ob es tatsächlich funktioniert. Diesen Skript muss man dann in die Document Root des HTTP Servers legen, den man vorher sinnigerweise hochfährt.

<?
$email_adressen="Andres_Ehmann@web.de||infos@infos24.de||
Andres_Ehmann@web.de||infos@infos24.de||schulungen@infos24.de";
$emails_in_array=explode("||",$email_adressen);

foreach($emails_in_array as $email)
{
chop($email);
mail($email,"Na du Gurke, kriegste auch mal Post",
"Hallo ! wir haben dich nicht vergessen");
print "Mail an $email wurde verschickt <br>";
}
?>

Den Skript kann man dann aufrufen mit http://127.0.0.1/irgendein_name.php. Die email-Adressen sollte man ändern, sonst kriegt man nämlich keine mails.

HTML-email verschicken

Verschickt einen Newsletter, Rundschreiben an Kunden, eine Zeitung etc. dann macht das unter Umständen mehr her, wenn man es im HTML-Format verschickt, weil dann die gestalterischen Möglichkeiten wesentlich größer sind. Wie es geht, zeigen wir anhand des Formulars, das wir oben schon hatten.

<html><head><title>Mail verschicken mit PHP </title></head>
<body>
<form action=maili.php4>
<table>
<tr><td>Nachname</td><td><input type=text name=Nachname></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vorname></td></tr>
<tr><td>Beruf</td><td><input type=text name=Beruf></td></tr>
<tr><td>Telefon</td><td><input type=text name=Telefon></td></tr>
<tr><td>email</td><td><input type=text name=mailaddi></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="abschicken"></td></tr>
</table>
</form>
</body>
</html>

Will man das als HTML Mail verschicken, sieht das so aus:

<?
$mail_empfaenger="infos@infos24.de";
$mail_absender=$mailaddi;
$betreff="Eine Testmail";
$text="
<html><head><title>Test></title></head>
<body>
<table border=5>
<tr><td bcgolor=blue>Name</td><td bgcolor=red>$Vorname $Nachname</td></tr>
<tr><td bgcolor=yellow> Beruf</td><td bgcolor=green>$Beruf</td></tr>
<tr><td>Telefon</td><td>$Telefon</td></tr>
<tr><td colspan=2>Mit freundlichen Grüssen</td></tr>
</table>";
</body>
</html>
mail($mail_empfaenger, $betreff, $text,"from:$mail_absender\r\
nContent-Type:text/html\r\nContent-Transfer-Encoding: 8bit\r\n");
print "email wurde verschickt";
?>

Es ist also nicht viel zu ändern. Anzugeben ist lediglich, dass sich der Content-Type geändert hat.

Email mit Attachement verschicken


Schwieriger wird es, wenn mit dem email ein Attachement (Anhang) verschickt werden soll. Man braucht dann erstmal ein HTML-Formular, wo man ein Bild aussuchen kann.

<html><head><title>Mail verschicken mit PHP </title></head>
<body>
<form action=maili.php enctype=multipart/form-data method=post>
<table>
<tr><td>Nachname</td><td><input type=text name=Nachname></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vorname></td></tr>
<tr><td>Beruf</td><td><input type=text name=Beruf></td></tr>
<tr><td>Telefon</td><td><input type=text name=Telefon></td></tr>
<tr><td>email</td><td><input type=text name=mailaddi></td></tr>
<tr><td colspan=2><input type=file name=datei></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="abschicken"></td></tr>
</table></form>
</body>
</html>

Das Formular sieht dann so aus: zeigen
Hinsichtlich des Attributs enctype=multipart/form-data und dem Tag

<input type=file name=datei>

siehe Formulareingaben auswerten/Bildupload. Ein Skript, mit dem man das Bild dann versenden kann sieht dann so aus:

<?
$grenze="grenzlinie";
$name_des_bildes=$HTTP_POST_FILES['datei']['name'];
$headers ="MIME-Version: 1.0\r\n";
$headers.="From: $mailaddi\n";
$headers.="Content-Type: multipart/mixed;\n\tboundary=$grenze\n";
$botschaft<I></I>="\n--$grenze\n";
$botschaft.="Content-transfer-encoding: 7BIT\r\n";
$botschaft.="Content-type: text/plain\n\n";
$botschaft.= "Guten Tag $Vorname $Nachname. $Beruf ist ein schöner Beruf.
Wir werden uns in Kürze unter der genannten Rufnummer
$Telefon mit Ihnen in Verbindung setzen. \n";
$botschaft.="\n\n";
$botschaft.="\n--$grenze\n";
$botschaft.="Content-Type: application/octetstream;\n\tname=$name_des_bildes\n";
$botschaft.="Content-Transfer-Encoding: base64\n";
$botschaft.="Content-Disposition: attachment;\n\tfilename=$name_des_bildes\n\n";
$zeiger_auf_datei=fopen("$datei","rb");
$inhalt_der_datei=fread($zeiger_auf_datei,filesize("$datei"));
fclose($zeiger_auf_datei);
$inhalt_der_datei=chunk_split(base64_encode($inhalt_der_datei));
$botschaft.=$inhalt_der_datei;
$botschaft.="\n\n";
$botschaft.="--$grenze";
mail("Andres_Ehmann@web.de","test mit attachements",$botschaft,$headers);
print "email wurde versandt";
?>

Die Komplexität dieses Skriptes ergibt sich aus der Tatsache, dass wir innerhalb der email zwei verschieden Bereiche haben. Einmal den Text und zum anderen das Bild. Jeder dieser Bereiche muss vom anderen abgegrenzt werden und jeder dieser Bereiche hat seine eigenen Header. Dass das email aus unterschiedlichen Bereichen besteht, teilen wir dem empfangenden Client in der Zeile

$headers ="MIME-Version: 1.0\r\n";

mit. MIME (Multipurpose Internet Mail Extensions) zeigt dem Client an, dass das mail aus mehreren, unterschiedlich zu interpretierenden Bereichen besteht. In der nächsten Zeile teilen wir dem Client mit, dass die Bereiche willkürlich gemixt sind und weiter teilen wir ihm noch mit, wie die Zeichenkette aussieht, die den einen Bereich vom anderen trennt. Das sieht dann so aus.

$headers.="Content-Type: multipart/mixed;\n\tboundary=$grenze\n";

Unsere Grenze heisst sinnigerweise grenzlinie. Diese Grenze, mit den zwei vorangestellten Bindestrichen setzen wir vor jeden neuen Abschnitt, so dass der email Client erkennt, wenn ein neuer Abschnitt anfängt. Nach der Grenze teilen wir dem Client mit, wie die Daten übertragen werden (Content-Transfer) und um welchen Typ von Daten es sich handelt (Content-Type). Bei Bildern muss man noch Content-Disposition angeben, weil sie ja nicht immer im Body stehen. Die mittels

<input type=file name=datei>

übertragene Datei haben wir im Kapitel Formulareingaben auswerten/Bildupload auf der Festplatte gespeichert. Was wir hier machen kann im ersten Moment verwirrend sein. Wenn man sich aber klar macht, dass eine Datei, die upgeloadet wurde, in einem temporären Verzeichnis abgelegt wird, so sieht man sofort, dass sie ganz normal, wie unter Arbeiten mit Flatfile Datenbanken beschrieben, in eine Variable eingelesen werden kann.

$zeiger_auf_datei=fopen("$datei","rb");
$inhalt_der_datei=fread($zeiger_auf_datei,filesize("$datei"));
fclose($zeiger_auf_datei);

Über das rb können wir uns wundern, es ist aber notwendig, weil es sich bei der Datei um ein Bild handelt, dass im binary Modus eingelesen werden muss. Richtig verblüffend ist die Zeile

$inhalt_der_datei=chunk_split(base64_encode($inhalt_der_datei));

Sie konvertiert das Bild in eine Datei aus lauter Buchstaben und Zahlen. Dies ist notwendig, da das smtp Protokoll textbasiert ist und nur Buchstaben und Zahlen akzeptiert werden. Der email-Client muss dies wieder rückgäng machen, damit das Bild dargestellt werden kann. Er muss also wissen, was das ist, was da ankommt. Dies haben wir ihm aber in der Zeile

$botschaft.="Content-Transfer-Encoding: base64\n";

bereits mitgeteilt. Alle Informationen, mit Aussnahme der Header Informationen, speichern wir ab in der Variable $Botschaft.

Mehrere Dateien als Attachement verschicken

Will man die Möglichkeit bieten, mehrere Bilder auf einen Hops via email zu versenden, so braucht man erstmal ein anderes HTML Formular.

<html><head><title>Mail verschicken mit PHP </title></head>
<body>
<table>
<form action=maili.php enctype=multipart/form-data method=post>
<table>
<tr><td>Nachname</td><td><input type=text name=Nachname></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vorname></td></tr>
<tr><td>Beruf</td><td><input type=text name=Beruf></td></tr>
<tr><td>Telefon</td><td><input type=text name=Telefon> </td></tr>
<tr><td>email</td><td><input type=text name=mailaddi></td></tr>
<tr><td colspan=2><input type=file name=datei[]></td></tr>
<tr><td colspan=2><input type=file name=datei[]></td></tr>
<tr><td colspan=2><input type=file name=datei[]></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="abschicken"></td></tr>
</table>
</form>
</body></html>

welches dann so aussieht: zeigen
Wie man grundsätzlich mehrere Dateien auf einen Hops auf einen Fremdrechner uploadet, siehe Formulareingaben auswerten/Bildupload. Der PHP Skript, mit dem man dann diese drei Bilder auf einen Husch verschicken kann sieht dann so aus:

<?
$dateienname=array();
foreach($datei_name as $himbeere)
{
array_push($dateienname,$himbeere);
}
$grenze="grenzlinie";
$name_des_bildes=$HTTP_POST_FILES['datei']['name'];

$headers ="MIME-Version: 1.0\r\n";
$headers.="From: $mailaddi\n";
$headers.="Content-Type: multipart/mixed;\n\tboundary=$grenze\n";
$botschaft="\n--$grenze\n";
$botschaft.="Content-transfer-encoding: 7BIT\r\n";
$botschaft.="Content-type: text/plain\n\n";
$botschaft.= "Guten Tag $Vorname $Nachname.
$Beruf ist ein schöner Beruf. Wir werden uns in Kürze
unter der genannten Rufnummer $Telefon mit Ihnen in Verbindung setzen. \n";
$botschaft.="\n\n";
for ($i=0;$i<count($datei);$i++)
{
$botschaft.="\n--$grenze\n";
$botschaft.="Content-Type: application/octetstream;\n\tname=".$dateienname[$i]."\n";
$botschaft.="Content-Transfer-Encoding: base64\n";
$botschaft.="Content-Disposition: attachment;\n\tfilename=".$dateienname[$i]."\n\n";
print $datei[$i]."<br>";
$zeiger_auf_datei=fopen($datei[$i],"rb");
$inhalt_der_datei=fread($zeiger_auf_datei,filesize($datei[$i]));
fclose($zeiger_auf_datei);
$inhalt_der_datei=chunk_split(base64_encode($inhalt_der_datei));
$botschaft.=$inhalt_der_datei;
$botschaft.="\n\n";
}
$botschaft.="--$grenze";
mail("miguelin@arcor.de","test mit attachements",$botschaft,$headers);
print "email wurde versandt";
?>

Die Vorgehensweise ist also recht simpel, man lässt einfach den Bereich mit dem Bild so oft laufen, wie Bilder da sind. Komplexere emails zu verschicken ist eine heikle, fehleranfällige Angelegenheit. Wenn etwas schief gelaufen ist, kann es hilfreich sein, sich genau anzuschauen, was angekommen ist. Bei Outlook tut man das in dem das email aufmacht, dann Datei-> Eigenschaften-> Details. Dann hat man die Möglichkeit Quelltext zu wählen.
Für das Beispiel oben erhält man dann das hier.


Return-path: <galigula@freenet.de>
Delivery-date: Wed, 11 Dec 2002 01:21:59 +0100
Received: from [194.97.55.148] (helo=mx5.freenet.de)
by mbox45.freenet.de with asmtp (ID exim) (Exim 4.10 #1)
id 18LudS-0007hq-00
for galigula@01019freenet.de; Wed, 11 Dec 2002 01:21:58 +0100
Received: from b3d18.pppool.de ([213.7.61.24] helo=shokufeh)
by mx5.freenet.de with smtp (Exim 4.10 #1)
id 18LudQ-0003Ww-00
for galigula@freenet.de; Wed, 11 Dec 2002 01:21:56 +0100
Date: Wed, 11 Dec 2002 01:19:11 +0100
Subject: test mit attachements
To: galigula@freenet.de
MIME-Version: 1.0
From: Andres_Ehmann@web.de
Content-Type: multipart/mixed;
boundary=grenzlinie
Message-Id: <E18LudQ-0003Ww-00@mx5.freenet.de>
Delivered-To: miguelin@freenet.de
Envelope-to: miguelin@freenet.de

--grenzlinie
Content-transfer-encoding: 7BIT
Content-type: text/plain

Guten Tag Andres Andres Ehmann. Diplom Volkswirt ist ein schöner Beruf. Wir werden uns in Kürze unter der genannten Rufnummer 030/47301390 mit Ihnen in Verbindung setzen.

--grenzlinie
Content-Type: application/octetstream;
name=bkein.jpg
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=bkein.jpg

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYF
BgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoK
CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAqAHUDASIA
etc.


--grenzlinie
Content-Type: application/octetstream;
name=afg.jpg
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=afg.jpg

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYF
BgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoK
etc.

--grenzlinie
Content-Type: application/octetstream;
name=maily.gif
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=maily.gif

R0lGODlhegAsALMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/
/////yH5BAEAAA8ALAAAAAB6ACwAAAT+8MlJq7046827/2AojmRpnmiqruwGvDDQznQKMHguk/Fe
etc.

--grenzlinie

Im Falle des Scheiterns, kann man den Quelltext vergleichen mit einer Variante die funktionniert. Das kann helfen.
Wenn man HTML-emails verschicken will, ist die Wahrscheinlich relativ gross, dass man auch Bilder verschicken will und zwar innerhalb des bodys der email, also nicht via
<img src=http://www.wasweisich.de/bilder/banane.jpg>.

HTML-Mails mit inline Images verschicken

Das funktionniert nur, wenn eine permanenten Internetverbindung besteht. Will man sicher gehen, dass das Bild tatsächlich dargestellt wird, muss man das Bild übertragen und in die HTML Seite einbauen. Weiter müsste man bei der erstgenannten Variante das Bild erstmal ins Internet setzen, während man es bei der hier vorgestellen Variante direkt vom Desktop mitverschicken kann. Um das email mit den drei inline-Bildern zu verschicken, verwenden wir wieder das gleiche HTML Formular wie oben.

<html><head><title>Mail verschicken mit PHP </title></head>
<body>
<table>
<form action=maili.php enctype=multipart/form-data method=post>
<table>
<tr><td>Nachname</td><td><input type=text name=Nachname></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vorname></td></tr>
<tr><td>Beruf</td><td><input type=text name=Beruf></td></tr>
<tr><td>Telefon</td><td><input type=text name=Telefon> </td></tr>
<tr><td>email</td><td><input type=text name=mailaddi></td></tr>
<tr><td colspan=2><input type=file name=datei[]></td></tr>
<tr><td colspan=2><input type=file name=datei[]></td></tr>
<tr><td colspan=2><input type=file name=datei[]></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="abschicken"></td></tr>
</table>
</form>
</body></html>

Wenn wir die Bilder als Bestandteil der HTML Email haben wollen, brauchen wir ein Skript, dass so ähnlich aussieht wie dieses hier.

<?
$dateienname=array();
foreach($datei_name as $himbeere)
{
array_push($dateienname,$himbeere);
}
$grenze="grenzlinie";
$name_des_bildes=$HTTP_POST_FILES['datei']['name'];

$headers ="MIME-Version: 1.0\r\n";
$headers.="From: $mailaddi\n";
$headers.="Content-Type: multipart/related;\n\tboundary=$grenze\n";
$headers.="Content-Disposition:inline\n";
$botschaft="\n--$grenze\n";

$botschaft.="Content-Type: text/html;charset=iso-8859-1\n";
$botschaft.="Content-Transfer-Encoding: 8bit\n\n";

$botschaft.= "<html><head><title>Test</title></head><body>";
$botschaft.="<font color=red size=5>Guten Tag $Vorname $Nachname !</font><br>";
$botschaft.="Hier nochmal Ihre Bilder <br><table><tr>";
for($i=0;$i<count($datei);$i++)
{
$botschaft.="<td width=150 align=middle bcgolor=yellow>
<img src=cid:bild_$i border=5 width=120></td>";
}
$botschaft.="</tr></table><br>$Beruf ist ein schöner Beruf.
Wir werden uns in Kürze unter der genannten Rufnummer $Telefon
mit Ihnen in Verbindung setzen.";
$botschaft.="</body></html> \n";

for ($i=0;$i<count($datei);$i++)
{
$botschaft.="\n--$grenze\n";
$botschaft.="Content-Type: application/octetstream;\n\tname=".$dateienname[$i]."\n";
$botschaft.="Content-Transfer-Encoding: base64\n";
$botschaft.="Content-ID: <bild_$i>\n";

$botschaft.="Content-Disposition:inline;filename=".$dateienname[$i]."\n\n";
$zeiger_auf_datei=fopen($datei[$i],"rb");
$inhalt_der_datei=fread($zeiger_auf_datei,filesize($datei[$i]));
fclose($zeiger_auf_datei);
$inhalt_der_datei=chunk_split(base64_encode($inhalt_der_datei));
$botschaft.=$inhalt_der_datei;
}
$botschaft.="--$grenze";
mail("miguelin@arcor.de","Schöne HTML Seite mit Bildern drin",$botschaft,$headers);
print "email wurde versandt";
?>

Uns fallen jetzt zwei Dinge auf. Erstens, bei
<img src=irgendwas.jpg>
steht nicht mehr der Name des Bildes sonder sowas.
<img src=cid:bild_$i border=5 width=120>

cid ist hierbei festgeschrieben, und weist darauf hin, dass hier nicht der Bildname direkt, sondern eine Variable auf das Bild verweist. Diese Variable generieren wir an dieser Stelle.

$botschaft.="Content-ID: <bild_$i>\n";

Weiter ist im Kopf der mail ein anderer Header zu produzieren.

$headers.="Content-Type: multipart/mixed;\n\tboundary=$grenze\n";

geht nicht mehr, weil das Dokument ja nicht mehr aus Bereichen besteht, die nichts miteinander zu tun haben. Die Bilder sollen in die HTML Seite integriert werden, sind also mit dieser verzahnt. Folglich brauchen wir an dieser Stelle.

$headers.="Content-Type: multipart/related;\n\tboundary=$grenze\n";

Damit wären die wichtigsten Fälle wohl abgedeckt.

vorhergehendes Kapitel