Bastian Schnitzler: Email mit Anhang

Halli-Hallo!!!
Ich suche jetzt schon seit Stunden nach einer Lösung eine Datei über ein Cgi-script und ein HTML-Formular zu versenden.
Ich  habe folgendes Formular:
<form action="cgi-bin/kontakt.cgi" method="POST" enctype="multipart/form-data">
<input type="HIDDEN" name="formmailer" value="59449">
<table border=0>
<tr>
<td>Name:</td>
<td><input type="text" name="Nomen" id="K2"></td>
</tr>
<tr>
<td>E-mail:</td>
<td><input type="text" name="Email" id="K3"></td>
</tr>
<tr>
<td>Betreff:</td>
<td><input type="text" name="Betreff" id="K4"></td>
</tr>
<tr>
<td>Nachricht:</td>
<td><textarea cols="" rows="5" name="Nachricht" id="K5"></textarea></td>
</tr>
<tr>
<td>Anhang:</td>
<td><input type="file" name="file_attach" id="K6"></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td><input type="submit" name="Submit" value="Abschicken" onClick="CursorChange()" id="K7"</td>
<td><div align=right><input type="reset" name="Reset" value="Zurücksetzen" id="K8"></div></td>
</tr>
</table>
</form>

Die Namen für die IDS könnt ihr ignorieren, die benutze ich für was anderes...

Hier mein cgi-Script (kontakt.cgi):

#!/usr/bin/perl
$Sendmail_Prog = "/usr/lib/sendmail";
use CGI;
$cgi = new CGI;

my $mailto = "baschni@web.de";
my $returnhtml = "../danke.htm";
my $subject = $cgi->param('Betreff');
my $Name = $cgi->param('Nomen');
my $Email = $cgi->param('Email');
my $Nachricht = $cgi->param('Nachricht');
my $mailtext = "Name: $Name/nNachricht: $Nachricht/n";
my $absender = $cgi->param('Email');

open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
print MAIL "To: $mailto\n";
print MAIL "From: $absender\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$mailtext\n";
close(MAIL);
print "Location: $returnhtml\n\n";

Erstmal lese ich alle Daten aus den Feldern aus und schicke mir dann eine Mail mit Absender, Betreff und Text.

Kann mir jemand sagen, was ich nun einbinden muss, um die Datei aus dem file-Feld im Formular als Anhang an die Mail zu verschicken?

