On Fri, Apr 21, 2017 at 11:59:20AM +0200, Peter N. M. Hansteen wrote: > On Fri, Apr 21, 2017 at 11:25:14AM +0200, Markus Rosjat wrote: > > > > so if you have spamd in place in greylisting mode and you have customers > > that work with people who use Office365 as a service you will get calls that > > emails are delayed for a freaking long time and if you check the ip range > > that outlook.com could send from you get scared. > > start with > > $ host -ttxt outlook.com > > and follow the includes to the very end. Then weep. > > TL;DR: last time I looked that expanded to eighty-some *networks* of varying > sizes. > > https://github.com/akpoff/spf_fetch fed the relevant domains is one solution, > and in addition you will find my collection of manually maintained SPF > sedimentation > is available at https://home.nuug.no/~peter/nospamd >
I use the attached script to fetch the SPF entries recursively, in a plain text format that can be fed into pfctl. outlook.com gives me 82 networks. Reyk ---snip--- #!/usr/bin/perl # Copyright (c) 2016 Reyk Floeter <[email protected]> # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. $domain = shift @ARGV or die "usage: $0 domain"; sub parsespf { my $domain = shift; my @foo = `nslookup -q=TXT $domain`; my @results = (); foreach (@foo) { next if not /$domain\ttext/; next if not s/$domain\ttext = "v=spf1([^"]+)"/$1/; @results = split /\s+/; foreach (@results) { next if /.all/; if (s/^ip[46]://) { print "$_\n"; } elsif (s/^(redirect|include)[:=]//) { print "\n#$_\n"; parsespf($_); } } } } parsespf($domain); 0;

