Avatar billede tools Nybegynder
22. marts 2002 - 09:51 Der er 10 kommentarer og
2 løsninger

SMS Perlscript

Efter at jeg har brugt det meste af en nat på at læse de leste spørgsmål og svar igennem under Perl, har det ikke lykkes mig at finde det jeg leder efter. Er der ikke en der har så meget forstand på Perl at vedkommende kan hjælpe mig?
Jeg mangler et perlscript der kan sende SMS´er over SMTP, da jeg har min egen Win XP server. Det må kunne lade sig gøre. Jeg har et mailform script der virker over SMTP og har fundet et perlscript på script.dk som bruger et mailsend program. Man må da kunne kominere de to scripts eller kunne lave et helt nyt et. Her er de to scripts:

#!/usr/bin/perl
require 5.002; # needed for Socket.pm
#use strict;  # only used during development
use Socket qw(:DEFAULT :crlf);
           
my $date = localtime;
my $version = '1.4';
my ($smtpserver,$port,@referer,$return_addr,$doLog,$maillogfile,@hidden,%query);

##############################################################################
# USER DEFINEABLE VARIABLES

# Set this to your SMTP server
$smtpserver = 'vip.cybercity.dk';
# Mail port of the SMTP server. Usually 25
$port = 25;
# hosts allowed accessing this cgi
@referer = ('www.t2c.dk','t2c.dk','localhost','127.0.0.1');

# this is the default Return address if no email was submitted by the form
$return_addr = 'webmaster@t2c.dk';

# logging. set to 0 for no logging, 1 for logging errors and 2 for debugging
# (debugging logs all SMTP server replies)
$doLog = 1;
# location of logfile.
# Only used if $doLog is set to 1 or 2 or from the commandline
$maillogfile = 'C:\httpd\www\chatting\Cgi-Bin\logs\F2Merror.log';

# END OF USER DEFINEABLE VARIABLES
##############################################################################

# These fields will not be send with the mail
@hidden = ('recipient','redirect','bgcolor','background','subject',
          'link_color','vlink_color','alink_color','text_color','title',
          'env_report','return_link_title','return_link_url','required',
          'no_table','font_face','font_size','sort','hide_blanks');

# Check if running from commandline
my $clmode = 0;
if (!$ENV{'REQUEST_METHOD'}) {
    $clmode = 1;
    &commandline_mode;
}

# Get the Form input
%query = &read_input;

# Check Referring URL
&check_referer;

# Check Required Fields
&check_required;

# Send E-Mail
&sendmail;

# Return HTML Page or Redirect User
&return_html;


sub commandline_mode {
    my $yesno;
    print "Commandline mode. Answers in brackets are default values.\n",
          "Do you wish to send a test email? ([y]/n) ";
    chomp ($yesno = <STDIN>);
    if ($yesno =~ /^n/i) {
        print "\n"; exit;
    }
    print "Enter recipient(s): [",$return_addr,"] ";
    chomp ($query{recipient} = <STDIN>);
    $query{recipient} ||= $return_addr;
    print "Ok, trying to connect...\n";
    &sendmail;
    print "\n"; exit;
}

sub check_referer {
    my ($allowed_referer,$referer_OK);
    if ($ENV{'HTTP_REFERER'}) {
        foreach $allowed_referer (@referer) {
            if ($ENV{'HTTP_REFERER'} =~ /$allowed_referer/i) {
                $referer_OK = 1;
                last;
            }
        }
    }
    else {
        $referer_OK = 1;
    }

    if (!$referer_OK) {
    &error('Bad Referer');
    }
}

sub check_required {
    my ($require,@required,@ERROR);
    @required = split(/,/,$query{'required'});
    foreach $require (@required) {

        if (!($query{$require}) || $query{$require} eq ' ') {
            push(@ERROR,$require);
        }
      }

    if (@ERROR) {
    &error('Blank Fields', @ERROR);
    }

}

