VCard schreiben
Jer
- cgi
Hi!
Habe folgendes Problem: Ich möchte die Daten aus einem Formular via email verschicken und als vcard(outlook) ausgeben.
Habe ein Skript geschrieben, das soweit auch funktioniert, ausser der Tatsache, dass die vcard keinen Inhalt hat. (Fehlermeldung bekomm ich auch keine.
--------
Hier das Skript:
#Formulardaten einlesen
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'};
}
else
{
read (STDIN, $daten, $ENV{'CONTENT_LENGTH'});
}
@formularfelder = split (/&/, $daten);
foreach $feld (@formularfelder)
{
($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
$Formular[$i] = $name;
$i = $i + 1;
$Formular[$i] = $value;
$i = $i + 1;
}
#E-Mail versenden
$Mailprogramm = "/usr/lib/sendmail"; # Pfad zu E-Mailprogramm
$MailSubject = "Formluar-Feedback"; # E-Mail Betreff
$Empfaenger = "xy/@xy.de"; # E-Mail Adresse
$SenderName = $Formular[5]; # Absender
$SenderMail = $Formular[17]; # E-Mail Adresse des Absenders
open(MAIL,"$Mailprogramm -t") die;
print MAIL "To: $Empfaenger\n";
print MAIL "From: $SenderMail $SenderName\n";
print MAIL "Subject: $MailSubject\n\n";
$i = 0;
$max = $#Formular;
for($i=0;$i<=$max;$i=$i+2)
{
print MAIL "$Formular[$i]: $Formular[$i+1]\n";
}
close(MAIL);
$firma = $Formular[1];
$titel = $Formular[3];
$nname = $Formular[5];
$vname = $Formular[7];
$str = $Formular[9];
$post = $Formular[11];
$ort = $Formular[13];
$land = $Formular[15];
$email = $Formular[17];
$telnr = $Formular[19];
$faxnr = $Formular[21];
open (VCARD, ">$name.vcf");
print VCARD "BEGIN:VCARD \n";
print VCARD "VERSION:2.1 \n";
print VCARD "N:$vname;$nname;;$titel \n";
print VCARD "FN:$nname $vname \n";
print VCARD "ORG:$firma \n";
print VCARD "TEL;WORK;VOICE:$telnr \n";
print VCARD "TEL;WORK;FAX:$faxnr \n";
print VCARD "ADR;WORK;ENCODING=QUOTED-PRINTABLE:;;$str;$ort;;$post;$land \n";
print VCARD "LABEL;WORK;ENCODING=QUOTED-PRINTABLE:$str=0D=A$ort $post=0D=0A$land \n";
print VCARD "EMAIL;PREF;INTERNET:$email \n";
print VCARD "END:VCARD";
close (VCARD);
------
schon mal danke im vorraus!
jer
Hi Jer,
[...]
Den Teil zum Einlesen der Forumlardaten, und zum Versenden der Mail solltes Du noch mal überarbeiten, auch wenn es gerade so funktioniert, ist es imho nicht sonderlich elegant (bzw. fehlerbehaftet: z.B.: $Daten <> $daten)
Besser wäre imho die Verwendung eines Hashs für die Formulardaten, bzw. "use CGI;" was Dir folgendes ersparen könnte:
Vorbereitung für VCARD
[...]
$nname = $Formular[5];
^..........1)
[...]
$faxnr = $Formular[21];
womit dann vielleicht auch der folgende Fehler hätte vermieden werden können:
open (VCARD, ">$name.vcf"); ......2)
^............1)
Hier bekommt $name seinen Wert zugewiesen: ($name, $value) = split(/=/, $Feld);)
Was steht eigentlich in "faxnr.vcf"? ;-))
die "Kann $nname.vcf nicht oeffnen: $!"; sollte nicht fehlen.
Dann erhälst Du auch eine Fehlermeldung, wenn die Datei nicht erzeugt werden kann. Mit -w hättest Du bestimmt bereits einige erhalten, und noch mehr mit "use strict;". Es gibt also durchaus Möglichkeiten, sich von Fehlermeldungen regelrecht zuschütten zu lassen ;-)
print VCARD "BEGIN:VCARD \n";
[...]
print VCARD "END:VCARD";
close (VCARD);
Du kannst Dir die vielen "print()"-Anweisungen sparen, indem Du die Zeilen nicht mit ; sondern mit , beendest. print() gibt eine kommaseparierte Liste von Variablen bzw. Konstanten, oder Ausdrücken aus, die auch über mehrere Zeilen gehen.
Teste mal die Hinweise, vielleicht hilft es ja :-)
Gruß AlexBausW
P.S.: Vielleicht habe ich ja noch was übersehen, dann frag (in diesem Thread) noch mal nach P.P.S.: Literatur: L. Wall, T. Christiansen & R.L. Schwartz "Programmieren mit Perl" O
Reilly 1997 ISBN 3-930673-48-7