Bramka email2sms

12 stycznia 2009 13:39:19
Wpis na 0. poziomie w kategorii Internet.Linux.Techblog.

Ostatnio zamówiłem kartę sim z sieci WPmobi ściągnęła mnie do niej ciekawość i 100MB darmowego transferu do wp.pl ;) Jednak sms'y poza sieć są dość drogie więc dlaczego by nie używać e-maili do komunikacji skoro są one w zasadzie za friko?

E-mail w telefonie nie jest niestety zbyt popularnym środkiem komunikacji jeśli chodzi o telefony komórkowe, na nich nadal królują sms'y. Więc jak wysłać e-mail żeby doszedł jako sms? Plus udostępnia darmową bramkę sms, wystarczy wysłać wiadomość na 48XXXYYYZZZ@text.plusgsm.pl, niewielu moich znajomych ma numer z tej sieci więc to nie rozwiązuje problemu w całości.
Nie wiem czy Era lub Orange oferują podobną usługę, gdyż mimo moich poszukiwań nie znalazłem informacji o czymś podobnym. Zacząłem więc szukać serwisów, które podobną funkcjonalność oferują, ku mojemu zdziwieniu znalazłem! Jednak ceny i brak kilku darmowych sms'ów skutecznie mnie odstraszyły.
Zainteresowałem się więc bramką smsfree.pl, oferuje ona 5 darmowych sms'ów dziennie doklejając do nich tylko "/smsfree.pl" na końcu. Dodatkowo można wykupić kredyty w stosunkowo niskiej cenie.

Mój pomysł wygląda następująco:

  1. wysyłamy e-mail na jakąś własną skrzynkę (o strukturze: tytuł: nr tel, treść: treść sms'a
  2. program odbiera e-mail
  3. program wysyła curlem zapytanie do bramki

Oczywiście to rozwiązanie ma swoje wady:

  1. potrzebny jest własny serwer (ew. konto shell)
  2. połączenie z internetem może czasem nawalić
  3. trochę długo trwa wysłanie sms'a
  4. reklama na końcu sms'a

Poniżej przedstawiam kod, który jakoś udało mi się wyklepać jestem pewien, że można to by napisać: lepiej, czytelniej, szybciej itp. (a na dodatek kod wchodzi trochę pod szablon ;p) ale mi w zupełności wystarcza bo jakoś działa. Jeśli komuś się pomysł spodoba (bo kod raczej nie ;) ) to bardzo dobrze, a jeśli nie to nic nie szkodzi bo robiłem to głównie dla siebie.

 
#!/usr/bin/python
import poplib,os
 
#login i haslo bramki
Blogin = ''
Bpass = ''
#email, haslo i adres serwera pop3
Mmail = ''
Mpass = ''
Mserver = ''
##########################################
def send_sms(number,text,id):
	curl = 'curl -s -d "numer_global='+Blogin + '&password_global='+Bpass
	curl = curl + '" http://www.smsfree.pl/index.php -c ciastek.txt > /dev/null'
	os.system(curl)
	curl = 'curl -s -b ciastek.txt -d "what=sms&kody=48&numer='+number +'&tariff='
	curl = curl + id+'&podpis=48'+Blogin+'&submit=Przeslij sms\'a&text=' + text
	curl = curl + '" http://www.smsfree.pl/index.php > /dev/null'
	os.system(curl)
 
def check():
	m = poplib.POP3(Mserver)
	m.user(Mmail)
	m.pass_(Mpass)
	num = len(m.list()[1])
	file= open('licznik','r') #licznik w trzymany w pliku na wypadek wyłączenia serwera etc..
	if (int(file.read())==int(num)):
#	print 'pusto w tej skrzynce..'
		file.close()
		return 0
	else:
#  print 'jest mail - wysylam sms'
		file.close()
		return 1
 
 
def send():
	m = poplib.POP3(Mserver)
	m.user(Mmail)
	m.pass_(Mpass)
	num = len(m.list()[1])
	numer = m.retr(num)[1][17][9:] # wycinanie numeru z tematu
	body = m.retr(num)[1][28]
	body = body[:len(body)-1] #wycinanie ostatniego znaku
	send_sms(numer,body,'1') # (z niewiadomych mi przyczyn dodaje się tam znak '=')
#  print 'sms poszedl..'
	file = open('licznik','w')
	file.write(str(num))
	file.close()
 
 
while(1): #pętla główna 
	try:
		if(check()):
			send()
	except:
		pass
	os.system('sleep 15')
 
 
 

Prawdopodobnie jeśli ten skrypt będzie używany inaczej niż w konfiguracji: poczta wp -> poczta gery.pl to nie będzie działał prawidłowo. Trzeba metodą prób i błędów sprawdzić co jest zwracane w jakiej komórce: m.retr(num)[1][].
W kodzie nie mogłem użyć biblioteki pycurl ponieważ nie jest ona zainstalowana na serwerze na którym mam konto. Oczywiście nic nie szkodzi na przeszkodzie żeby z niej skorzystać.