Author |
Post |
|
#1 Fri May 28, 2010 20:01, 176 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
|
this perl script process MIME headers and work correct with not-latin messages #!/usr/bin/perl -w
### Maximal SMS body size in bytes, must be even for UCS-2 ### remember - SHORT Message Service my $maxsmssize = 1024;
### Default directories our $spool_dir = '/var/spool/sms/outgoing/'; our $tmp_dir = '/tmp/';
sub usage { die <<EOF; E-mail to SMS converter with non-latin charsets suppport
Usage: $0 -n number [-s spool_dir] [-t tmp_dir] [-d] < email-file -n number phone number in international format -s spool_dir outgoing spool directory default: $spool_dir -t tmp_dir temporary directory default: $tmp_dir -d dry-run (do not spool message)
Designed to be used with smstools (http://smstools3.kekekasvi.com)
WARNING! Large e-mail messages can cause DoS. Limit the size of messages on the mail server.
EOF }
use MIME::Parser; use Encode qw/resolve_alias encode decode/; use Getopt::Std; use File::Temp qw/ tempfile tempdir /; use File::Copy;
my $default_charset = 'ascii';
my %options; getopts( 'n:ds:t:' , \%options );
unless ( defined $options{n} ) { usage(); }
my $to = $options{n}; my $dry = $options{d}; $spool_dir = ( $options{s} or $spool_dir ); $tmp_dir = ( $options{t} or $tmp_dir ); my $tmpfilename;
my $tfh; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $mon++; $year -= 100; # sorry
umask 0113;
($tfh, $tmpfilename) = tempfile( sprintf("SMS-%02d.%02d.%02d-%02d:%02d:%02d-XXXX", $year, $mon, $mday, $hour, $min, $sec), DIR => $tmp_dir);
open TMP, ">&=", $tfh;
$to =~ s/[ -\.\(\)]//g; # (987)654-32-10 -> 9876543210 $to =~ s/^\+?(\d*)$/$1/ or die "Bad number '$options{n}'?\n";
### Short numbers must be prefixed with 's' char if ( length($to)<5 ) { $to = 's' . $to; }
print TMP "To: $to\n";
### Create parser, and set some parsing options: my $parser = new MIME::Parser;
### SMS will be very small #$parser->output_under("/tmp"); $parser->output_to_core(1); $parser->tmp_to_core(1);
my $entity = $parser->parse(\*STDIN) or die "parse failed\n";
my $main_ent=$entity;
if (my $num_parts = $entity -> parts()){ for my $i (1..$num_parts){ my $e=$entity->parts($i-1); if($e->head()->mime_attr('content-type') eq 'text/plain'){ $main_ent=$e; last; } } }
my $charset = ( $main_ent->head()->mime_attr('content-type.charset') or $default_charset ); $charset = ( resolve_alias($charset) or $default_charset );
my $u8 = decode($charset, $main_ent->bodyhandle->as_string); my $ascii = encode("ascii", $u8); my $smsbody;
if ($u8 eq $ascii) { $smsbody = $ascii; } else { print TMP "Alphabet: UCS\n"; $smsbody = encode('ucs-2be',$u8); }
if (length($smsbody) > $maxsmssize) { print STDERR "too large message $tmpfilename, truncated to $maxsmssize bytes\n"; $smsbody = substr($smsbody, 0, $maxsmssize); } print TMP "\n",$smsbody;
close TMP;
if ($dry) { print "SMS saved to $tmpfilename\n"; } else { move $tmpfilename, $spool_dir or die "moving $tmpfilename to $spool_dir failed\n"; } 'perl' Syntax Highlight powered by GeSHi for example you can use it with exim pipe transport:
|
|
#2 Fri Dec 16, 2011 16:02, 157 months ago.
|
Member
Registered: Dec 2011
Location: Germany
|
Hi,
i use postfix with procmail to execute email2sms (example skript). Now i have to send some mime mails. The orginal script doesn't find any destination. How can i use the shown script with procmail & postfix? I've no idea to integrate it with procmail. Thank you for your help.
Best regards.
|
|
#3 Sat Dec 17, 2011 07:18, 157 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
I suppose that procmail using is not very good idea, because mail can have more than one recipient and only MDA will handle this situation correctly. I'm unfamiliar with postfix, but according to man it have possibility to run external scripts: http://www.postfix.org/pipe.8.html
|
|
#4 Sun Apr 22, 2012 15:13, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
sms_pipe: driver = pipe command = "/usr/local/bin/email2sms-ucs -n $local_part"
How to configure pipe in postfix - master.cf
smstools unix - n n - - pipe ? flags=DORhu user=smstools argv=/usr/local/bin/email2sms-ucs ?
Thanks Robert
|
|
#5 Sun Apr 22, 2012 21:13, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
Starting with aliases (sms: "| / usr/local/bin/email2sms-ucs.pl") causes errors: What's the problem? Thx Robert
|
|
#6 Mon Apr 23, 2012 09:42, 153 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
what happens if you execute /usr/local/bin/email2sms-ucs.pl from command line?
|
|
#7 Mon Apr 23, 2012 15:23, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
I did not use the first line in script #!/usr/bin/perl -w, and I have another problem: Thx Robert
|
|
#8 Mon Apr 23, 2012 15:46, 153 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
You must specify recipient number.
I look to http://www.postfix.org/pipe.8.html It seems like you need add "-n ${user}" argument to email2sms-ucs.pl call
Another thing - email2sms-ucs.pl expect only one recipient per call, so you need specify "transport_destination_recipient_limit = 1" (look to start of man page)
|
|
#9 Mon Apr 23, 2012 17:48, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
I added the line in main.cf: mailbox_transport = smstools transport_destination_recipient_limit = 1 I set the master cf: smstools unix - n n - - pipe flags=DORhu user=smstools argv=/usr/local/bin/email2sms-ucs.pl Unfortunately it does not work , what is the simplest configuration to make it work for postfix?, I'm a novice to set up, please do not send me back to manuals, I'm losing hope it will work ... Best regards Robert « Last edit by Jufo on Mon Apr 23, 2012 17:50, 153 months ago. »
|
|
#10 Mon Apr 23, 2012 18:47, 153 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
I surmise: but I don't use postfix, so I can't test
|
|
#11 Mon Apr 23, 2012 19:08, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
It is better but no logs in smsd.log and do not get sms :/ Thx Robert « Last edit by keke on Sun Jun 03, 2012 15:17, 151 months ago. »
|
|
#12 Mon Apr 23, 2012 19:47, 153 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
I use exim with very easy configuration, you can see most of it in first post. I think you need do some debugging. Firstly save message from your mail client and try process it with email2sms-ucs.pl: « Last edit by keke on Sun Jun 03, 2012 15:18, 151 months ago. »
|
|
#13 Mon Apr 23, 2012 21:29, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
When you start: Log /var/log/smsd/smsd.log is clean (only standard massages - Waiting for messages to send...etc), nothing happens :/ Selftest "sms to gsm" is working (su smstools -c "smssend 48XXXXXXXXX 'The Test GSM module.'") - Then, of course, logs are generated. « Last edit by Jufo on Mon Apr 23, 2012 21:34, 153 months ago. »
|
|
#14 Mon Apr 23, 2012 22:18, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
I ran everything on another virtual machine, tomorrow I'll analyze what I broken, I suspect Perl liblary and dns server.
Thank you very much Robert
|
|
#15 Tue Apr 24, 2012 07:20, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
I's works! In the evening I'll try to share configuration in this Topic How do I modify the script to create two rules, the selection by the sender (DeliveredTo) ?: 1. The rule in your script 2. Number phone is the subject, the message content is the content of email sms Thx Robert
|
|
#16 Tue Apr 24, 2012 07:50, 153 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
sorry, I'm too busy now, may be on next week... but you can use procmail for this task.
|
|
#17 Tue Apr 24, 2012 20:14, 153 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
1. Configuration in postfix: - In main.cf add line: mailbox_transport = smstools transport_destination_recipient_limit = 1 -In master.cf add line: smstools unix - n n - - pipe flags= user=smstools argv=/usr/local/bin/email2sms-ucs.pl -n ${user} 2. smstools is default user for smstools, please change permmision for script (to chmod +x /usr/local/bin/email2sms-ucs.pl) 3. Restart postfix service and enjoy 3. To edo, I'll wait for you, in this second rule just changed from To (recipient) on the Subject (only telephone numer). It remains to choose the rules by the sender. Thx Robert
|
|
#18 Mon Jul 02, 2012 12:25, 150 months ago.
|
Member
Registered: Jun 2012
Location: Netherlands
|
I am trying to get it working to.. but i'am unsuccessful so far. I have smstools3 working and postfix to.
When i run /usr/local/bin/email2sms-ucs.pl -n +316..... < /var/mail/root
it works!
But when i send a email to root@domein.nl its not working.
My master.cf
smstools unix - n n - - pipe flags= user=root argv=/usr/local/bin/email2sms-ucs.pl -n ${user}
How can i debug?
|
|
#19 Mon Jul 02, 2012 14:49, 150 months ago.
|
Member
Registered: Jun 2012
Location: Netherlands
|
Now i get this in my postfix log
|
|
#20 Mon Jul 02, 2012 15:45, 150 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
snowrabbit wrote But when i send a email to root@domein.nl its not working.
why recipient address is not 316...@domein.nl?
|
|
#21 Mon Jul 02, 2012 19:26, 150 months ago.
|
Member
Registered: Apr 2012
Location: Warsaw, Poland
|
snowrabbit wrote How can i debug?
Ok, check configuration main.cf, my configuration: myhostname = "yourservername.domain" mydomain = "domain" myorigin = $mydomain inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, monitoring.local local_recipient_maps = mynetworks = "192.168.1.0/24", 127.0.0.0/8 mailbox_transport = smstools transport_maps = hash:/etc/postfix/transport (transportmaps for other domain for smtp) transport_destination_recipient_limit = 1 Robert
|
|
#22 Tue Jul 03, 2012 18:35, 150 months ago.
|
Member
Registered: Jun 2012
Location: Netherlands
|
Got it working! Thx for the debug tips!
|
|
#23 Mon Aug 06, 2012 11:13, 149 months ago.
|
Member
Registered: Aug 2012
Location: Austria
|
Dear All, I always get following error message: Aug 6 10:48:57 pandora postfix/smtpd[21239]: connect from ws122.local[10.12.16.122] Aug 6 10:48:57 pandora postfix/smtpd[21239]: C48051356B8: client=ws122.local[10.12.16.122] Aug 6 10:48:57 pandora postfix/cleanup[21242]: C48051356B8: message-id=<> Aug 6 10:48:57 pandora postfix/qmgr[21210]: C48051356B8: from=<sms@pandora.local>, size=673, nrcpt=1 (queue active) Aug 6 10:48:57 pandora postfix/smtpd[21239]: disconnect from ws122.local[10.12.16.122] Aug 6 10:48:58 pandora postfix/pipe[21244]: C48051356B8: to=<+43xxxxxxxxxxxx@pandora.local>, orig_to=<sms@pandora.local>, relay=smstools, delay=0.27, delays=0.11/0/0/0.15, dsn=5.3.0, status=bounced (Command died with status 255: "/usr/local/bin/email2sms-ucs.pl". Command output: Can't call method "as_string" on an undefined value at /usr/local/bin/email2sms-ucs.pl line 103, <STDIN> line 20. ) Aug 6 10:48:58 pandora postfix/cleanup[21242]: 107D81356C7: message-id=<20120806084858.107D81356C7@pandora.local> Aug 6 10:48:58 pandora postfix/qmgr[21210]: 107D81356C7: from=<>, size=2898, nrcpt=1 (queue active) Aug 6 10:48:58 pandora postfix/bounce[21246]: C48051356B8: sender non-delivery notification: 107D81356C7 Aug 6 10:48:58 pandora postfix/qmgr[21210]: C48051356B8: removed Aug 6 10:48:58 pandora postfix/pipe[21244]: 107D81356C7: to=<+43xxxxxxxxxxxx@pandora.local>, orig_to=<sms@pandora.local>, relay=smstools, delay=0.11, delays=0.03/0/0/0.08, dsn=2.0.0, status=sent (delivered via smstools service) Aug 6 10:48:58 pandora postfix/qmgr[21210]: 107D81356C7: removed The mail is being moved to /var/spool/sms/checked Content of the SMS file looks very strange. To: 43xxxxxxxxxxxx This is the mail system at host pandora.local I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below. For further assistance, please send mail to postmaster. If you do so, please include this problem report. You can delete your own text from the attached returned message. The mail system <+43xxxxxxxxxxxx@pandora.local> (expanded from <sms@pandora.local>): Command died with status 255: "/usr/local/bin/email2sms-ucs.pl". Command output: Can't call method "as_string" on an undefined value at /usr/local/bin/email2sms-ucs.pl line 103, <STDIN> line 20. I'm using Postfix like described above. Am i missing some perl module here? Kind regards Jens « Last edit by jens on Mon Aug 06, 2012 11:15, 149 months ago. »
|
|
#24 Tue Aug 07, 2012 12:45, 149 months ago.
|
Member
Registered: Aug 2012
Location: Austria
|
Problem solved:
My mail client was sending mails using "html" format. Changed this to "plain text" now it's working.
Many thx! Jens
|
|
#25 Tue Aug 07, 2012 12:51, 149 months ago.
|
Member
Registered: May 2010
Location: Russian Federation
Topic owner
|
jens wrote <+43xxxxxxxxxxxx@pandora.local> (expanded from <sms@pandora.local>): Command died with status 255: "/usr/local/bin/email2sms-ucs.pl". Command output: Can't call method "as_string" on an undefined value at /usr/local/bin/email2sms-ucs.pl line 103, <STDIN> line 20.
can you send problem mail message to edo.rus@gmail.com? (save it to file and send me this file)
|