Spørgsmål ang mail
Først vil jeg lige sige at jeg intet ved om cgi eller perl. Men jeg bruge et script til at sende mail med, problemet er bare at den mail server jeg bruger til at sende disse mails med ikke er "open relay", derfor er det nødvendigt at logge sig på den, og det gør det script jeg har ikke. Hvad kan jeg gøre?Her er scriptet:
$allow_html = 1; # 1 = Yes; 0 = No
MAIN: {
# Get the input
read(STDIN, $buffer, $ENV{ 'CONTENT_LENGTH' } );
# Split the name-value pairs
@pairs = split(/&/, $buffer);
$ix = 0;
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
# Un-Webify plus signs and %-encoding
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
if ( 1 != $allow_html ) {
$value =~ s/<([^>]|\n)*>//g;
}
$FORM{ $name } = $value;
# send only the variables not prefixed with '_'
if ( $name !~ m/^_/ ) {
$listPairs[ $ix++ ] = join "\t", $name, $value;
}
}
$listLines = join "\n", @listPairs;
# sendmail($from, $reply, $to, $smtp, $subject, $message );
$result = sendmail( $ENV{ 'SERVER_NAME'} ,
$ENV{ 'REMOTE_ADDR'},
$FORM{ '_to' }, $FORM{ '_smtp' }, $FORM{ '_subject' },
$listLines );
if ( defined( $FORM{ '_nextpage' } ) ) {
SendNewURL( $result );
}
else {
SendDefaultForm( $result );
}
exit 0;
}
sub SendDefaultForm {
my ( $resultcode ) = @_;
print $ENV{ 'SERVER_PROTOCOL' }, " 200 OK\n";
print "Content-type: text/html\n\n";
print "<html><head><title>Form Acceptance</title>";
print "</head><body>\n";
print '<!-- sendmail had return code = ', $resultcode, ' -->', "\n";
print "<br><br><b>Thank you, your request has been sent.</b>\n";
print "<br>Use your browser back button to return to the original page.\n";
print "</body></html>\n";
}
sub SendNewURL {
my ( $resultcode ) = @_;
print $ENV{ 'SERVER_PROTOCOL' }, " 303 See Other\n";
print "Location: ", $FORM{ '_nextpage' }, "\n" ;
print "Content-type: text/html\n\n";
print "<html><head><title>Redirection Link</title>";
print "</head><body>\n";
print '<!-- sendmail had return code = ', $resultcode, ' -->', "\n";
print "<br><br><b>Thank you, your request has been sent.</b>\n";
print "<br>Please go to this <a href=\"", $FORM{ '_nextpage' }, "\">page</a>.\n";
print "</body></html>\n";
}
use Socket;
sub sendmail {
my ($from, $reply, $to, $smtp, $subject, $message) = @_;
my ($fromaddr) = $from;
my ($replyaddr) = $reply;
$to =~ s/[ \t]+/, /g; # pack spaces and add comma
$fromaddr =~ s/.*<([^\s]*?)>/$1/; # get from email address
$replyaddr =~ s/.*<([^\s]*?)>/$1/; # get reply email address
$replyaddr =~ s/^([^\s]+).*/$1/; # use first address
$message =~ s/^\./\.\./gm; # handle . as first character
$message =~ s/\r\n/\n/g; # handle line ending
$message =~ s/\n/\r\n/g;
$smtp =~ s/^\s+//g; # remove spaces around $smtp
$smtp =~ s/\s+$//g;
if (!$to) { return -8; }
my($proto) = (getprotobyname('tcp'))[2];
my($port) = (getservbyname('smtp', 'tcp'))[2];
my($smtpaddr) = ($smtp =~
/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)
? pack('C4',$1,$2,$3,$4)
: (gethostbyname($smtp))[4];
if (!defined($smtpaddr)) { return -1; }
if (!socket(S, AF_INET, SOCK_STREAM, $proto)) {
return -2; }
if (!connect(S, pack('Sna4x8', AF_INET, $port, $smtpaddr))) {
return -3; }
my($oldfh) = select(S); $| = 1; select($oldfh);
$_ = <S>; if (/^[45]/) { close S; return -4; }
print S "helo localhost\r\n";
$_ = <S>; if (/^[45]/) { close S; return -5; }
print S "mail from: <$fromaddr>\r\n";
$_ = <S>; if (/^[45]/) { close S; return -5; }
foreach (split(/, /, $to)) {
print S "rcpt to: <$_>\r\n";
$_ = <S>; if (/^[45]/) { close S; return -6; }
}
print S "data\r\n";
$_ = <S>; if (/^[45]/) { close S; return -5; }
print S "To: $to\r\n";
print S "From: $from\r\n";
print S "Reply-to: $replyaddr\r\n" if $replyaddr;
print S "X-Mailer: Perl Sendmail Version 1.21 Christian Mallwitz Germany\r\n";
print S "Subject: $subject\r\n\r\n";
print S "$message";
print S "\r\n.\r\n";
$_ = <S>; if (/^[45]/) { close S; return -7; }
print S "quit\r\n";
$_ = <S>;
close S;
return 1;
}
