No we don't publish SPF records. I come at this from various angles :
1) We don't restrict where our customers send email from, so it's entirely valid for a Zen customer to send from an @zen.co.uk address direct from their home system or from an Internet cafe for example. If we published SPF records that only listed our servers we'd restrict that capability. Using more lenient SPF rules would kind of defeat the point of SPF.
2) As has already been said SPF breaks any form of forwarded email, the example of given by another poster explains this. The recipient server will see the sender come from an invalid IP address. SRS (Sender Rewriting Scheme) attempts to address this. Using SRS the intermediate system (domainb.co.uk) would pass on the sender fred@domaina.co.uk as something like bounce=fred#domaina.co.uk@domainb.co.uk, thus making the new sending domain 'domainb.co.uk', and hence using its SPF rules instead. If a bounce was to occur then the email would be sent back to domainb.co.uk and the VERP'd address could be extracted to pass the bounce back on to the original sender. SPF will only fully work when every single server in the world operates it and also uses SRS.
3) SPF won't prevent spam, it will only prevent a domain being spoofed. Spammers are just as welcome to publish wildcard SPF records for their domains as anyone else :-(
I'm far more of a fan of DKIM, whereby an email is 'signed' by the sending domain. In this case it doesn't matter how many servers the email passes thro' as it's only the original sender that gets involved. Obviously only the authoritative servers for a domain can do the signing, so customers using their own servers wouldn't be able to get their @zen.co.uk email signed unless they sent via us. As with SPF there's no reason why spammers can't use DKIM except for the fact that it's a little bit more CPU intensive due to the cryptographic signing stage, which would slow them down and thus not be so desirable.
--
Jerry Nicholls
Principal Systems Engineer
perl -e '$_=q(print "perl -e \x27\$_=q($_);eval\x27\n");eval'