PyAPNS – a Python library for interacting with the Apple Push Notification service

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"

 

 

 

RELATED POSTS
Share the Post: