Werbung einblenden Werbung ausblenden


Home / Tutorials / Perl Handbuch / Mails verschicken

über das Perl Modul Mail::sender:

eine Email verschicken
eine Email mit Attachment verschicken
eine HTML Datei als Email verschicken
eine HTML Datei mit Bildern als Email verschicken
eine Email direkt aus einem HTML Formular auslösen
eine Email mit Bildern direkt aus einem HTML Formular auslösen

über Sendmail:

eine Email verschicken
eine Email mit Bild verschicken
eine Email mit mehreren Bildern verschicken
eine HTML Datei als Email verschicken

über Mail::sender eine Email verschicken

Mails müssen aus verschiedenen Gründen aus unterschiedlichen Konstellationen heraus verschickt werden.
Der einfachste Fall ist ein HTML Formular, dass die Eingaben des Users direkt an eine Email Adresse schickt. Denkbar ist zum Beispiel aber auch, dass Email Adressen aus einer Datenbank heraus verschickt werden, z.B. bei einem Newsletter. Darüber hinaus können Emails im Ascii Format oder als HTML Datei verschickt werden. Weiterhin besteht noch das Problem, dass Emails auch Attachements haben können.

Emails können über Sendmail verschickt werden oder über das Perl Modul Mail::sender.
Das Perl Modul Mail::sender scheint das leistungsfähigste Modul zu sein, weil damit auch Attachments verschickt werden können.
Das Modul kann hier runter geladen werden. Wie es installiert wird, siehe Arbeiten mit Modulen.
Es folgt ein einfaches Beispiel zum Testen, bei dem keine Daten aus einem HTML Formular übernommen werden. Das Modul wurde geschrieben von Jan Krynicky Jenda@Krynicky.cz http://Jenda.Krynicky.cz.

use Mail::Sender;

$sender = new Mail::Sender
 (
	{
		from => 'schulungen@infos24.de',
		smtp => 'mx.freenet.de'
	}
 );

 $sender->MailMsg
  (
	{
		to =>'infos@infos24.de', 
		subject => 'love song',
		msg => "love is all you need tralalalala"
	}
  );

print "mail wurde verschickt";
  

Das Anwenden von mx.freenet.de ist ein Beispiel. Im Echtbetrieb muss entweder ein eigener SMTP Server oder der SMTP Server des Providers verwendet werden.
Um dieses Skript und auch alle folgenden Skripte zum Laufen zu bringen, muss eine Verbindung zum Internet bestehen.
Die Werte müssen jetzt angepasst werden:

  • bei to muss die Email Adresse des Empfängers stehen.

  • bei from muss die Email Adresse stehen, von der die Mail kommt, also die eigene Adresse.

Wie deutlich zu erkennen ist, ist auch dieses Modul, wie wohl fast alle, objektorientiert programmiert. Alle Subroutinen erhalten einen anonymous Hash als Parameter.
Wurde Mail::Sender installiert, kann dieses Skript auch von der Eingabeaufforderung (Dos Box) aus aufgerufen werden.

über Mail::sender eine Email mit Attachment verschicken

Soll ein File an dieses Email als Attachment anhängt werden, dann sieht das so aus:

use Mail::Sender;
 
$sender = new Mail::Sender
(
    {
	from => 'schulungen@infos24.de',
	smtp => 'mx.freenet.de'
     }
);

$sender->MailFile
(
  {
	to =>'infos@infos24.de',
	subject => 'Als Anhang die Dateien',
	msg => "Damit Du Dich freust, schick ich Dir jetzt zwei Bilder", 
  	file => 'kirsche.jpg,wirtschaft.jpg'
  }
);

print "Die angehängten Dateien wurden verschickt";

Auch dieses Skript kann von der Kommandoebene ausgelöst werden. Verwendet wird ein SMTP Server, irgendeinen, den man im Netz findet, im Zweifelsfalle den, den man auch sonst zum Verschicken von Emails verwendet.
Mit mx.freenet.de funktioniert das zwar, aber die Begeisterung der Freenet AG dürfte sich in Grenzen halten, wenn alle ihren SMTP Server benutzen.
ES IST ALSO NUR EIN BEISPIEL !! MAN KANN ES EINMAL AUSPROBIEREN ZUM TESTEN, ABER DANN EINEN ANDEREN SMTP SERVER SUCHEN. DIE BETONUNG LIEGT AUF "NUR EINMAL PROBIEREN!".

