Avatar billede christian_h Nybegynder
08. marts 2003 - 23:40 Der er 12 kommentarer og
1 løsning

Forbedre script med SMTP

Hej Gutter.

Jeg bruger nedenstående script på min hp, det fungerer fint nok så længe den SMTP server jeg bruger til at sende mailen over er oppe at køre, problemet er hvis den er nede, så kommer der en "hvid" webside frem, i modsætning til hvis mailen bliver afsendt korrekt, så kommer der en side op som viser hvad der er blevet sendt.

Er der ikke en der kan lave scriptet om således at hvis den ikke kan oprette forbindelse til SMTP serven, vises der flg. på skærmen, "Der er opstået en fejl, prøve venligst senere" ??

Håber én gider at hjælpe.

Mvh.

Christian_h

Her er scriptet:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
$counter=0;
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$counter=$counter+1;
$Titel{$counter}=$name;
$FORM{$name} = $value;
}

use Net::SMTP;
$smtp = Net::SMTP->new('smtp.mail.dk', Hello => 'Godaw');
$smtp->mail("$FORM{'bemail'}");
$smtp->to("$FORM{'bemail'}");
$smtp->to('kopi@her.dk');
$smtp->data();
$smtp->datasend("To: $FORM{'bemail'}\n");
$smtp->datasend("From: Salg\@her.dk\n");
$smtp->datasend("Subject: Bestilling fra her.dk\n");
$smtp->datasend("Content-type: text/html\n\n");
$smtp->datasend("\n");


print qq½<HTML>
<HEAD>
<TITLE>Udskrift af bestilling hos her.</TITLE>
</HEAD>
<DIV>
<center>
<h2>TAK for din bestilling.</h2>
<h3>Udskriv venligst denne side og gem den til evt. ordre forespørgsel.</h3>
<input type='button' value='Tryk her for at udskrive siden' onclick='window.parent.print();'><br>
<button name="formknap" class="knap" onClick="top.location.href='http://www.her.dk/dansk/index.htm'"; type="button">Tilbage

