Powiadomienia SMS mBank mobile — drugie podejście
Dwa miesiące temu przedstawiłem dwa sposoby w jaki można sobie uruchomić powiadomienia SMS od aplikacji lub o przychodzących mailach. Oba miały pewne wady więc zdecydowałem się powrócić do tematu raz jeszcze.
Pierwszym rozwiązaniem, było wykorzystanie +48xxxxxxxxx@text.plusgsm.pl Rozwiązanie dobre, bo dostajemy natychmiast powiadomienie na komórkę. Dodatkowo większość skrzynek pocztowych ma możliwość ustawienia automatycznej kopii na drugi adres — więc w dosłownie chwilę możemy sobie ustawić automatyczne powiadomienie o mailach.
Rozwiązanie to ma jednak swoją wadę — dostajemy pełną treść, która nie zmieści się w jednym SMS'ie jeśli w mailu jest jakakolwiek treść poza samym tematem.
Drugim zasugerowanym przeze mnie rozwiązaniem było wykorzystanie możliwości wysyłania powiadomień SMS z Google Calendar. To rozwiązanie również jest dobre. Możemy wykorzystać konto w Google Apps, dzięki czemu adres powiadomień jest bardziej uniwersalny, ale ma też swoje wady — chodzi mianowicie o dzienny limit powiadomień SMS z kalendarza Google. Jak się przekonałem, taki limit jest. Dokładnej liczby nie znam, ale w przybliżeniu to około 25 SMS'ów.
Rozwiązanie optymalne?
Postanowiłem zatem poszukać czegoś po środku. Wykorzystałem obsługę skrzynki Google do pobierania wiadomości, a następnie jedynie nadawcę i temat przekazuje do usługi text.plusgsm.pl. Wydaje mi się, że rozwiązanie jest optymalne. Oto kod:
#!/usr/bin/env python
# -- encoding: utf8 --
__author__ = 'mw AT nme.pl'
__version__ = '1.4'
__date__ = 'pią, 25 wrz 2009, 13:22:28 CEST'
class setup:
verbose = False
class google:
login = 'KONTO@GOOGLE'
password = 'HASŁO'
class notify:
recipient="+48xxxxxxxxx@text.plusgsm.pl"
import poplib
import email
import email.Header
#import sms
import smtplib
import re
class Fwd:
def __init__(self,address,subject):
mesg = "From: %s\nTo: %s\nSubject: %s\n\n" % (address, setup.notify.recipient, subject)
server = smtplib.SMTP('smsb.plusgsm.pl')
if setup.verbose:
server.set_debuglevel(1)
server.sendmail (address, setup.notify.recipient, mesg)
server.quit()
class Mailbox:
def __init__(self):
self.server = poplib.POP3_SSL('pop.gmail.com', 995)
self.server.user(setup.google.login)
self.server.pass_(setup.google.password)
self.server.set_debuglevel(0)
# fetch
count = self.server.stat()[0]
if setup.verbose:
print count
if count:
for i in range(1,count+1):
(header, msg, octets) = self.server.retr (i)
mail = email.message_from_string('\n'.join(msg))
address = email.Header.decode_header(mail['From'])[1]
if address[1]:
address = address[0].decode(address[1],'ignore')
else:
address = address[0]
address = re.sub('>\s*$','',re.sub('^\s*< ','',address))
subject = email.Header.decode_header(mail['Subject'])[0]
if subject[1]:
subject = subject[0].decode(subject[1],'ignore')
else:
subject = subject[0]
#print subject
#sms.parse(subject.split())
Fwd(address,subject)
#self.server.dele (i)
# commit
self.server.quit()
mbox = Mailbox()
Aby te powiadomienia działały, na koncie shellowym umieszczamy skrypt, nadajemy mu prawa do uruchomienia, przechodzimy do edycji crona:
chmod +x pop2smsV2.py
crontab -e
dodajemy zadanie do crona, aby był uruchamiany co minutę:
* * * * * /home/NAZWA/bin/pop2smsV2.py >/dev/null 2>&1
Podsumowanie
Teraz to rozwiązanie najbardziej przypomina mi to które miałem w Erze. Trzeba niestety użyć do tego shella z cronem. OVH odpada z dwóch powodów — brak crona oraz brak dostępu do sieci z poziomu shella. Może i by się dało uruchomić to jako CGI z ich webowym cronem, ale niestety mija się to trochę z celem, ponieważ cron OVH może być uruchamiany najczęściej co godzinę.
Przewagą tego rozwiązania nad powiadomieniem z Ery jest brak limitu skrzynki 12 MB. Limitem jest ponad 7 GB co nie stanowi już problemu. Jeśli nie chcemy zostawiać na skrzynce śladu — możemy usunąć komentarz z linii self.server.dele (i) — co spowoduje kasowanie przesłanych jako SMS wiadomości.
Zaletą obsługi powiadomień za pomocą crona jest to, że możemy ustalić sztywne godziny w których skrypt ma działać — możemy ustawić, że powiadomienia mogą przychodzić pomiędzy 8:00, a 16:00 oraz 18:00 — 22:00 (trzeba się wtedy liczyć z faktem, że o ósmej rano otrzymamy wszystkie SMS'y z nocy). Jeśli chcemy mieć powiadomienia aktywne w godzinach 8:30 — 22:30, robimy to następującymi regułami:
30-59 8 * * * /home/nme/sms-notify/pop2smsV2.py >/dev/null 2>&1 * 9-21 * * * /home/nme/sms-notify/pop2smsV2.py >/dev/null 2>&1 0-30 22 * * * /home/nme/sms-notify/pop2smsV2.py >/dev/null 2>&1
Dodatkowo — dzięki temu rozwiązaniu mamy adres do powiadomień, znacznie łatwiejszy do zapamiętania — bo w postaci np. powiadomienia@nasza-domena.pl 