sub return_html {
    my $title = $query{'title'} || "T2C Network Group";
    my @TO = split(/,/,$query{'recipient'});

    if ($query{'redirect'} =~ /http(s)?\:\/\/.*\..*/) {
        print "HTTP/1.0 303 See Other\r\n" if $ENV{PERLXS} eq "PerlIS"; # for perlIS.dll
        print "Location: $query{'redirect'}\n\n";
    }

    else {
        &build_body("$title");
        print "<center>\n";
        my $font = &check_font;
        print "<H1>$title</H1>\n<P><HR size=7 width=\"75\%\">\n";

        # check whether using a table or not. default is yes.
        if (!$query{'no_table'}) {
            print "<TABLE width=\"75\%\">\n<TR><TD>\n";
            &check_font;
        }
        print "Her er hvad du sendte til T2C Network Group den $date\n<p>\n";

        print "<UL>\n";
        my ($key,$value,@sorted);
        my $sort = $query{'sort'};
        if ($sort eq 'alphabetic') {
            foreach $key (sort keys %query) {
                print "<LI>$key: $query{$key}</LI>\n"
                  unless ((grep {$_ eq $key} @hidden)||(!$query{$key}));
            }
        }
        elsif ($sort =~ /^order:.+,.+/) {
            $sort =~ s/order://;
            @sorted = split(/,/, $sort);
            foreach $key (@sorted) {
                if ($query{$key}) {
                    print "<LI>$key: $query{$key}</LI>\n"
                      unless ((grep {$_ eq $key} @hidden)||(!$query{$key}));
                }
            }
        }
        else {
            while (($key,$value) = each %query) {
                print "<LI>$key: $value</LI>\n"
                  unless ((grep {$_ eq $key} @hidden)||(!$value));
            }
        }
        print "</UL>\n";

        # check if closing Table tags are needed
        if (!$query{'no_table'}) {
            print "</FONT>\n" if $font;
            print "</TD></TR>\n</TABLE>\n";
        }

        print "<P><HR width=\"75\%\" size=7>\n";

        # Check for a Return Link
        if ($query{'return_link_url'} =~ /http\:\/\/.*\..*/) {
            print "<UL>\n<LI><A href=\"$query{'return_link_url'}\">";
            print $query{'return_link_title'} || $query{'return_link_url'};
            print "</A></LI>\n</UL>\n";
        }
        print "</CENTER><P><HR></P>\n<P align=\"center\"><FONT size=-1>\n",
              "<A href=\"",
              "http://www.t2c.dk\"></A></P>\n";


        print "</FONT>\n" if $font;
        print "</BODY>\n</HTML>\n";
    }

}

sub sendmail {
    my ($iaddr, $paddr, $proto, $a, $i);
    my $debug = ($doLog == 2 or $clmode);
    my $subject = $query{'subject'} || "WWW Form Submission";
    my $from = $query{'email'} || "$return_addr";
    my $retaddr = $from;
    if ($query{'realname'}) {
        $retaddr = '"'.$query{'realname'}.'"'." <$from>";
    }
    &error("No recipient!") unless $query{'recipient'};
    my @TO = split(/,/,$query{'recipient'});

    $port ||= 25;
    $port = getservbyname($port,'tcp') if $port =~ /\D/;
    error("Port not valid.") unless $port;   
   
    print "Resolving hostname for $smtpserver..." if $clmode;
    $iaddr = inet_aton($smtpserver);
    error("Can not resolve hostname $smtpserver") unless $iaddr;
    print "ok\n" if $clmode;
    $paddr = sockaddr_in($port, $iaddr);
    $proto = getprotobyname('tcp');
    my $ipstring = inet_ntoa((unpack_sockaddr_in($paddr))[1]);
    print "Connecting to $ipstring..." if $clmode;
    socket(S, PF_INET, SOCK_STREAM, $proto) or error("socket call failed: $!");
    connect(S, $paddr) or error("Unable to connect to $ipstring on port $port: $! (possibly no route to host or connection refused by host)");
    print "ok\n" if $clmode;
    select(S); $| = 1; select(STDOUT);
   
    # session is initiated
    print "SMTP session initiated. Debug mode is on.\nCheck $maillogfile for",
          " details of session.\n" if $clmode;
    if ($debug) {
      open LOG, ">>$maillogfile" or error("Could not open logfile $maillogfile: $!");
      print LOG '='x79,"\n$date SMTP session with $ipstring on port $port\n",'='x79,"\n";
    }
    $a=<S>; print LOG strip($a) if $debug;
    error("SMTP error: $a") if $a !~ /^2/;
   
    print S "HELO localhost$CRLF";
    print LOG "HELO localhost\n" if $debug;
    $a=<S>; print LOG strip($a) if $debug;
    error("SMTP error: $a") if $a !~ /^2/;
   
    print S "MAIL FROM:$from$CRLF";
    print LOG "MAIL FROM:$from\n" if $debug;
    $a=<S>; print LOG strip($a) if $debug;   
    error("SMTP error: $a") if $a !~ /^2/;
   
    foreach $i(@TO) {
        print S "RCPT TO:<$i>$CRLF";
        print LOG "RCPT TO:<$i>\n";
        $a=<S>; print LOG strip($a) if $debug;
        error("SMTP error: $a") if $a !~ /^2/;
    }
   
    # send message body
    print S "DATA \n";
    print LOG "DATA \n";
    $a=<S>; print LOG strip($a) if $debug;
    error("SMTP error: $a") if $a !~ /^3/;
   
    print LOG "Sending messagebody...\n" if $debug;
    print S "From: $retaddr$CRLF";
    print S "To: $TO[0]";
    for ($i = 1; $i < @TO; $i++) {
        print S ",$TO[$i]";
    }
    print S "$CRLF";
    print S "Subject: $subject$CRLF";
    print S "Reply-To: $from$CRLF";
    print S "X-Mailer: Form2Mail v$version by Liquid Silver$CRLF";
    print S "Order fra T2C Network Group.$CRLF";
    print S "Sendt fra T2C´s hjemmeside";
    print S "$CRLF";

    # sort fields
    my ($key,$value,@sorted);
    my $sort = $query{'sort'} || '';
    if ($sort eq 'alphabetic') {
        foreach $key (sort keys %query) {
            next if grep {$_ eq $key} @hidden;
            next if (!$query{$key} && $query{'hide_blanks'});
            print S "$key: $query{$key}\n";
        }
    }
    elsif ($sort =~ /^order:.+,.+/) {
        $sort =~ s/order://;
        @sorted = split(/,/, $sort);
        foreach $key (@sorted) {
            if ($query{$key} || !$query{'hide_blanks'}) {
                print S "$key: $query{$key}\n"
                  unless (grep {$_ eq $key} @hidden);
            }
        }
    }
    else {
        while (($key,$value) = each %query) {
            print S "$key: $value\n"
              unless ((grep {$_ eq $key} @hidden)||(!$value && $query{'hide_blanks'}));
        }
    }
    print S "$CRLF$CRLF";

    # Send Environment variables
    my @env_report = split(/,/,$query{'env_report'} || '');
    my $env;
    foreach $env (@env_report) {
        print S "$env: $ENV{$env}$CRLF";
    }
    print S ".$CRLF";
    $a=<S>; print LOG strip($a) if $debug;
    print S "QUIT$CRLF";
    print LOG "QUIT\n\n\n" if $debug;
    close LOG if $debug;
    print "Mail transmitted.\n" if $clmode;
}

