Jste zde: kle.cz » Linux » SMS server tools
SMS server tools 3 od Keijo Kasviho je výborná věc pro posílání SMS z unixu. Jednou jsem to nastavil. A od té doby to funguje :^)
devices = MODEM1 logfile = /var/log/sms/smsd.log infofile = /var/spool/sms/smsd.working pidfile = /var/spool/sms/smsd.pid loglevel = 5 autosplit = 2 eventhandler = /usr/local/bin/smsevent.sh user = sms group = sms # SIEMENS TC35 [MODEM1] device = /dev/ttyS0 init = AT+CNMI=2,0,0,2,1 incoming = yes pin = 1234 report = yes
Odesílání a příjmu SMS můžeme nastavit libovolnou událost.
#!/bin/sh if [ "$1" = "RECEIVED" ]; then TEL=`cat $2 | grep "From: " | cut -d" " -f2` echo "From: auto-reply To: $TEL Validity: 169 Report: no Flash: yes Alphabet: ISO Dobry den, dekujeme za Vase hlasovani v ankete." > `mktemp /var/spool/sms/outgoing/XXXXXX` fi
Jestli chcete odesílat SMS z emailu stačí nastavit doručování z adresy např.: sms@firma.cz do příkazu mail2sms.pl
#!/usr/bin/perl
use Net::SMTP;
use Mail::Header;
use MIME::QuotedPrint;
sub generate_random_string
{
my $length_of_randomstring=shift;# the length of
my @chars=('a'..'z','A'..'Z','0'..'9');
my $random_string;
foreach (1..$length_of_randomstring)
{
$random_string.=$chars[rand @chars];
}
return $random_string;
}
sub trim($)
{
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
my $formail = "/usr/bin/formail";
my $sendmail = "/usr/sbin/sendmail";
# read mail from standard input
while ($line = <STDIN>){
$mail = $mail.$line;
chop($line);
push(@mail,$line);
}
my $sender=$ARGV[0];
my $cisla=`echo "$mail" | $formail -c -x "Subject: "`;
chomp($cisla);
$cisla=trim($cisla);
$cisla=~s/\+//g;
$cisla=~s/ //g;
$cisla=~s/,/;/g;
@cisla=split(/;/,$cisla);
my $datadir="/var/spool/sms/reply";
$hlavka=1;
foreach $radek(@mail){
if($radek!~/^[\r\n]*$/){
if($hlavka == 1){
push(@hlavicka,$radek);
}else{
push(@telo,$radek);
}
}else{
$hlavka=$hlavka*0;
}
}
foreach $radek(@telo){
$telo.="$radek\n";
}
use Cz::Cstocs;
my $win_ascii = new Cz::Cstocs '1250', 'ascii';
my $iso_ascii = new Cz::Cstocs 'il2', 'ascii';
my $utf_ascii = new Cz::Cstocs 'utf8', 'ascii';
foreach $radek(@hlavicka){
if($radek=~/Content-Type: text.*charset=ISO-8859-2/){
$telo=&$iso_ascii($telo);
}
if($radek=~/Content-Type: text.*charset=UTF-8/){
$telo=&$utf_ascii($telo);
}
}
chomp($telo);
if(length($telo)>160){
$smtp = Net::SMTP->new('mail.firma.cz');
$smtp->mail("no-reply\@firma.cz");
$smtp->to($sender);
$smtp->data();
$smtp->datasend("To: $sender\n");
$smtp->datasend("From: no-reply\@firma.cz\n");
$smtp->datasend("Subject: =?ISO-8859-2?Q?Zpr=E1vu_nelze_odeslat?=\n");
$smtp->datasend("Content-Type: text/plain; charset=ISO-8859-2; format=flowed\n");
$smtp->datasend("Content-Transfer-Encoding: 8bit\n");
$smtp->datasend("X-Priority: 3 (Normal)\n");
$smtp->datasend("Importance: Normal\n");
$smtp->datasend("Precedence: bulk\n");
$smtp->datasend("\n");
# Send the body.
$smtp->datasend("$telo\n");
$smtp->datasend("\nSMS zprávu nelze odeslat. Je delší než 160 znaků.\n");
$smtp->dataend();
$smtp->quit;
exit 0;
}
foreach $cislo(@cisla){
if($cislo=~/42[01]........./){
my $random_string=&generate_random_string(11);
open(VYSTUP,">","/var/spool/sms/outgoing/send_$random_string");
print VYSTUP "From: $sender\n";
print VYSTUP "To: $cislo\n";
print VYSTUP "Autosplit: 2\n";
print VYSTUP "Validity: 169\n";
print VYSTUP "Report: yes\n";
print VYSTUP "Alphabet: ISO\n";
print VYSTUP "\n";
print VYSTUP "$telo";
close VYSTUP;
$datum=`date +%s`;
chomp($datum);
system("echo \"$sender:$datum\" >> $datadir/$cislo");
$smtp = Net::SMTP->new('mail.firma.cz');
$smtp->mail("no-reply\@firma.cz");
$smtp->to($sender);
$smtp->data();
$smtp->datasend("To: $sender\n");
$smtp->datasend("From: no-reply\@firma.cz\n");
$smtp->datasend("Subject: =?ISO-8859-2?Q?Zpr=E1va_pro_$cislo?=\n");
$smtp->datasend("Content-Type: text/plain; charset=ISO-8859-2; format=flowed\n");
$smtp->datasend("Content-Transfer-Encoding: 8bit\n");
$smtp->datasend("X-Priority: 3 (Normal)\n");
$smtp->datasend("Importance: Normal\n");
$smtp->datasend("Precedence: bulk\n");
$smtp->datasend("\n");
$smtp->datasend("$telo\n");
$smtp->datasend("\nSMS zpráva pro $cislo byla zařazena do fronty k odeslání.\n");
$smtp->dataend();
$smtp->quit;
}else{
$smtp = Net::SMTP->new('mail.firma.cz');
$smtp->mail("no-reply\@firma.cz");
$smtp->to($sender);
$smtp->data();
$smtp->datasend("To: $sender\n");
$smtp->datasend("From: no-reply\@firma.cz\n");
$smtp->datasend("Subject: =?ISO-8859-2?Q?Zpr=E1vu_nelze_odeslat?=\n");
$smtp->datasend("Content-Type: text/plain; charset=ISO-8859-2; format=flowed\n");
$smtp->datasend("Content-Transfer-Encoding: 8bit\n");
$smtp->datasend("X-Priority: 3 (Normal)\n");
$smtp->datasend("Importance: Normal\n");
$smtp->datasend("Precedence: bulk\n");
$smtp->datasend("\n");
$smtp->datasend("SMS lze zasílat jen na čísla ve tvaru +420 xxx xxx xxx a +421 xxx xxx xxx\n");
$smtp->datasend("Na číslo $cislo nelze zprávu odeslat.\n");
$smtp->datasend("\n\n$telo\n\n");
$smtp->dataend();
$smtp->quit;
}
}
exit 0;
Neperlím moc často, tak si neberte příklad z mého stylu. Například detekce kódování mailu není univerzální. Skript neřeší ani HTML maily.