Auch hier muss bei from die eigene Email Adresse eingetragen werden und bei to die Empfängeradresse.
Bei den Bildern muss der komplette Pfad angegeben werden. Am einfachsten ist es, man packt sie dahin, wo auch das Skript selbst liegt.
Im Echtbetrieb will man das eigentlich nicht haben. Der User soll ja die Möglichkeit haben, aus einem HTML Formular heraus eine Datei als Email zu verschicken. Dazu muss allerdings das Bild erst mal auf den Fremdrechner übertragen werden, damit es von dort als Email verschickt werden kann. Wir kommen darauf weiter unten zurück.

über Mail::sender eine HTML Datei als Email verschicken

Wie eine HTML Email verschickt wird, zeigt das folgende Beispiel.
Die Datei, die hier verwendet wird, kann als testfile.htm hier runter geladen werden. Man kann aber auch selbst einen testfile erstellen:

use Mail::Sender;

$testfile="testfile.htm";

 open(IN, $testfile);

$sender = new Mail::Sender
	( {
		smtp => 'mx.freenet.de'
	 });
 $sender->Open
(
	{ 
		from => 'schulungen@infos24.de', 
		to => 'miguelin@freenet.de', 
		subject => 'Testseite HTML. Schön bunt',
		headers => "MIME-Version: 1.0\r\nContent-type: 
		text/html\r\nContent-Transfer-Encoding: 7bit"
	 }
) ;

 while ()
 { $sender->Send($_) };
 close(IN);
 $sender->Close();

über Mail::sender eine HTML Datei mit Bildern als Email verschicken

Auf diesem Weg können über den img HTML Tag natürlich auch Bilder eingefügt werden.
Das hat aber einen entscheidenden Nachteil. Es gibt viele Anwender, die unmittelbar nach dem Download die Verbindung beenden oder der Email Client kappt die Verbindung.
Will man also sicher gehen, dass die Bilder tatsächlich eingefügt werden, dann müssen die Bilder fest in dem HTML Quelltext verankert werden.
Das sieht dann so aus

use strict;
 use Mail::Sender;
 my $recipients = 'miguelin@freenet.de';
 my $sender = new Mail::Sender {smtp => 'mx.freenet.de'};
 if ($sender->OpenMultipart({from => 'schulungen@infos24.de', to => $recipients,
                       subject => 'Embedded Image Test', subtype => 'related',
                       boundary => 'boundary-test-1',
                       type => 'multipart/related'}) > 0) {
  $sender->SendFile(
         {description => 'html body',
         ctype => 'text/html; charset=us-ascii',
         encoding => '7bit',
         disposition => 'NONE',
         file => 'testfile2.htm'
   });
  $sender->SendFile(
   {description => 'Nürtinger Wirtschaft',
    ctype => 'image/jpg',
    encoding => 'base64',
    disposition => "inline; filename=\"wirtschaft.jpg\";\r\nContent-ID: ",
    file => 'wirtschaft.jpg'
   });
$sender->SendFile(
   {description => 'Kirschen',
    ctype => 'image/jpg',
    encoding => 'base64',
    disposition => "inline; filename=\"kirsche.jpg\";\r\nContent-ID: ",
    file => 'kirsche.jpg'
   });
  };

Manche fragen sich, wann sich die Situation, HTML Seiten mit Bildern zu verschicken, überhaupt ergibt. Richtig ist, bei einem HTML Formular, das lediglich die Eingaben des Users verschickt, ergibt sich diese Situation eher selten. Sie ergibt sich aber bei Newslettern.

über Mail::sender eine Email direkt aus einem HTML Formular auslösen

Die Skripte wurden bisher aus didaktischen Gründen so geschrieben, dass sie nicht aus einem HTML Formular angeschoben werden. Dies ist natürlich kein praktisch relevanter Fall.
Allerdings können die Skripte problemlos so verändert werden, dass sie aus einem HTML Formular heraus angeschoben werden können.
Man muss hierzu lediglich die Email Adresse des Senders, die Email Adresse des Absenders (wenn es nicht die gleiche ist), den Inhalt der Email (Text, Betreff und Bilder) durch Variablen ersetzen. Diese Variablen werden dann vom Formular übergeben.