sub strip {
    $_ = $_[0];
    s/(\r|\n)//g;
    return "$_\n";
}

sub error {

    my ($error,@error_fields) = @_;
    my $missing_field;
   
    &build_body("Mail Error") unless $clmode;

    if ($error =~ /Bad Referer/) {
        print "<H1>Error @ T2C Network Group</H1>\n",
              "Ups, men du ber om <A href=\"",
              "http://www.t2c.dk/\">kontakt.pl</A>\n",
              "fra $ENV{'HTTP_REFERER'}, som ikke har adgang til dette CGI script.\n";
    }

    elsif ($error =~ /Blank Fields/) {
        print "<CENTER>\n<H1>Fejl: Tomme felter</H1>\n";
        print "<TABLE width=\"75\%\">\n<TR><TD>\n" unless $query{'no_table'};

        my $font = &check_font;
        print "Ups, men føljende felter var tomme i din order:\n<P>\n";

        # Print Out Missing Fields in a List.
        print "<DD><UL>\n";
        foreach $missing_field (@error_fields) {
            print "<LI>$missing_field</LI>\n";
        }
        print "</UL>\n<P><HR size=7>\nDisse felter SKAL være udfyldte før du kan ",
              "sende din order.\nVend tilbage til din <A href=\"java script:history.back();",
              "$ENV{'HTTP_REFERER'}\">order</A> og prøv igen.\n</P>\n";

        print "</FONT>" if $font;
        print "</TD></TR>\n</TABLE>\n" unless $query{'no_table'};
        print "</CENTER>\n";
    }
    else {
        my @recipients = split/,/,$query{'recipient'};
        print "<H2>Ups, en fejl er sket og din order er ikke sendt.</H2>\n",
              "Du kan sende en email direkte til <A href=\"mailto:$recipients[0]\">",
              "$recipients[0]</A>.\nTak.\n<P>Error message: $error</P>";
        if ($doLog) {
            if (open FILE,">>$maillogfile") {
                print FILE "$date $error\n";
                print FILE "***form2mail v$version, Perl v$], OS: $^O***\n" if $doLog == 2;
                close FILE;
            }
        }
    }
   
    print "</BODY></HTML>\n" unless $clmode;;
   
    exit;
}

