Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]532[/thread]

Email mit Anhang über Formular

Leser: 3


<< >> 8 Einträge, 1 Seite
dax42
 2005-07-20 16:49
#5300 #5300
User since
2004-06-16
24 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe ein Skript zum Verschicken des Inhalts eines Webformulars per email. Nun möchte ich dieses um die Möglichkeit erweitern, auch einen Anhang (.txt, .doc, .pdf) mitzuschicken.

Das heißt der user soll von der Seite aus ein Formular ausfüllen, dort eine Datei angeben können, die bei ihm lokal vorhanden ist und dann auf "Submit" drücken. Das Skript soll sendmail benutzen um die Felderinhalte in eine email zu übernehmen und zusätzlich die Datei anzuhängen.

Könnt Ihr mir sagen, wie ich das mit dem Anhangs hinbekomme? Muss die Datei dazu erst auf den Server geladen werden oder kann sie direkt verschickt werden?

Danke!
renee
 2005-07-20 17:07
#5301 #5301
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst die Datei erst auf den Server laden (siehe http://wiki.perl-community.de/bin/view/Wissensbasis/CGIUploadSkript ) . Und dann an die Datei anhängen, z.B. mit Mail::Sender.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
dax42
 2005-07-20 20:00
#5302 #5302
User since
2004-06-16
24 Artikel
BenutzerIn
[default_avatar]
Erstmal vielen Dank fuer die Hilfe. Es geht auch schon fast, aber eben nur fast.

Ich habe genau das Beispiel probiert, das auf der oben angegebenen Seite zu finden ist. Wenn ich eine .txt verschicke, so klappt das auch einigermaßen - Umlaute werden korrekt dargestellt, aber der Zeilenumbruch ist so ein komisches Kästchen. Wahrscheinlich liegt das daran, dass der Server auf einer unix-Maschine läuft...

Größere Probleme entstehen, wenn ich eine .pdf oder .doc versenden will, diese sind nach dem email-Empfang nicht mehr zu öffnen (Fehlermeldung lautet auf beschädigt oder so ähnlich).

Hier mein Quellcode:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/local/bin/perl

use MIME::Lite;
use CGI qw/:standard/;

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

# Verzeichnis, in dem die Datei zwischengespeichert wird
my $uploaddir = '/home/b/public_html/upload';

$CGI::POST_MAX=1024 * 1000;

my ($filename) = param('datafile') || "";

my $serverFile = $uploaddir . "/" . (split(/[\\\/]/, param('datafile')))[-1];

print ("Filename: $filename<BR><HR>\n");

if (-e $serverFile){
   print ("File $serverFile is already existing\n");
}
else {
   print ("Writing to file $serverFile<BR>\n");
   my $buffer;
   open (FILE,">$serverFile") or die $!;

   while (my $bytesread=read($filename,$buffer,1024)) {
       print FILE $buffer;
   }
   close (FILE);
}

chmod (0666, "$serverFile");

$email=param('email');
#special character conversion
$email =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

$message = MIME::Lite->new(
   From => $email,
   To => 'me@my.de',
   Subject => 'Beratung',
   Type    =>'multipart/mixed'
);

$message->attach(Type     =>'TEXT',  
                Data     =>$email
);  

$message->attach(   Type     =>'AUTO',
               Path     =>$serverFile,
               Disposition => 'attachment'
);

$message->send(); # UNIX-sendmail

print "Ihre Daten wurden übermittelt. <BR>\n";

# delete message from server
unlink($serverFile);


Ausserdem würde ich gern wissen, wie ich mit Hilfe des CGI Modules durch die Eingabefelder iterieren kann. Da das Formular ziemlich viele Felder enthält, möchte ich nicht immer explizit param('paramname') angeben müssen.

Dankeschön!\n\n

<!--EDIT|dax42|1121875244-->
renee
 2005-07-20 20:07
#5303 #5303
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
    
open (FILE,">$serverFile") or die $!;

while (my $bytesread=read($filename,$buffer,1024)) {
print FILE $buffer;
}
close (FILE);


==>
Code: (dl )
1
2
3
4
5
6
7
8
    my $filehandle = upload('datafile');
open (FILE,">$serverFile") or die $!;
binmode FILE;
binmode $filehandle;
while (my $bytesread=read($filehandle,$buffer,1024)) {
print FILE $buffer;
}
close (FILE);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2005-07-20 20:10
#5304 #5304
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=dax42,20.07.2005, 18:00]Ausserdem würde ich gern wissen, wie ich mit Hilfe des CGI Modules durch die Eingabefelder iterieren kann. Da das Formular ziemlich viele Felder enthält, möchte ich nicht immer explizit param('paramname') angeben müssen.

Dankeschön![/quote]
Code: (dl )
1
2
3
4
my @fieldnames = param(); # hiermit holt man sich alle Feldnamen
foreach(@fieldnames){
print $_, " -> ",param($_),"<br />\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
dax42
 2005-08-11 12:33
#5305 #5305
User since
2004-06-16
24 Artikel
BenutzerIn
[default_avatar]
Hallo, ich habe zwischendurch an einem anderen Projekt gearbeitet, daher erst jetzt die Antwort.

Also ich habe immer noch Probleme mit Binärdateien (pdf, doc). Ich lade sie von Windows aus hoch (hier auch erstellt), sie werden dann von einem Unix-Server ausgelesen und der anfängliche Windowsrechner soll sie dann wieder lesen. Tut er aber nicht, Fehler: Beim Öffnen des Dokuments ist ein Fehler aufgetreten. Diese Datei ist beschädigt und kann nicht repariert werden (bei pdf).

Ich habe genau den Code benutzt, den renee gepostet hat... was läuft da schief?? Der Zeilenumbruch in einer einfachen Textdatei wird auch mit diesen rechteckigen Kästchen dargestellt.

Ich hoffe Ihr könnt mir helfen!
Danke, dax
[E|B]
 2005-08-11 13:36
#5306 #5306
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=renee,20.07.2005, 15:07]Du musst die Datei erst auf den Server laden[/quote]
Nicht unbedingt. Wenn man den Header manuell abarbeitet kann man die Datei auch "on-the-fly" wegschicken, ohne zuerst ein File auf dem Server zu erzeugen.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
dax42
 2005-08-11 13:50
#5307 #5307
User since
2004-06-16
24 Artikel
BenutzerIn
[default_avatar]
Hallo EB,

das sagt mir jetzt erstmal nicht so viel.. Könntest Du vielleicht ein Beispiel geben?
Danke!
<< >> 8 Einträge, 1 Seite



View all threads created 2005-07-20 16:49.