Im Beispiel gehen wir von dem folgenden Formular aus.
Zu diesem HTML Formular gibt es nicht viel zu sagen. Bei Bedarf kann das im Kapitel Formulareingaben auswerten Gesagte noch mal verinnerlicht werden.
Das HTML Formular muss in der Document root des http Servers gespeichert werden. (z.B. c:/sambar/docs)

<html><head><title>Email verschicken</title></head><body>
<form method=get action=http://127.0.0.1/cgi-bin/maili.pl>
<table bgcolor=cococo>
<tr><td colspan=2 align=middle bgcolor=yellow>F&uuml;llen Sie bitte dieses Formular aus </td></tr>
<tr><td>Name</td><td><input type=text name=Fname size=20></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vname size=20></td></tr>
<tr><td>Strasse</td><td><input type=text name=strasse size=20></td></tr>
<tr><td>Plz Ort</td><td><input type=text name=plz size=6><input type=text name=ort
size=13>
<tr><td colspan=2 align=middle bgcolor=yellow>Telefon Fax email</td></tr>
<tr><td>Telefon</td><td><input type=text name=telefon size=20></td></tr>
<tr><td><font color=blue size=4>email</font></td><td><input type=text name=mail
size=20></td></tr>
<tr><td colspan=2 align=middle bgcolor=yellow> Kommentar</td></tr>
<tr><td colspan=2 align=middle><textarea name=comment rows=5
cols=40></textarea></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="Daten uebergeben"></td></tr>
</table>
</form></center>
</body></html>

Um dieses Formular zu verarbeiten, das heißt die Email tatsächlich zu verschicken, verwenden wir dann das folgende Skript. Es muss im cgi-bin Verzeichnis des Rechners unter maili.pl abgespeichert werden (es ist das Skript, das bei dem Form Attribut action angegeben ist).

use Mail::Sender;

use CGI qw/:standard/;

$Vname=param('Vname');
$Fname=param('Fname');
$strasse=param('strasse');
$plz=param('plz');
$telefon=param('telefon');
$mail=param('mail');
$comment=param('comment');
$ort=param('ort');

$nachricht="$comment \n $Vname $Fname \n $strasse \n $plz $ort \n \n $telefon \n\n Das ist ein Test. ";



$sender = new Mail::Sender
 (
	{
		from => 'schulungen@infos24.de',
		smtp => 'mx.freenet.de'
	}
 );

 $sender->MailMsg
  (
	{
		to =>$mail, 
		subject =>$Vname.$Fname,
		msg => $nachricht
	}
  );

print "mail wurde verschickt";
  

Wie deutlich zu erkennen ist, wurde das CGI.pm Modul verwendet.

über Mail::sender eine Email mit Bildern direkt aus einem HTML Formular auslösen

Soll dem User noch die Möglichkeit gegeben werden, an seine Nachricht ein oder zwei Bilder anzuhängen, sieht das dazugehörige HTML Formular so aus:

<html><head><title>Email verschicken</title></head><body>
<form action=http://127.0.0.1/cgi-bin/maili2.pl enctype=multipart/form-data method=post>
<table bgcolor=cococo>
<tr><td colspan=2 align=middle bgcolor=yellow>F&uuml;llen Sie bitte dieses Formular aus </td></tr>
<tr><td>Name</td><td><input type=text name=Fname size=20></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vname size=20></td></tr>
<tr><td>Strasse</td><td><input type=text name=strasse size=20></td></tr>
<tr><td>Plz Ort</td><td><input type=text name=plz size=6><input type=text name=ort size=13>
<tr><td colspan=2 align=middle bgcolor=yellow>Telefon Fax email</td></tr>
<tr><td>Telefon</td><td><input type=text name=telefon size=20></td></tr>
<tr><td><font color=blue size=4>email</font></td><td><input type=text name=mail size=20></td></tr>
<tr><td colspan=2 align=middle bgcolor=yellow> Kommentar</td></tr>
<tr><td colspan=2 align=middle><textarea name=comment rows=5 cols=40></textarea></td></tr>
<tr><td colspan=2 align=middle>Bild anf&uuml;gen <input type=file name=bild1></td></tr>
<tr><td colspan=2 align=middle>Bild anf&uuml;gen <input type=file name=bild2></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="Daten uebergeben"></td></tr>
</table>
</form></center>
</body></html>