sub build_body {
    my $title = $_[0] || "Tak for din order.";
    my ($bgcolor,$background,$link_color,$vlink_color,$alink_color,$text_color) =
    ( $query{'bgcolor'} || "#FFFFFF",
      $query{'background'},
      $query{'link_color'} || "#ffffff",
      $query{'vlink_color'} || "#ffffff",
      $query{'alink_color'} || "#ffffff",
      $query{'text_color'} || "#ffffff"
    );
    undef $background if $background !~ /^http(s)?\:\/\//i;
   
    print "HTTP/1.0 200 OK\r\n" if $ENV{PERLXS} eq "PerlIS"; # for perlIS.dll
    print "Content-type: text/html\n\n<HTML>\n<HEAD>\n  <TITLE>$title</TITLE>\n",
          "  </HEAD>\n<BODY ",
          "bgcolor=\"$bgcolor\" text=\"$text_color\" link=\"$link_color\"",
          "vlink=\"$vlink_color\" alink=\"$alink_color\"";
    print " background=\"$background\"" if $background;
    print ">\n"; 
}

sub check_font {
    my $font = 0;
    if ($query{'font_face'} && ($query{'font_face'} ne ' ')) {
        print "<FONT face=\"$query{'font_face'}\"";
        if ($query{'font_size'} && ($query{'font_size'} ne ' ')) {
            print " size=\"$query{'font_size'}";
        }
        print "\">\n";
        $font = 1;
    }
    return $font;
}

sub read_input {
    my ($buffer, @pairs, $pair, $name, $value, %FORM);
    # Read in text
    $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    } else {
        $buffer = $ENV{'QUERY_STRING'};
    }
    # Split information into name/value pairs
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs) {
        ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%(..)/pack("C", hex($1))/eg;
        # remove potentially dangerous commands
        $value =~ s/<!--(.|\n)*-->//g;
        $value =~ s/<([^>]|\n)*>//g;
        $FORM{$name} = $value;
    }
    %FORM;
}

DET VAR MAILFORMEN

#!/usr/bin/perl

#######################################
# FormMail-SMS.cgi                    #
# Copyright Ricki Runge for Script.dk #
# ricki@script.dk - www.script.dk    #
#######################################

$mailprog = '/usr/sbin/sendmail';

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@datain = split(/&/, $buffer);

foreach $data (@datain) {
$data =~ s/\+/ /g;
$data =~ s/%(..)/pack("c",hex($1))/ge;
($name, $value) = split(/=/, $data, 2);
$name = lc($name);
if ($name eq "mail_til") {
  $email = $value;
} elsif ($name eq "mail_fra") {
  $fra = $value;
} elsif ($name eq "mail_emne") {
  $emne = $value;
} elsif ($name eq "ok_html") {
  $ok_html = $value;
} elsif ($name eq "fejl_html") {
  $fejl_html = $value;
}
}

if ($email >= 20100000 && $email < 20600000) {
$udbyd = "sms.tdm.dk";
} elsif ($email >= 20600000 && $email < 21000000) {
$udbyd = "note.sonofon.dk";
} elsif ($email >= 21100000 && $email < 22000000) {
$udbyd = "sms.tdm.dk";
} elsif ($email >= 22100000 && $email < 23000000) {
$udbyd = "note.sonofon.dk";
} elsif ($email >= 23000000 && $email < 24000000) {
$udbyd = "sms.tdm.dk";
} elsif ($email >= 26100000 && $email < 26900000) {
$udbyd = "sms.mobilix.dk";
} elsif ($email >= 28100000 && $email < 28900000) {
$udbyd = "sms.mobilix.dk";
} elsif ($email >= 40100000 && $email < 40500000) {
$udbyd = "sms.tdm.dk";
} elsif ($email >= 40500000 && $email < 50000000) {
$udbyd = "note.sonofon.dk";
} else {
$udbyd = "";
}

$ud_html = $fejl_html;
if ($udbyd ne "") {
$email = "$email\@$udbyd";

open(MAIL,"|$mailprog -t");
print MAIL "To: $email\n";
print MAIL "From: $fra\n";
print MAIL "Subject: $emne\n\n";
print MAIL "\n";
close (MAIL);

$ud_html = $ok_html;
}
print "Location: $ud_html\n\n";

OG DET VAR SMS SCRIPTET

Kan du hjælpe mig?

Hilsen Tools
Avatar billede thomasledet Nybegynder
22. marts 2002 - 11:15 #1
Dit mailsende script kan næsten bruges som det er.

Når man vil sende sms'er fra internettet er der to måder man kan gøre det på:
1) Man kan sende dem som mails fx 20202020@sms.tdc.dk
2) Man kan benytte en sms-gateway...