Bitte verweist mich nicht oder schickt mich zum Suchen,
ich konnte bei Google und Foren wie diesem hier keine Antwort finden.
Danke!!!

  1. Moin Moin !

    Verzichte auf Sendmail, das ist erstens nicht überall vorhanden, kostet zweitens einen weiteren fork(), und kann drittens problemlos durch Perl-Code ersetzt werden.

    Das Modul MIME::Lite kümmert sich um den Mail-Versand mit Attachments und allem Firlefanz, ohne daß Du Dich mit den diversen Mail-RFCs rumschlagen mußt. MIME::Lite ist reines Perl, daher plattformunabhängig, und auf CPAN zu finden.

    Allerdings solltest Du MIME::Lite mit MIME::Lite->send("smtp"); auf SMTP umstellen, denn auch MIME::Lite will "out of the box" sendmail nutzen. Oder Du benutzt die send_by_smtp-Methode statt der automatischen send-Methode.

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Moin Moin !

      Verzichte auf Sendmail, das ist erstens nicht überall vorhanden, kostet zweitens einen weiteren fork(), und kann drittens problemlos durch Perl-Code ersetzt werden.

      Das Modul MIME::Lite kümmert sich um den Mail-Versand mit Attachments und allem Firlefanz, ohne daß Du Dich mit den diversen Mail-RFCs rumschlagen mußt. MIME::Lite ist reines Perl, daher plattformunabhängig, und auf CPAN zu finden.

      Allerdings solltest Du MIME::Lite mit MIME::Lite->send("smtp"); auf SMTP umstellen, denn auch MIME::Lite will "out of the box" sendmail nutzen. Oder Du benutzt die send_by_smtp-Methode statt der automatischen send-Methode.

      Alexander

      Danke für deine schnelle Antwort,
      aber wie genau würde ich denn das Mime::Lite-Modul bei meinem Formular nutzen.
      Ich gehe mal davon aus, das ich die Variablen beibehalten kann.
      Kannst du mir nochmal ein Beispiel über das Versenden einer Mail mit Mime::Lite geben?

      1. moin,

        Ich gehe mal davon aus, das ich die Variablen beibehalten kann.
        Kannst du mir nochmal ein Beispiel über das Versenden einer Mail mit Mime::Lite geben?

        Hier 2 Links:

        MIME::Lite
        http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?dis.12.2.2

        Net::SMTP
        http://i-netlab.de/cgi-bin/index.cgi?vi=Mail_Clients

        Gruß, Erwin

        --
        SELFforum - Das Tor zur Welt!
        Theoretiker: Wie kommt das Kupfer in die Leitung?
        Praktiker: Wie kommt der Strom in die Leitung?
        1. Danke,
          mein Script sieht nun so aus: (kontakt.cgi)

          #!/usr/bin/perl
          $Sendmail_Prog = "/usr/lib/sendmail";
          use CGI;
          $cgi = new CGI;
          use MIME:Lite;

          my $mailto = "baschni@web.de";
          my $returnhtml = "../danke.htm";
          my $subject = $cgi->param('Betreff');
          my $Name = $cgi->param('Nomen');
          my $Email = $cgi->param('Email');
          my $Nachricht = $cgi->param('Nachricht');
          my $absender = $cgi->param('Email');
          my $Anhang = $cgi->param('file_attach');

          $msg = MIME::Lite->new(
                           From    => "$Email",
                           To      => "$mailto",
                           Subject => "$absender",
                           Type    =>'TEXT',
                           Data    =>"Name: $Name\nNachrich: $Nachricht\n");

          $msg->attach(Type     => 'multipart/form-data',
                           Path     => "$Anhang",
                           Filename =>'Anhang');

          $msg->send;

          Könnte man nun über mein Formular Emails mit Anhang verschicken?
          Und: Wie könnte ich den "Filename" der Datei entsprechend verändern?
          Also den Namen der Datei aus dem Feld 'file_attach' extrahieren.
          Danke!

          1. hi,

            MIME::Lite möchte eine Datei die es phsysisch auf der Festplatte des Servers gibt für das Erstellen einer Maildatei mit Anhang.

            Ob du die Maildatei , die mit MIME::Lite erstellt wurde, dann per PIPE an sendmail übergibst oder über ein Socket an den Mailserver ,ist egal.

            Viele Grüße, Erwin

            --
            SELFforum - Das Tor zur Welt!
            Theoretiker: Wie kommt das Kupfer in die Leitung?
            Praktiker: Wie kommt der Strom in die Leitung?
            1. hi,
              ich habe cgi über selfhtml gelernt,
              verstehe also noch nicht alles (Pipe & Socket).
              Diese Datei die versendet werden soll befindet sich aber auf der Festplatte des Betrachters.
              Kann man das Script denn so verwenden oder nicht?
              Danke,
              BaSchni

              1. Moin Moin !

                Diese Datei die versendet werden soll befindet sich aber auf der Festplatte des Betrachters.

                Warum läßt Du den Betrachter dann nicht einfach sein Mail-Programm benutzen, statt noch einen Webmailer zu basteln?

                Kann man das Script denn so verwenden oder nicht?

                Ja, lade das CGI-Modul in Dein Script. Liefere dem Betrachter als erstes ein Formular mit File-Upload-Feld (=>SelfHTML), und fische die hochgeladene Datei mit den Methoden des CGI-Moduls aus dem Datenstrom. Dann übergibst Du die Datei an das MIME::Lite-Modul.

                Beide Module sind ausführlich und mit Beispielen dokumentiert, also RTFM bitte.

                Alexander

                --
                Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
                Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".