til start</button>
<br><br></center>½;
printf("<center><b>Du vil snarest muligt modtage en email som du bedes bekræfte FØR din ordre vil blive

gennemført.</b><br></center>\n");
printf("<center><b>Medsend venligst hele mailen, så det er muligt for os at se hvad du har bestilt og hvor det skal sendes

hen.</b><br></center>\n");
printf("<center><b>Hvis du ikke inden for 24 timer har modtaget mailen, bedes du kontakte os via telefon.</b></center>\n");
printf("<br><br>\nHej %s<BR><BR>\n", $FORM{'bname'});
printf("Du har afgivet følgende oplysninger/bestilling:<BR>\n");
printf("Kundennummer: %s<BR>Firma: %s<BR>Navn: %s<BR>\n",$FORM{'bkdnr'}, $FORM{'bfirma'}, $FORM{'bname'});
printf("Gade: %s<BR>Postnummer og by: %s %s<br>Land: %s<BR>Telefon: %s<BR>Email: %s<BR>Kommentar:<p> %s<BR><BR>\n",

$FORM{'bstrasse'}, $FORM{'bpostcode'}, $FORM{'bstadt'}, $FORM{'bland'},$FORM{'btelefon'}, $FORM{'bemail'},

$FORM{'Kommentar'});
$smtp->datasend("<center><img src=http://www.rc-e.dk/dansk/pix/logo.jpg></center>");
$smtp->datasend("Hej ".$FORM{'bname'}."<br><br>");
$smtp->datasend("Du bedes besvare denne mail for at bekræfte din ordre<br><br>");
$smtp->datasend("<b>Medsend venligst hele mailen, så det er muligt for os at se hvad du har bestilt og hvor det skal sendes

hen.<br><br>");
$smtp->datasend("Du har afgivet følgende oplysninger/bestilling:<br><br>");
$smtp->datasend("Kundennummer:".$FORM{'bkdnr'}."<br>Firma: ".$FORM{'bfirma'}."<br>Navn: ".$FORM{'bname'}."<br>");
$smtp->datasend("Gade: ".$FORM{'bstrasse'}."<br>Post nr. & By: ".$FORM{'bpostcode'}." ".$FORM{'bstadt'}."<br>Land:

".$FORM{'bland'}."<br>Telefon: ".$FORM{'btelefon'}."<br>Email: ".$FORM{'bemail'}."<br>Kommentar:<p>".$FORM{'Kommentar'});
#$smtp->datasend("<br><br>Lieferadresse:\nFirma: ".$FORM{'lfirma'}."<br>Name: ".$FORM{'lnachname'}."<br>PLZ/Ort:

".$FORM{'lpostcode'}." ".$FORM{'lstadt'}."<br>Strasse:".$FORM{'lstrasse'});
if ($FORM{'orderm'} eq "Kontoeinzug") {
   

$mailbody=$mailbody."\n\nKontendaten:\nBank:".$FORM{'ktoinst'}."\nBLZ:".$FORM{'ktoblz'}."\nKtoNummer:".$FORM{'ktonr'}."\nInha

ber:".$FORM{'ktoinh'};
}
if ($FORM{'orderm'} eq "Kreditkarte") {
    $mailbody=$mailbody."\n\nKreditkarte:\nInstitut:".$FORM{'kredart'}."\nKartennummer:".$FORM{'krednr'}."\nAblauf

Datum:".$FORM{'kredablauf'};
    if ($FORM{'faxja'} eq "on") {
        $mailbody=$mailbody."\nKreditkarteninformationen werden per Fax gesendet";
    }
}
print("Ønsker at bestille:<BR><BR>\n");
$smtp->datasend("<br><br>Ønsker at bestille:<br><br>");
$an=1;
while ($FORM{'item'.$an})  {
    $artikel='item'.$an;
    $menge='quantity'.$an;
    $einzelpreis='priceeach'.$an;
    $vollpreis='totalcost'.$an;
$smtp->datasend($FORM{$artikel}."  Antal:".$FORM{$menge}."  Stk. Pris:".$FORM{$einzelpreis}.$pr." 

Subtotal:".$FORM{$vollpreis}."<br>");
printf("Artikel: %s<BR>Antal: %s<BR>Stk. pris: %s %s<BR>Subtotal: %s<BR><BR>", $FORM{$artikel}, $FORM{$menge},

$FORM{$einzelpreis}, $pr, $FORM{$vollpreis});
$an++;
}
$smtp->datasend("Betaling via ".$FORM{'orderm'}."<br>");
printf("Betaling via %s<BR>",$FORM{'orderm'});
printf("Forsendelse %s<br>",$FORM{'Forsendelse'}."\n");
$smtp->datasend("Forsendelse:".$FORM{'Forsendelse'}."<br>");
printf("Total Pris %s<br>",$FORM{'GoodsTotal'}."\n");
$smtp->datasend("Totalpris:".$FORM{'GoodsTotal'}."<br>");
#printf("Mange tak for din bestilling! Bekræftelse er sendt til %s.", $FORM{'bemail'});
print("</DIV></BODY></HTML>");
$smtp->dataend();
$smtp->quit;
Avatar billede mfalck Praktikant
09. marts 2003 - 09:29 #1
jeg ville starte med at sætte en timeout på objektet:

$smtp = Net::SMTP->new('smtp.mail.dk', Timeout => 30,
Hello => 'Godaw');
# husk desuden at Hello skal oftest være en FQDN for ikke at smtp-serveren afviser dit request.

Jeg har ikke prøvet følgende men det kunne være en måde:

if (def ($smtp->domain)) {
<resten af dit script>
} else {
print qq {<HTML>
<HEAD>
<TITLE>Fejl i scriptet.</TITLE>
</HEAD>
<DIV>
<center>
<h2>Der er opstået en fejl - prøv venligst senere.</h2>

</body>
</html>

}
Avatar billede mfalck Praktikant
09. marts 2003 - 10:14 #2
hmm .. det virker ikke. Kigger lige videre.
Avatar billede christian_h Nybegynder
09. marts 2003 - 10:22 #3
ØV, kigger spændt med

Christian_h
Avatar billede mfalck Praktikant
09. marts 2003 - 10:35 #4
prøv med denne her:

$smtp = Net::SMTP->new(''smtp.mail.dk'', Timeout => 30, Hello => 'ditnavn.dk')
or die "<html><header><title>Fejl</title></header><body><H2>Der er opstået en fejl - prøv venligst senere</h2></body></html>";
#default timeout = 120;
Avatar billede christian_h Nybegynder
09. marts 2003 - 10:47 #5
Jeg får denne fejl "sendorder.pl line 18. Content-type: text/html " jeg tror ikke at scriptet er så vild med html oppe i smtp delen ??.

Måden jeg har testet det på er ved at skrive en mail server der ikke er der, er det ikke godt nok ??

Christian_h
Avatar billede mfalck Praktikant
09. marts 2003 - 11:00 #6
jeg testede det på samme måde - dog uden at gøre det igennem et webinterface.
Avatar billede mfalck Praktikant
09. marts 2003 - 11:04 #7
du skal bruge

use CGI::Carp qw(fatalsToBrowser);

i starten af dit script.
Avatar billede christian_h Nybegynder
09. marts 2003 - 11:20 #8
Nu kan man helt undlade html tags'ne, de bliver nemlig bare vist som text, men resultatet ser således ud, jeg har også prøvet at sætte den korrekte SMTP server ind og det ser også ud til at virke.
------Vises på skærmen ved fejl------
Content-type: text/html
Software error:
Der er opstået en fejl - prøv venligst senere


For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.
-------------------------------------

Jeg ville dog gerne have fjernet teksten "For help,....." da det jo ikke hjælper noget at sende en mail da mail serveren jo er nede !!! :-)
TAK TAK.

Chrisian_h
Avatar billede mfalck Praktikant
09. marts 2003 - 13:38 #9
Tjo - hvis de sender en mail så er det fra deres egen mail-server og ikke nødvendigvis den du bruger.

Jeg kan godt lige se om man kan ændre det ...
Avatar billede christian_h Nybegynder
09. marts 2003 - 13:45 #10
Nej det er rigtig nok, men det ville være til min server den ville blive sendt, og den er jo nede....
Avatar billede mfalck Praktikant
09. marts 2003 - 13:51 #11
tjo - men smtp-serveren gemmer jo mails i op til 5 dage inden den bouncer den.
Avatar billede mfalck Praktikant
09. marts 2003 - 13:53 #12
ved at kigge i perldoc'en

Changing the default message

      By default, the software error message is followed by a
      note to contact the Webmaster by e-mail with the time and
      date of the error.  If this message is not to your liking,
      you can change it using the set_message() routine.  This
      is not imported by default; you should import it on the
      use() line:

          use CGI::Carp qw(fatalsToBrowser set_message);
          set_message("It's not a bug, it's a feature!");

      You may also pass in a code reference in order to create a
      custom error message.  At run time, your code will be
      called with the text of the error message that caused the
      script to die.  Example:

          use CGI::Carp qw(fatalsToBrowser set_message);
          BEGIN {
              sub handle_errors {
                my $msg = shift;
                print "<h1>Oh gosh</h1>";
                print "Got an error: $msg";
            }
            set_message(\&handle_errors);
          }
Avatar billede christian_h Nybegynder
09. marts 2003 - 14:08 #13
Virker, FEDT TAK.

Christian_h
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