Das Skript, welches dieses Bild dann verschickt, sieht so aus:

use Mail::Sender;
 
use CGI qw/:standard/;

$Vname=param('Vname');
$Fname=param('Fname');
$strasse=param('strasse');
$plz=param('plz');
$telefon=param('telefon');
$mail=param('mail');
$comment=param('comment');
$ort=param('ort');
$bild1=param('bild1');
$bild2=param('bild2');

$nachricht="$comment \n $Vname $Fname \n $strasse \n $plz $ort \n \n $telefon \n\n Das ist ein Test. ";



$bild1=~m/.*[\/|\\](.*)/;
$name_bild_eins=$1;
$bild2=~m/.*[\/|\\](.*)/;
$name_bild_zwei=$1;
$pfad_zu_bildern="c:/sambar/docs";

open(bild,">$pfad_zu_bildern/$name_bild_eins ");
binmode(bild);
print bild <$bild1>;
close(bild);

open(bild,">$pfad_zu_bildern/$name_bild_zwei ");
binmode(bild);
print bild <$bild2>;
close(bild);

$sender = new Mail::Sender
(
    {
	from => 'schulungen@infos24.de',
	smtp => 'mx.freenet.de'
     }
);

$sender->MailFile
(
  {
	to =>$mail,
	subject => 'Als Anhang die Dateien',
	msg =>$nachricht,
  	 file => "$pfad_zu_bildern/$name_bild_eins,$pfad_zu_bildern/$name_bild_zwei"
  }
);

print "Die mail mit den Bildern wurde verschickt $name_bild_zwei und $name_bild_eins";

Wichtig ist, dass der Form Tag hier zwei Attribute braucht: enctype=mulitpart/form-data und method=post. Für Details siehe Formulareingaben auswerten, Das Cgi.pm Modul, Bildupload aus dem Browser.

Das Modul Mail::sender dürfte wohl das leistungsstärkste Modul zum Verschicken von Emails sein. Sein Umfang ist größer als hier beschrieben. Eine detaillierte Beschreibung findet sich hier. Bislang wurde ein Lösungsansatz gezeigt, der gehbar ist, wenn der Provider bereit ist, das Modul Mail::Sender zu installieren oder es schon hat, oder wenn man selber einen HTTP Server besitzt.

über Sendmail eine Email verschicken

Der denkbar einfachste Fall ist, dass Eingaben des User an eine Email Adresse verschickt werden und das Skript in einem Umfeld läuft, in dem Sendmail vorhanden ist:

<html><head><title>Email verschicken</title></head><body>
<form method=get action=http://www.netzinfos.de/cgi-bin/mailihtml.pl>
<table bgcolor=cococo>
<tr><td colspan=2 align=middle bgcolor=yellow>F&uuml;llen Sie bitte dieses Formular aus </td></tr>
<tr><td>Name</td><td><input type=text name=Fname size=20></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vname size=20></td></tr>
<tr><td>Strasse</td><td><input type=text name=strasse size=20></td></tr>
<tr><td>Plz Ort</td><td><input type=text name=plz size=6><input type=text name=ort
size=13>
<tr><td colspan=2 align=middle bgcolor=yellow>Telefon Fax email</td></tr>
<tr><td>Telefon</td><td><input type=text name=telefon size=20></td></tr>
<tr><td><font color=blue size=4>email</font></td><td><input type=text name=mail
size=20></td></tr>
<tr><td colspan=2 align=middle bgcolor=yellow> Kommentar</td></tr>
<tr><td colspan=2 align=middle><textarea name=comment rows=5
cols=40></textarea></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="Daten uebergeben"></td></tr>
</table>
</form></center>
</body></html>

Das dazugehörige Perl Skript, welches das Email dann verschickt, sieht so aus

