
ü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.
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.
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.
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ü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.
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ü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ügen
<input type=file name=bild1></td></tr>
<tr><td colspan=2 align=middle>Bild anfü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.
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ü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.
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.
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.
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ü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ö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.";
|
 |