Last active 1450484348

xMail Python implementation

Steven Smith revised this gist 1373097049. Go to revision

1 file changed, 134 insertions

xmailv1.py(file created)

@@ -0,0 +1,134 @@
1 + # xMail implementation v1 by blha303
2 + # MIT license
3 + # irc.esper.net #drtshock for questions
4 + import json, urllib2, urllib
5 + url = "http://xmail.turt2live.com/mail/index.php"
6 + from random import randrange
7 +
8 + def get_password(password):
9 + return urllib2.urlopen("http://blha303.com.au/sha1.php?q=%s" % password).read()
10 + # An alternative for this, on machines with PHP installed, is:
11 + # return os.popen('echo "<?php echo sha1(\'%s\'); ?>" | php' % password).read()
12 + # That's all the above PHP file does.
13 +
14 + def get_json(url, data):
15 + return json.loads(urllib2.urlopen(url, data).read())
16 +
17 + # xMail functions start here
18 +
19 + def register(username, password):
20 + """username: new xmail username; password: yep"""
21 + registerdata = urllib.urlencode({'mode': 'REGISTER', 'username': username, 'password': get_password(password), 'version': 'IRC'})
22 + register = get_json(url, registerdata)
23 + return register
24 + # Returns:
25 + # {u'status': u'OK', u'username': u'USERNAME REMOVED', u'loggedin': True, u'apikey': u'API KEY REMOVED', u'lastlogin': 1373054388, u'date': 1373054388, u'message': u'User registered'}
26 +
27 + def login(username, password):
28 + """Initial login"""
29 + logindata = urllib.urlencode({'mode': 'LOGIN', 'username': username, 'password': get_password(password), 'version': 'IRC'})
30 + login = get_json(url, logindata)
31 + return login
32 + # Returns:
33 + # {u'status': u'OK', u'username': u'USERNAME REMOVED', u'loggedin': True, u'apikey': u'API KEY REMOVED', u'lastlogin': u'1373009275', u'date': 1373009330, u'message': u'Logged in'}
34 +
35 + def check_login(username):
36 + """Renews login, retrieves updated api key"""
37 + checkdata = urllib.urlencode({'mode': 'CHECK_LOGIN', 'username': username, 'version': 'IRC'})
38 + check = get_json(url, checkdata)
39 + return check
40 + # Returns same as login(), used for verifying login status and retrieving updated API key
41 +
42 + def send(fromuser, to, message):
43 + """fromuser: xmail username of sending user; to: xmail username of receiving user; message: yep"""
44 + apikey = check_login(username)['apikey']
45 + pid = randrange(1, 1001)
46 + uid = randrange(1, 1001)
47 + ident = "S"
48 + version = "IRC"
49 + senddata = urllib.urlencode({'mode': 'SEND', 'pid': pid, 'uid': uid, 'ident': ident, 'to': to, 'from': fromuser, 'message': message, 'apikey': apikey, 'version': version})
50 + send = get_json(url, senddata)
51 + return send
52 + # Returns:
53 + # {u'status': u'OK', u'message': u'Message sent!'}
54 +
55 + def inbox(username):
56 + """Returns list of inbox entries. See below example"""
57 + apikey = check_login(username)['apikey']
58 + version = "IRC"
59 + inboxdata = urllib.urlencode({'mode': 'INBOX', 'username': username, 'apikey': apikey, 'version': version})
60 + # The one special case
61 + inbox = urllib2.urlopen(url, inboxdata).read().split("\n")
62 + inboxa = []
63 + for i in inbox:
64 + inboxa.append(i)
65 + return inboxa
66 + # Returns list. If no unread messages, list length will be 1. Otherwise, length is number of unread items - 1
67 +
68 + def sent(username):
69 + """Returns list of sent entries. See below example"""
70 + apikey = check_login(username)['apikey']
71 + version = "IRC"
72 + inboxdata = urllib.urlencode({'mode': 'SENT', 'username': username, 'apikey': apikey, 'version': version})
73 + # The one special case
74 + inbox = urllib2.urlopen(url, inboxdata).read().split("\n")
75 + inboxa = []
76 + for i in inbox:
77 + inboxa.append(i)
78 + return inboxa
79 + # Returns list. If no unread messages, list length will be 1. Otherwise, length is number of unread items - 1
80 +
81 + def read(username):
82 + """Returns list of read entries. See below example"""
83 + apikey = check_login(username)['apikey']
84 + version = "IRC"
85 + inboxdata = urllib.urlencode({'mode': 'READ', 'username': username, 'apikey': apikey, 'version': version})
86 + # The one special case
87 + inbox = urllib2.urlopen(url, inboxdata).read().split("\n")
88 + inboxa = []
89 + for i in inbox:
90 + inboxa.append(i)
91 + return inboxa
92 + # Returns list. If no unread messages, list length will be 1. Otherwise, length is number of unread items - 1
93 +
94 + def exampleinboxusage(username):
95 + inboxls = inbox(username)
96 + if len(inboxls) > 1:
97 + for i in inboxls:
98 + i = json.loads(i)
99 + try:
100 + status = i['status']
101 + unread = i['unread']
102 + print "%s unread messages for %s:" % (unread, i['username'])
103 + except KeyError:
104 + id = i['id']
105 + to = i['to']
106 + fromuser = i['from']
107 + message = i['message']
108 + complex = i['complex']
109 + attachments = i['attachments']
110 + sentfrom = i['sentfrom']
111 + sendtime = i['sendTime']
112 + print "%s: %s - to %s from %s at %s (sent from %s)" % (id, message, to, fromuser, sendtime, sentfrom)
113 + else:
114 + for i in inboxls:
115 + i = json.loads(i)
116 + unread = i['unread']
117 + print "%s unread messages for %s." % (unread, i['username'])
118 +
119 + def mark(username, id, read):
120 + """username: xmail username; id: inbox[n]['id']; read: Boolean. true = read, false = unread"""
121 + apikey = check_login(username)['apikey']
122 + markdata = urllib.urlencode({'mode': 'MARK', 'pid': id, 'uid': randrange(1, 1001), 'username': username, 'apikey': apikey, 'read': read, 'version': 'IRC'})
123 + mark = get_json(url, markdata)
124 + return mark
125 + # Returns:
126 + # {u'status': u'OK', u'message': u'Updated Message'}
127 +
128 + def info():
129 + """Returns server info"""
130 + infodata = urllib.urlencode({'mode': 'INFO', 'version': 'IRC'})
131 + info = get_json(url, infodata)
132 + return info
133 + # Returns:
134 + # {u'status': u'OK', u'ip': u'IP address', u'version': u'XMAIL-1.1.1-OFFICIAL_SERVER', u'posturl': u'http://xmail.turt2live.com/mail', u'econaccount': u'@economy', u'message': u'xMail PHP Server', u'now': 1373012096}
Newer Older