#!/usr/bin/perl 
        print "Content-type:text/html\n\n"; 
        if ($ENV{'REQUEST_METHOD'} eq "GET")
        {
        $frage=$ENV{'QUERY_STRING'};
        }
        elsif ($ENV{'REQUEST_METHOD'} eq "POST")
        {
        read (STDIN,$frage,$ENV{'CONTENT_LENGTH'});
        }
        @frage=split(/&/,$frage);
        foreach $i(0..$#frage)
        {
        @frage[$i]=~s/\+/ /g;
        ($key,$value)=split(/=/,$frage[$i],2);
        $key=~s/%(..)/pack("c",hex($1))/ge;
        $value=~s/%(..)/pack("c",hex($1))/ge;
        $key=~s/\n/ /g;
        $value=~s/\n/ /g;
        $key=~s/\"/ /g;
        $value=~s/\"/ /g;
        $Frage{$key}=$value;
        }
#######################################################
        $mailprog ='/usr/lib/sendmail';
        open(getAB, "|$mailprog -t") || die "Can't open $mailprog!\n)";
        print getAB "To: $Frage{'mail'}\n";
        print getAB "From: info\@tam-tam.de\n";
        print getAB "Subject:Funktionniert. Da biste platt wa.\n"; 
        print getAB "Date: $date\n";
        print getAB "Content-Type: text/html\n";
        print getAB " Hi Kollege \n";
        print getAB "Name:$Frage{Fname} \n";
        print getAB "Vorname:$Frage{Vname}";
        print getAB " Telefon: $Frage{telefon} \n";
        print getAB " Strasse:  $Frage{strasse} \n";
        print getAB " Plz Ort:$Frage{plz} $Frage{ort} \n";
        print getAB " $Frage{comment} \n";
        print getAB "Damit hat das wohl geklappt.  Schönen Tach noch. \n";
        close (getAB);
        print "email wurde verschickt";
       

Dieses Skript läuft nicht so ohne weiteres lokal, da hier vorausgesetzt ist, dass Sendmail implementiert ist.
Wer dieses Skript zum Laufen bringen will, muss also Sendmail installiert haben bzw. auf einen Server uploaden, der diese Vorraussetzungen erfüllt. Alle Provider im Internet erfüllen diese Voraussetzungen. Wer eine Möglichkeit sucht, Sendmails von seinem eigenen Rechner zu verschicken, kann das Perl Modul Mail::sender benutzen. Als Alternative bietet sich darüber hinaus noch: Blat, der Windows Ersatz für Sendmail oder die Windows Portierung von Sendmail. Weitere Module, mit denen ebenfalls Emails direkt vom eigenen Rechner aus verschickt werden können sind: Net::SMTP und Mail::Sendmail.

über Sendmail eine Email mit Bild verschicken

Wenn nur Sendmail zur Verfügung steht, kann ein Bild mit folgendem Skript gemailt werden:

#!/usr/bin/perl 

use MIME::Base64 qw(encode_base64); 

print "Content-type:text/html\n\n"; 

$mailprog ='/usr/lib/sendmail';
open(MAIL, "|$mailprog  -t") || die "Can't open $mailprog!\n)";
print MAIL "To:infos\@infos24.de\n";
print MAIL "From: schulungen\@infos24.de\n";
print MAIL "Subject: Mail mit attachement über sendmail\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: multipart/mixed;\n";
print MAIL "\tboundary=Message-Boundary-19990614\n";
print MAIL "\n";
print MAIL "\n";
print MAIL "--Message-Boundary-19990614\n";
# Der Text Teil der Nachricht
print MAIL "Content-type: text/plain; charset=US-ASCII\n";
print MAIL "Content-description: Mail message body\n";
print MAIL "Content-transfer-encoding: 7BIT\n\n";
print MAIL "Na du Nase";
print MAIL "\n";
print MAIL "--Message-Boundary-19990614\n";
print MAIL "Content-type: application/octet-stream; name=\"wirtschaft.jpg\"\n";
print MAIL "Content-transfer-encoding: BASE64\n";
# Drucken des attachements
print MAIL "Content-disposition: attachment; filename=\"wirtschaft.jpg\"\n\n";
# Kodierung auf  base64  Basis
open(FILE, "wirtschaft.jpg");
#print "noch da";

while (read(FILE, $buf, 60*57)) 
{
print  MAIL encode_base64($buf);
}
close(FILE);
print MAIL "\n";
#Ende aller attachements
print MAIL "--Message-Boundary-19990614--\n";
close (MAIL);

print "Die Datei wurde verschickt";

Bei dieser Variante braucht man noch das MIME Modul, welches aber wohl immer vorhanden ist.
Dieses Skript hat ein paar Zeilen, die überraschend sind. Ziemlich am Anfang stehen diese drei Zeilen:
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: multipart/mixed;\n";
print MAIL "\tboundary=Message-Boundary-19990614\n";

  • Mit der ersten Zeile teilen wir dem Programm mit, dass der Inhalt des Mails den MIME Standards folgt. Die Angabe der Version ist im Moment nicht so spannend, weil es nur Version 1 gibt, trotzdem muss sie erfolgen. Durch Eingabe eines MIME Standards ist das Programm, welches die Email parst, in der Lage, die Programme aufzurufen, die für die Darstellung der entsprechenden Inhalte notwendig sind.

  • Mit Content-type:multipart/mixed geben wir an, dass die Mail aus mehreren und zwar unterschiedliche (Text, Bild) Bereichen besteht.

  • Durch die Angabe einer boundary (boundary=Message-Boundary-199990614) wird definiert, wo ein Bereich endet und der andere anfängt. Das heißt, taucht diese Zeile auf, dann endet der entsprechende Teil und ein neuer beginnt.

Interessant ist dann noch diese Stelle:
while (read(FILE, $buf, 60*57))
{
print MAIL encode_base64($buf);
}

Hier wird das Bild in lesbare Zeichen umgewandelt, so dass es über das SMTP Protokoll transportiert werden kann.
Ohne Kodierung sieht das Bild so aus:

ÿØÿà........ÿÛ$iñǸã}­àãw.?p.ß­~¨ÜXè6r3^Kæ¾zL‹/Ì.}î{÷ç5TM%?äM.ŸklËŒea?OLt.ßÖ¿VÃðo
ó/öK>¯';mÕÇúïßñùqViJüÕZ[îÛéÝõù¦~a?Š¿à¡Ñ-Uø›¥á¸Ç"uÓéýº?J­ÿ›žÿcœ~yüªÅ©u.úÉ\ÿý.Ö¾9èK ò"?Î:,‡<.8-
ƒÓ×·zòÛ??°Ç3.°b"?*ÜpqÿoTMqãÏGò‹‹&<.¾Ý‰úôÆ:×ç#kº"œùÇ.ï>xãÔÒ‹éÝ7´?¸õÁ8'¿SïYÄ'Â"{|Ó.ãukáé
-n¿¿ó~w6"â ~Xò`èSi"¸Õ›mi¦±Úýuè~ƒ..ø`±ýýŸ-ýóëô­;o.x[›‹<ŸöÛÞ¿7ÍýÆã‰$êqó._÷ªtÔ/p6É'|}â
{ûÒÿ¡?~Ý+ö.í-¾²ß"¿.amO‰.S"þ)â{Ÿùg®?×üþ5û·ˆý.äµüeÄø-o繎_.ªÑÂb'EU›å"Ô'(©4®"v"óûÏîž
.ÁÇ4áü".:'¥\ uüóÁ.os.üDÓ±?ðã..ã·ùë_4ÜÛîbË&:óž‡>ÿ¿_Sï] §‹´ÔP.H².1´dà{·ÿO .¤åw*?åßœã¿ÍÓ··qÖ¼ÌFq˜b+Ūº¦¤ìû´ µ×]û?øn.ÉÜã:)+JkMV?4m~vgÜ'Ë¡Ú.¸··Ì¿Ÿ_cÿ¹>?ÙK (Y§….#9aê=óþOZõÏ.ü]ðµÛGö›ëeÜFsÏ~{þ§ß¦A¯Yæ.-
±‹çÝ-oäºßçó}TMõ++ÃàèÅCoèŸNÉoßõ{žß®ëÖ0"X·€­é霟nk0x².€?Î>n뎞¼r.^ûG"õÑñjP';)
.FzääsÛwáßߥ¹ð.
?saæ[]‡-?º¸9ÿ¯K.ÄX|/4(ÖŠ©(ªr´®Ü[Ž‹_×3ÍÍø.Œ¥ ˜8{þÑ6Òû<"è-]uÿTMéuh˜nó".žK.9ì0k"Ó¾
êZÕijÜÄáUƒ¾ÇqØvÈëþ{ÖŒŸ.¥º}7ý#.¡˜|Î.õ.Œ?ü ¯#8ÅyÑâ (Das Bild geht weiter...... )

Das Bild nach der Kodierung:

/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
QEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDA
QEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
QEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCADXATkDASIA AhEBAxEB/8QAHwAAAQ
UBAQEBAQEAAAAAAAAAAAECAwQFBgcICQo=

Wer ausprobieren will, ob das tatsächlich auch stimmt, muss für die Hyroglyphen Variante folgende Schreibweise wählen:

while (read(FILE, $buf, 60*57))
{
print ($buf);
}

und für die Buchstaben Variante:

while (read(FILE, $buf, 60*57))
{
print encode_base64($buf);
}

Das erscheint dann im Browser nach dem Schema http://www.meine_sendmail_domain/cgi-bin/mailus.pl.

über Sendmail eine Email mit mehreren Bildern verschicken

Wie jetzt über Sendmail mehrere Bilder aufeinmal verschickt werden, zeigt das folgende Skript:

#!/usr/bin/perl 

use MIME::Base64 qw(encode_base64); 

print "Content-type:text/html\n\n"; 
@bilder=("wirtschaft.jpg","kirsche.jpg");

$mailprog ='/usr/lib/sendmail';
open(MAIL, "|$mailprog  -t") || die "Can't open $mailprog!\n)";
print MAIL "To:infos\@infos24.de\n";
print MAIL "From: schulungen\@infos24.de\n";
print MAIL "Subject: Mail mit zwei attachements über sendmail\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: multipart/mixed;\n";
print MAIL "\tboundary=Message-Boundary-19990614\n";
print MAIL "\n";
print MAIL "\n";
print MAIL "--Message-Boundary-19990614\n";
# Der Text Teil der Nachricht
print MAIL "Content-type: text/plain; charset=US-ASCII\n";
print MAIL "Content-description: Mail message body\n";
print MAIL "Content-transfer-encoding: 7BIT\n\n";
print MAIL "Na du Nase";
print MAIL "\n";
foreach $tolle_Bilder(@bilder)
{
print MAIL "--Message-Boundary-19990614\n";
print MAIL "Content-type: application/octet-stream; name=$tolle_Bilder\n";
print MAIL "Content-transfer-encoding: BASE64\n";
# Drucken des attachements
print MAIL "Content-disposition: attachment; filename=$tolle_Bilder\n\n";
# Kodierung auf  base64  Basis
open(FILE, $tolle_Bilder);

while (read(FILE, $buf, 60*57)) 
{
print  MAIL encode_base64($buf);
}
close(FILE);
print MAIL "\n";
}
#Ende aller attachements
print MAIL "--Message-Boundary-19990614--\n";
close (MAIL);

print "Die Datei wurde verschickt";

Deutlich sichtbar ist, das Verfahren ist einfach. Der Teil des Skriptes, der das Bild verschickt, muss in eine foreach Schleife eingebunden werden, die dann über einen Array läuft, der alle Bilder hält, die man verschicken will.
Eine sehr gute Darstellung für alle Probleme, die bei einem Medien Wechsel auftreten (Mail to FAX, Mail to sms etc.) findet sich übrigens hier. http://www.netzmafia.de/skripten/server/server9.html.

über Sendmail eine HTML Datei als Email verschicken

Es bleibt ein letztes Problem. Was macht man eigentlich, wenn man über Sendmail Mails im HTML Format verschicken will. HTML Emails werden dann notwendig, wenn die Email anspruchsvoller gestaltet sein soll. Hier wird lediglich statt schlichtem Text HTML Format verschickt, und der Header muss entsprechend modifiziert werden.
Wir verwenden wieder das HTML Formular von oben. Das sieht dann so aus:

<html><head><title>Email verschicken</title></head><body>
<form method=get action=http://www.netzinfos.de/cgi-bin/mailihtml.pl>
<table bgcolor=cococo>
<tr><td colspan=2 align=middle bgcolor=yellow>F&uuml;llen Sie bitte dieses Formular aus </td></tr>
<tr><td>Name</td><td><input type=text name=Fname size=20></td></tr>
<tr><td>Vorname</td><td><input type=text name=Vname size=20></td></tr>
<tr><td>Strasse</td><td><input type=text name=strasse size=20></td></tr>
<tr><td>Plz Ort</td><td><input type=text name=plz size=6><input type=text name=ort size=13>
<tr><td colspan=2 align=middle bgcolor=yellow>Telefon Fax email</td></tr>
<tr><td>Telefon</td><td><input type=text name=telefon size=20></td></tr>
<tr><td><font color=blue size=4>email</font></td><td><input type=text name=mail size=20></td></tr>
<tr><td colspan=2 align=middle bgcolor=yellow> Kommentar</td></tr>
<tr><td colspan=2 align=middle><textarea name=comment rows=5 cols=40></textarea></td></tr>
<tr><td colspan=2 align=middle><input type=submit value="Daten uebergeben"></td></tr>
</table>
</form></center>
</body></html>

Die Eingaben des Users in dieses Formular können wir dann mit folgendem Perl Skript als HTML Email versenden:

#!/usr/bin/perl
print "Content-type:text/html\n\n";
if ($ENV{'REQUEST_METHOD'} eq "GET")
{
$frage=$ENV{'QUERY_STRING'};
}
elsif ($ENV{'REQUEST_METHOD'} eq "POST")
{
read (STDIN,$frage,$ENV{'CONTENT_LENGTH'});
}
@frage=split(/&/,$frage);
foreach $i(0..$#frage)
{
@frage[$i]=~s/\+/ /g;
($key,$value)=split(/=/,$frage[$i],2);
$key=~s/%(..)/pack("c",hex($1))/ge;
$value=~s/%(..)/pack("c",hex($1))/ge;
$key=~s/\n/ /g;
$value=~s/\n/ /g;
$key=~s/\"/ /g;
$value=~s/\"/ /g;
$Frage{$key}=$value;
}
##############################################################
($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=gmtime();
$jahr=$year;
$monat=$mon+1;
$tag=$mday;
$jahr=$year+1900;
$mailprog ='/usr/lib/sendmail';
open(getAB, "|$mailprog -t") || die "Can't open $mailprog!\n)";
print getAB "To: $Frage{'mail'}\n";
print getAB "From: info\@tam-tam.de\n";
print getAB "Subject:Funktionniert. Da biste platt wa.\n";
print getAB "Date: $date\n";
print getAB "MIME-Version: 1.0\n";
print getAB "Content-Type: text/html\n";
print getAB "<html><body bgcolor=#0099cc>";
print getAB "<table bgcolor=blue>";
print getAB " <tr bgcolor=yellow><td colspan=2>Hi Kollege</td></tr>";
print getAB " <tr bgcolor=brown><td colspan=2> Heute ist der $tag.$monat.$jahr .</td></tr>";
print getAB "<tr bgcolor=green><td> Name: </td><td> $Frage{Fname}.</td></tr>";
print getAB "<tr bgcolor=white><td> Vorname:</td><td>$Frage{Vname}.</td></tr>";
print getAB "<tr bgcolor=gold><td> Telefon: </td><td> $Frage{telefon}.</td></tr>";
print getAB "<tr bgcolor=red><td> Strasse: </td><td> $Frage{strasse}.</td></tr>";
print getAB "<tr bgcolor=aquamarin><td> Plz Ort:</td><td> $Frage{plz} $Frage{ort}.</td></tr>";
print getAB "<tr bgcolor=darkgreen><td colspan=2 > $Frage{comment} </td></tr>";
print getAB "<tr bgcolor=blue><td colspan=2> Damit hat das wohl geklappt. Sch&ouml;nen Tach noch..
</td></tr>";
print getAB "</table></body> </html> " ;
close (getAB);
################### email wurde abgeschossen ####################
print "Das email wurde verschickt.
Schau mal in deinem email account nach, ob es angekommen ist.";

vorhergehendes Kapitel