Den rigtige måde at gøre det på, er nummer 2... imidlertid kræver det som sagt, at man har en sms gateway... sådan en er halvdyr og det koster ydermere at leje sig ind på telefonnettet og at sende sms'er.

Den anden måde virkede for et års tid siden... det var før man kunne skifte fra teleselskab til teleselskab uden at skifte nummer. Dengang kunne man, ud fra nummeret, se, hvilket teleselskab en person havde. man kunne fx se, at 20202020 var hos teledanmark, og man kunne derfor sende en mail til 20202020@sms.tdc.dk... nummeret 51627384 var hos sonofon og for det nummer kunne man så sende til 51627384@note.sonofon.dk.... man kunne altså se på nummeret, hvilket teleselskab man skulel sende en mail til... det kan man imidlertid ikke længere...  det er med andre ord blevet umuligt at bruge et sådan script som du har postet ovenstående...

mit råd til dig er derfor. Få fat på en sms-gateway, hvis projektet er meget vigtigt... besked.dk og coolsms benytter sig begge af en sms-gateway. Er projektet bare til en privat hjemmeside, undlad da at spille mere tid på projektet... det kan simpelthen ikke lade sig gøre. Benyt i stedet en af de to førnævnte services.
Avatar billede keysersoze Ekspert
22. marts 2002 - 11:22 #2
jeg tvivler på at du vil få det store ud af at sætte sådan en sms-sender op... selskaberne kræver nu penge for ydelsen, og derfor lukker flere og flere af for sms via e-mail. desuden er e-mail metoden også ret usikker.

den eneste rigtige løsning er at få adgang til en såkaldt SMSC gateway - den sender på samme måde som var det fra en mobiltelefon, og sikkerheden er altså stor... desværre koster sådan en også kassen
Avatar billede thomasledet Nybegynder
22. marts 2002 - 12:00 #3
keysersoze> hvilket er præcis det samme som jeg lige har skrevet... :)
Avatar billede keysersoze Ekspert
22. marts 2002 - 12:19 #4
hov! gad ikke læse så meget igennem, så jeg skrev bare - sorry :)
Avatar billede darkside Nybegynder
22. marts 2002 - 17:23 #5
Du kan evt oxo kigge her..
http://www.webcafe.dk/artikler/perl/sms/
Avatar billede thomasledet Nybegynder
22. marts 2002 - 18:05 #6
darkside> det er nogenlunde samme script, som der er postet ovenstående... :)
Avatar billede tools Nybegynder
23. marts 2002 - 04:14 #7
Tak for den fine opklaring, men hva så hvis man kender de nummre som man skal bruge. Det skal ikke bruges som "ren" SMS service men mere som en hurtig besked service til vores medlemmer. De skal jo melde sig til denne service, så kunne man jo bare lave en from der spørger om hvad selskab de tilhører. Kan det så ikke lade sig gøre? Det komme nok til at dreje sig om ca. 20 nummre der skal sendes til. Er det ikke noget I måske kunne lave ? En form hvor man vælger selskab?
På forhånd MANGE tak!
Johnni
Avatar billede keysersoze Ekspert
23. marts 2002 - 10:23 #8
hehe... e-mail sms'er er bestemt ikke hurtige! det kan formentlig godt lade sig gøre - men inden for det næste stykke tid vil det formentlig blive umuligt at sende sms'er via e-mail da selskaberne ikke tjener penge på disse
Avatar billede flarup Nybegynder
18. april 2002 - 12:54 #9
keysersoze > Det vil da fortsat være en vigtig feature for teleselskaberne at man f.eks. kan få sendt en sms når man har e-mail. Jeg har været ved at true TDC med at finde en anden operatør hvis de ikke kunne finde ud af at få deres e-mail gateway til at virke.
Avatar billede keysersoze Ekspert
18. april 2002 - 15:43 #10
ja - det er en smart feature... men selskaberne tjener ikke noget på det, og det vil det de vil. og det er ikke kun TDC der vil lukke for den.
Avatar billede thomasledet Nybegynder
18. april 2002 - 18:18 #11
tools> Det kan sagtens lade sig gøre, at sende til folk, hvis man ved, hvilken udbyder de bruger... du kunne også lave en dropdown boks, hvor man kan vælge, hvilket selskab, der benyttes - hvis man altså ved det...
Avatar billede tools Nybegynder
19. april 2002 - 13:53 #12
Tak for svarene I har fået lige mange points!
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

Seneste spørgsmål Seneste aktivitet
1 min siden Libre Office Impress Af Frank i Andre styresystemer
I dag 11:47 VB script Af Jenshentze i Word
I dag 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel