SMS server tools

Jste zde: »  » 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 :^)

smsd.conf

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

smsevent.sh

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

mail2sms.pl

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.

Úvodní stránka ~ Mapa stránek ~ Kontakt