Avatar billede pnr Nybegynder
24. april 2003 - 10:03 Der er 9 kommentarer og
1 løsning

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;

  # print
  # 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;
}
Avatar billede 1nsane Nybegynder
24. april 2003 - 10:07 #1
bæ, det er syret
Avatar billede 1nsane Nybegynder
24. april 2003 - 10:08 #2
totalt syret :-)
Avatar billede erikjacobsen Ekspert
24. april 2003 - 10:13 #3
Du skulle hellere finde den "rigtige" smtp-server i forhold
til det sted du afvikler scriptet. Hvor sker det?
Avatar billede pnr Nybegynder
24. april 2003 - 10:19 #4
Hvad mener du med en "rigtig" smtp-server
Avatar billede erikjacobsen Ekspert
24. april 2003 - 10:34 #5
Kører du på et webhotel har de en mailserver du kan bruge
uden at skulle logge ind. Kører du derhjemmefra har din
Internet udbyder nok en.
Avatar billede pnr Nybegynder
24. april 2003 - 12:56 #6
Det har vist ikke noget med "open relay" at gøre alligevel. Men måske mere med den from adresse som mailen får. den kommer nemlig til at hedde det samme som det domæne automail ligger på. Er der nogen der kan forklare hvorfor den hedder det? eks automail.hej.dk

Kunne det ikke godt tænkes at sådan en from adresse blev afvist af visse mailserver
Avatar billede erikjacobsen Ekspert
24. april 2003 - 13:04 #7
Prøv at erstatte
  $result = sendmail( $ENV{ 'SERVER_NAME'} ,
med
  $result = sendmail( $fromaddr ,

Hvor har du dog gaflet det script henne?
Avatar billede pnr Nybegynder
28. april 2003 - 10:28 #8
erikjacobesn smid lige et svar!


jeg takker for hjælpen
Avatar billede erikjacobsen Ekspert
28. april 2003 - 10:29 #9
Tak, jeg samler ikke på point
Avatar billede pnr Nybegynder
28. april 2003 - 10:31 #10
Så tager jeg dem selv. Så skal du have mange tak :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester