Erwin: form mailer mit smtp::lite

Beitrag lesen

hi,

untenstehendes Script kannst du vielleicht anpassen

Erwin

=============================================================
#!/usr/bin/perl

Versenden von Mails mit Attachment per Webfrontend

Geschrieben von Rolf Rost, 13.7.2002

###########################################################################

Benutzervorgaben

Das Template fuer den Seitenaufbau bis zum body steht am Ende des Scripts

Der Hostname des MailRelays (wo ein Mailtransfer Agent laueft)

Normalerweise ist das der localhost, falls dort ein *sendmail* laeuft

my $smtp_host = 'localhost';

Absender, Vorbelegung Eingabefeld

my $abs = 'rolfrost@web.de';

Uploadbegrenzung ($max in bytes)

my $max = 1024 * 1000;
###########################################################################
use strict;
use subs qw(a_html z_html form mime_send text_send abbruch);
use CGI qw(-private_tempfiles );
use Net::SMTP;
use File::Basename;
use MIME::Base64 qw(encode_base64);

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

my $q = new CGI;

Ablauf des CGIs

if($q->param){
 if($q->param('anhang')){ mime_send }
 else{ text_send }
}
else{
 a_html;
 form;
 z_html;
}

exit;

Unterfunktionen

Die Mail wenn ein Anhang dran ist

sub mime_send{
 # Eingaben zuweisen
 my $abs = $q->param('abs_email') or abbruch "Fehlerhafte Eingabe","Backbutton klicken und Absenderemail eingeben";
 my $rcp = $q->param('rcp_email') or abbruch "Fehlerhafte Eingabe","Backbutton klicken und Empfängeremail eingeben";
 my $subj = $q->param('betreff');
 my $msg = $q->param('text');
 $subj ||= "Kein Betreff";

# Uploadfeld parsen, Dateiname und MIME Type
 my $anhang = $q->param('anhang');
 fileparse_set_fstype("MSDOS");   # <--- empfohlen, falls Probleme bei MS WindowsClients...
 my ($original_filename, $local_path) = fileparse $anhang;
 my $mime_type = $q->uploadInfo($anhang)->{'Content-Type'};

# den handler auslesen mit der read() funktion
 my ($bytesread,$buffer,$sum,$str);
 while ($bytesread=read($anhang,$buffer,1024)) {
  $str .= $buffer;
  $sum += $bytesread;
  if($sum > $max){
   abbruch("Die angehaengte Datei ist zu gross!","Der Prozess wurde abgebrochen")
  }
 }

# den Anhang codieren
 my $base64_str = encode_base64($str);

# Nun kann die Maildatei erstellt werden
my $mailfile=<<"12----------------------------------------------------34";
From: $abs
To: $rcp
Subject: $subj
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="roro"

This is a multi-part message in MIME format.

--roro
Content-Type: text/plain;
 charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

$msg

--roro
Content-Type: $mime_type;
 name="$original_filename"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="$original_filename"

$base64_str

--roro--

12----------------------------------------------------34

# senden
 my $smtp = new Net::SMTP($smtp_host) or abbruch("Keine Verbindung zu SMTP Host *$smtp_host*");
 # Ab geht die Post und tschuess
 $smtp->mail($abs);
 $smtp->to( $rcp );
 $smtp->data( $mailfile );
 $smtp->quit();

# Das Senden verkuenden
 a_html;
 print qq(<h3>Die Mail mit Anhang wurde gesendet</h3>\n<p>Backbutton klicken oder <a href="$ENV{'SCRIPT_NAME'}">Script neu laden...</a>\n);
 z_html;
}

Die Mail wenn kein Anhang dran ist

sub text_send{
 # Eingaben zuweisen
 my $abs = $q->param('abs_email') or abbruch "Fehlerhafte Eingabe","Backbutton klicken und Absenderemail eingeben";
 my $rcp = $q->param('rcp_email') or abbruch "Fehlerhafte Eingabe","Backbutton klicken und Empfängeremail eingeben";
 my $subj = $q->param('betreff');
 my $msg = $q->param('text');
 $subj ||= "Kein Betreff";

# senden
 my $smtp = new Net::SMTP($smtp_host) or abbruch("Keine Verbindung zu SMTP Host *$smtp_host*");
 my $mailfile = qq(From: $abs\nTo: $rcp\nSubject: $subj\n\n$msg\n\n);
 # Ab geht die Post und tschuess
 $smtp->mail($abs);
 $smtp->to( $rcp );
 $smtp->data( $mailfile );
 $smtp->quit();

# Das Senden verkuenden
 a_html;
 print qq(<h3>Die Mail wurde gesendet</h3>\n<p>Backbutton klicken oder <a href="$ENV{'SCRIPT_NAME'}">Script neu laden...</a>\n);
 z_html;
}

Abbruchfunktion bei Fehlerhafter Eingabe

sub abbruch{
 print qq(<h1>$_[0]</h1>\n<p>$_[1]\n);
 exit;
}

Das Frontendformular

sub form{
print<<"x-----------------------------------------------------------------x";

<form action="$ENV{'SCRIPT_NAME'}" method="post" enctype="multipart/form-data">

<table border=1 cellspacing=0 cellpadding=0 width="80%">
<tr><th colspan=2 align="left">Mailformular, bitte alle Felder ausfüllen</th></tr>
<tr><td>Absender eMail: </td><td><input name="abs_email" size=50 value="$abs"></td></tr>
<tr><td>Empfänger eMail: </td><td><input name="rcp_email" size=50></td></tr>
<tr><td>Betreff: </td><td><input name="betreff" size=50></td></tr>
<tr><td valign="top">Nachricht: </td><td><textarea name="text" cols=80 rows=20 wrap="physical"></textarea></td></tr>
<tr><td colspan=2 align="center"><input type="submit" name="senden" value="Mail senden"><input type="reset" value="Eingaben verwerfen"></td></tr>
<tr><td>Dateianlage: </td><td> <input type="file" name="anhang" size=60> </td></tr>
</table>

</form>
x-----------------------------------------------------------------x
}

zwei Funktionen zum Seitenaufbau

sub a_html{while(<DATA>){print}}
sub z_html{print qq(</body>\n</html>\n)}

###########################################################################

Kopf der HTML Datei ist hier definiert, Änderungen unterhal des __END__

__END__
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>xMail Frontend zum Versenden von Mails mit Anhang</TITLE>
<LINK REL="stylesheet" HREF="/nv.css" TYPE="text/css">
<META NAME="Author" CONTENT="Rolf Rost">
</HEAD>
<BODY>

<h2>xMail Frontend zum Versenden von Mails mit Anhang</h2>