Author: Simon Whitaker at http://www.netcetera.org/
Seems that this project was no longer available when I am writing this post. Don’t know why.. but I just know that my webdev team is stilling using this great tool to make Push Notification on Apple devices.
Hereby the guidance for running it up.
Copy the pushmail.tar.gz to this location: /etc/postfix/pushmail.. and unzip it.
root@ubuntu:~# chown nobody:mail /etc/postfix/pushmail
root@ubuntu:~# chmod +x /etc/postfix/pushmail
root@ubuntu:~# chmod +x /etc/postfix/pushmail/lib
add python script path to /etc/aliases
root@ubuntu:~# vi /etc/aliases
## See man 5 aliases for format,
vmail: “|python /etc/postfix/pushmail/pushAPNs.py 2 >> /etc/postfix/pushmail/pushmail.log”
Run updating newaliases…
root@ubuntu:~# newaliases
update table cho push noti
to get email notification, add alias vmail@localhost to mail alias column in virtual_aliases table of your database.
New email will pipe to pushmail.sh
My postfix’s configuration
root@ubuntu:~# vi /etc/postfix/main.cf
## Virtual domains, users, and aliases
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
#
#
root@123flo:~# cat /etc/postfix/mysql-virtual-mailbox-domains.cf
user = db_username
password = db_password
hosts = 127.0.0.1 localhost
dbname = db_name
query = SELECT 1 FROM virtual_domains WHERE name=’%s’
#
#
root@123flo:~# cat /etc/postfix/mysql-virtual-mailbox-maps.cf
user = db_username
password = db_password
hosts = 127.0.0.1 localhost
dbname = db_name
query = SELECT 1 FROM users WHERE email=’%s’
#
#
root@ubuntu:~# cat /etc/postfix/mysql-virtual-alias-maps.cf
user = db_username
password = db_password
hosts = 127.0.0.1 localhost
dbname = db_name
query = SELECT destination FROM virtual_aliases WHERE source=’%s’
#
#
Inside my PyAPNs.py
def get_device_id(email):
try:
conn = mysql.connector.connect(host='localhost',database='db_name',user='db_user',password='db_pass')
cursor = conn.cursor()
query = ("SELECT dv.device_token FROM device_token dv LEFT JOIN users u ON u.id = dv.user_id WHERE u.email = '%s' LIMIT 0 , 30" %(email))
cursor.execute(query)
rows = cursor.fetchall()
return rows
except Error as e:
#print(e)
logger.error(e)
finally:
cursor.close()
conn.close()
Fix with this:
Remember check and update your /etc/postfix/pushmail/production19.pem
root@ubuntu:~# cat /etc/postfix/pushmail/pushAPNs.py
apns = APNs(use_sandbox=False, cert_file=’/etc/postfix/pushmail/production19.pem’, key_file=’/etc/postfix/pushmail/production19.pem’)
apns_enhanced = APNs(use_sandbox=False, cert_file=’/etc/postfix/pushmail/production19.pem’, enhanced=True)
payload = Payload(alert= json_mess , sound=”default”)
Fix bug uft-8
update file pushAPNs.py
sfrom = email.utils.parseaddr(parser.from_)
ssubject = parser.subject
if sfrom[0]:
sfrom = sfrom[0]
if '=?utf-8?' in sfrom or '=?UTF-8?' in sfrom:
sfrom = email.Header.decode_header(sfrom)[0][0]
else:
sfrom = sfrom[1]
if '=?utf-8?' in ssubject or '=?UTF-8?' in ssubject:
ssubject = re.sub(r'^"|"$', '', ssubject)
ssubject = email.Header.decode_header(ssubject)[0][0]
if isinstance(sfrom, unicode):
sfrom = sfrom.encode('utf-8')
if isinstance(ssubject, unicode):
ssubject = ssubject.encode('utf-8')
data['body'] = sfrom + "\n" + ssubject + "\n"

