Version 1.6 - December 18, 2003 * Arik Baratz pointed out endian problems using socket.inet_ntoa() and socket.inet_aton(). Use struct.pack("!L", struct.unpack("!L") to fix. Version 1.5 - December 17, 2003 * Replace DNS.addr2bin() and DNS.bin2addr() with socket.inet_ntoa() and socket.inet_aton(). New code supports n, n.n, and n.n.n formats for IPv4 addresses, and gets rid of annoying Python 2.4 future warnings Version 1.4 - December 16, 2003 * Greg Connor discovered that SPF queries to altavista.com were broken. This was testing to see if a mechanism needs to be macro expanded _before_ leading ? + - characters were removed. * Fixed include handling to be a real mechanism: -include must work. Version 1.3.1 - December 14, 2003 * Forgot to include new test file in distribution. * Forgot CHANGELOG in distribution. Version 1.3 - December 13, 2003 * Add %{o} (original sender domain) macro * The ./spf.py {spf} {ipaddr} {sender} {helo} command line didn't print out the results. Oops. * Support default= so Meng's test #6 'v=spf1 default=deny' works * Any IP address '127.*.*.*' automatically pass, so all Meng's tests work * Follow DNS CNAMES * Cache DNS results, including additional info, reducing DNS query load * Support Python 2.2 (doesn't have bool, True, False: those are added in Python 2.2.1) Version 1.2 - December 11, 2003 * Added exp= (explanation) and redirect= modifiers * Added macros Version 1.1 - December 9, 2003 * Meng Weng Wong added PTR code, THANK YOU Version 1.0 - December 9, 2003 * Initial Version