| author | Sandro Knauß <knauss@netzguerilla.net> |
| Wed, 21 Mar 2012 19:43:36 +0100 | |
| branch | devel |
| changeset 240 | 3406d3bf05d4 |
| parent 236 | 63662db5ff25 |
| child 244 | 48fba7b4afe9 |
| permissions | -rw-r--r-- |
| 9 | 1 |
# -*- coding: utf-8 -*- |
2 |
#Copyright (C) 2009 Georg Bischoff |
|
3 |
||
4 |
#This program is free software; you can redistribute it and/or modify it under the terms |
|
5 |
#of the GNU General Public License as published by the Free Software Foundation; |
|
6 |
#either version 3 of the License, or any later version. |
|
7 |
#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
|
8 |
#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
9 |
#See the GNU General Public License for more details. |
|
10 |
||
11 |
#You should have received a copy of the GNU General Public License |
|
12 |
#along with this program; if not, see <http://www.gnu.org/licenses/>. |
|
13 |
||
14 |
||
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
15 |
import urllib |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
16 |
from functools import partial |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
17 |
from decimal import Decimal |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
18 |
#import copy |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
19 |
|
|
183
07ee5543751b
offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents:
180
diff
changeset
|
20 |
from ..config import Option |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
21 |
from ..model.status import Status |
|
180
55ab949cf0f8
providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
172
diff
changeset
|
22 |
from .provider import Provider, providers |
|
213
3620bacf1152
tests for error in smstrade API.
Sandro Knauß <knauss@netzguerilla.net>
parents:
186
diff
changeset
|
23 |
from ..error import RejectRecipient, ExternalException |
| 9 | 24 |
|
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
25 |
#import logging |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
26 |
#logger=logging.getLogger("smstrade") |
|
23
0180b538ed74
logging->logger wg. multiprocessing
Sandro Knauß <knauss@netzguerilla.net>
parents:
22
diff
changeset
|
27 |
|
|
214
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
28 |
statusCodes = {10 : "Empfaengernummer nicht korrekt.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
29 |
20 : "Absenderkennung nicht korrekt.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
30 |
30 : "Nachrichtentext nicht korrekt.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
31 |
31 : "Messagetyp nicht korrekt.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
32 |
40 : "SMS Route nicht korrekt.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
33 |
50 : "Identifikation fehlgeschlagen.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
34 |
60 : "nicht genuegend Guthaben.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
35 |
70 : "Netz wird von Route nicht abgedeckt.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
36 |
71 : "Feature nicht ueber diese Route moeglich.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
37 |
80 : "Uebergabe an SMS-C fehlgeschlagen.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
38 |
90 : "Versand nicht moeglich.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
39 |
100 : "SMS wurde versendet.", |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
40 |
} |
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
41 |
|
|
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
42 |
|
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
43 |
class SmstradeException(ExternalException): |
|
213
3620bacf1152
tests for error in smstrade API.
Sandro Knauß <knauss@netzguerilla.net>
parents:
186
diff
changeset
|
44 |
def __init__(self,status): |
|
3620bacf1152
tests for error in smstrade API.
Sandro Knauß <knauss@netzguerilla.net>
parents:
186
diff
changeset
|
45 |
ExternalException.__init__(self) |
|
214
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
46 |
self.status = status |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
47 |
self.str_=str(status) |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
48 |
|
| 15 | 49 |
def __str__(self): |
|
214
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
50 |
return "%s\n%s"%(ExternalException.__str__(self),self.str_) |
| 9 | 51 |
|
52 |
||
| 15 | 53 |
class StatusCode: |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
54 |
def __init__(self,code, exID=None, costs=Decimal("0.0"), count=0): |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
55 |
self.code = code |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
56 |
|
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
57 |
self.exID = exID |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
58 |
self.costs = Decimal(costs) |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
59 |
self.count = int(count) |
| 15 | 60 |
|
61 |
def __str__(self): |
|
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
62 |
if self.code in statusCodes.keys(): |
|
214
bacf50bc46bf
refactoring error of smstrade.
Sandro Knauß <knauss@netzguerilla.net>
parents:
213
diff
changeset
|
63 |
return "%i: %s"%(self.code, statusCodes[self.code]) |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
64 |
|
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
65 |
return "%i: unknown statuscode."%self.code |
| 15 | 66 |
|
67 |
def __int__(self): |
|
68 |
return self.code |
|
69 |
||
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
70 |
class Smstrade(Provider): |
| 15 | 71 |
""" |
72 |
s. auch http://kundencenter.smstrade.de/sites/smstrade.de.kundencenter/__pdf/SMS-Gateway_HTTP_API_v2.pdf |
|
73 |
""" |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
74 |
params= {"debug":("boolean",False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
75 |
"concat_sms":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
76 |
"message_id":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
77 |
"count":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
78 |
"cost":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
79 |
} |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
183
diff
changeset
|
80 |
def __init__(self, name): |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
81 |
self.url = "https://gateway.smstrade.de" |
|
186
b381eaa774ab
refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents:
183
diff
changeset
|
82 |
Provider.__init__(self, name, {"sms":["basic","economy","gold","direct"]}) |
|
183
07ee5543751b
offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents:
180
diff
changeset
|
83 |
self.options.update({ |
|
07ee5543751b
offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents:
180
diff
changeset
|
84 |
"key":Option(lambda x,y:x,long="smstrade Gateway Key https://login.smstrade.de/index.php?gateway", must=True) |
|
07ee5543751b
offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents:
180
diff
changeset
|
85 |
}) |
|
220
602720314930
adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents:
216
diff
changeset
|
86 |
self.order.append("key") |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
87 |
|
|
216
ab8e2f26718e
tests for Task.start -> ExJob->setError/setStatus
Sandro Knauß <knauss@netzguerilla.net>
parents:
215
diff
changeset
|
88 |
def send(self, route, recipient, sms): |
| 9 | 89 |
"""send SMS with $sms to $recipients""" |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
90 |
#logger.debug('smstrade.sendSMS(%s,%s)'%(sms, recipient)) |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
91 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
92 |
route = unicode(route) |
| 9 | 93 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
94 |
if recipient.land != '49' and route == "basic": |
|
213
3620bacf1152
tests for error in smstrade API.
Sandro Knauß <knauss@netzguerilla.net>
parents:
186
diff
changeset
|
95 |
raise RejectRecipient(recipient) |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
96 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
97 |
to ='00'+recipient.land+recipient.number |
|
213
3620bacf1152
tests for error in smstrade API.
Sandro Knauß <knauss@netzguerilla.net>
parents:
186
diff
changeset
|
98 |
|
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
99 |
s = self.__send(route, to, sms) |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
100 |
if int(s) in (100,): |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
101 |
return Status(self,route, exID=s.exID, costs=s.costs, count=s.count) |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
102 |
elif int(s) in (70,71,): |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
103 |
raise RejectRecipient(recipient, status=s) |
|
213
3620bacf1152
tests for error in smstrade API.
Sandro Knauß <knauss@netzguerilla.net>
parents:
186
diff
changeset
|
104 |
else: |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
105 |
raise SmstradeException(s) |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
106 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
107 |
def __send(self, route, to, sms): |
| 9 | 108 |
""" This function is the main part of the request to the sms service. |
109 |
The function has to return a unicode formated string that will represent the answer of the sms service |
|
110 |
to the request.""" |
|
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
111 |
#logger.debug('smstrade._send(%s,%s,%s)'%( route, to, sms)) |
|
21
e6302069d772
daten sind in der klasse gespeichert - müssen nicht übergeben werden
Sandro Knauß <knauss@netzguerilla.net>
parents:
20
diff
changeset
|
112 |
parameters= {"key": self.key, |
| 15 | 113 |
"route": route, |
114 |
"to": to, |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
115 |
"message": sms.content.encode("utf-8"), |
|
18
f0d31c70744d
Unterscheidung von Dt.Mobilnetz / weltweit
Sandro Knauß <knauss@netzguerilla.net>
parents:
15
diff
changeset
|
116 |
"charset":"utf-8", |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
117 |
"debug": self.testmode, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
118 |
"message_id":True, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
119 |
"count":True, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
120 |
"cost":True, |
| 15 | 121 |
} |
| 9 | 122 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
123 |
doubleChar="€[]{}|\\^~" #these charactar need two GSM Chars |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
124 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
125 |
if sms.from_ is not None: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
126 |
parameters["from"] = sms.from_ |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
127 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
128 |
length=len(sms.content) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
129 |
for s in doubleChar: |
|
236
63662db5ff25
tests for utf-8 have to be created
Sandro Knauß <knauss@netzguerilla.net>
parents:
220
diff
changeset
|
130 |
length += sms.content.encode("utf-8").count(s) |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
131 |
parameters["concat_sms"] = True if length > 160 else False |
| 9 | 132 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
133 |
ps={} |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
134 |
for p in parameters: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
135 |
if p in self.params.keys(): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
136 |
if self.params[p][0] == "boolean": |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
137 |
if parameters[p] != self.params[p][1]: |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
138 |
ps[p]=int(bool(parameters[p])) |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
139 |
else: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
140 |
ps[p] = parameters[p] |
| 9 | 141 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
142 |
params = urllib.urlencode(ps) |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
143 |
#dp=copy.deepcopy(ps) |
|
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
144 |
#dp["key"]="<KEY>" |
|
236
63662db5ff25
tests for utf-8 have to be created
Sandro Knauß <knauss@netzguerilla.net>
parents:
220
diff
changeset
|
145 |
#print 'smstrade._send-parameters:%s\n\t->%s'%(str(dp), urllib.urlencode(dp)) |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
146 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
147 |
response = urllib.urlopen(self.url, params) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
148 |
data = response.readlines() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
149 |
if len(data) == 1: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
150 |
return StatusCode(int(data[0])) |
|
215
5bacdb7e94d1
smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents:
214
diff
changeset
|
151 |
return StatusCode(int(data[0]),exID=data[1],costs=data[2],count=data[3]) |
| 9 | 152 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
153 |
def getSendFunc(self, typ, route): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
154 |
Provider.getSendFunc(self, typ, route) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
155 |
return partial(self.send,route) |
| 9 | 156 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
157 |
providers["smstrade"]=Smstrade |