例如,我有一个带有此ips的数组,并希望使用我的代码创建一个长的spf记录:
$array_ips = array();
$array_ips[] = "32.16.8.133";
$array_ips[] = "32.16.4.247";
$array_ips[] = "35.16.8.184";
$array_ips[] = "32.16.8.127";
$array_ips[] = "32.16.8.134";
$array_ips[] = "32.16.2.154";
$array_ips[] = "32.16.2.153";
$array_ips[] = "32.16.2.150";
$array_ips[] = "39.16.2.190";
$array_ips[] = "32.16.2.128";
$array_ips[] = "32.16.0.128";
$array_ips[] = "32.16.8.187";
$array_ips[] = "43.16.8.185";
$array_ips[] = "32.16.8.192";
$array_ips[] = "32.16.4.249";
$array_ips[] = "52.16.4.252";
$array_ips[] = "32.16.4.238";
$array_ips[] = "32.16.4.232";
$ips = implode(' ip4:', $array_ips);
echo "v=spf1 +a +mx".$ips." -all";
spf记录为:
v=spf1 +a +mx ip4:32.16.8.133 ip4:32.16.4.247 ip4:32.16.8.184 ip4:32.16.8.127 ip4:32.16.8.134 ip4:32.16.2.154 ip4:32.16.2.153 ip4:32.16.2.150 ip4:32.16.2.190 ip4:32.16.2.128 ip4:32.16.0.128 ip4:32.16.8.187 ip4:32.16.8.185 ip4:32.16.8.192 ip4:32.16.4.249 ip4:32.16.4.252 ip4:32.16.4.238 ip4:32.16.4.232 -all
人物:307
问题是,SPF只能是最大值。长度为255个字符。无法在txt dns记录中的plesk或cpanel中添加如此长的字符串。我听说过如果可以这样做"v=spf1 .... first" "spf second string..."
。
但它真的有效吗? 如何在上面的示例中生成它?
答案 0 :(得分:1)
如果你愿意允许一个/ 24个子网用于几个IP,你可以做类似下面的事情。如果你想象,你甚至可以正确地对其进行子网划分。无论如何,它大大削减了你的清单。
<?php
$array_ips = array();
$array_ips[] = "32.16.8.133";
$array_ips[] = "32.16.4.247";
$array_ips[] = "35.16.8.184";
$array_ips[] = "32.16.8.127";
$array_ips[] = "32.16.8.134";
$array_ips[] = "32.16.2.154";
$array_ips[] = "32.16.2.153";
$array_ips[] = "32.16.2.150";
$array_ips[] = "39.16.2.190";
$array_ips[] = "32.16.2.128";
$array_ips[] = "32.16.0.128";
$array_ips[] = "32.16.8.187";
$array_ips[] = "43.16.8.185";
$array_ips[] = "32.16.8.192";
$array_ips[] = "32.16.4.249";
$array_ips[] = "52.16.4.252";
$array_ips[] = "32.16.4.238";
$array_ips[] = "32.16.4.232";
$subnetArr = [];
foreach ($array_ips as $k=>$v ) {
$i = strrpos($v, '.');
$testSub = substr($v, 0, -(strlen($v) - $i));
if (in_array("ip4:" . $testSub . ".1/24", $subnetArr)) {
//Do something here or change condition
} else {
array_push($subnetArr,"ip4:" . $testSub . ".1/24");
}
}
$ips = implode(' ', $subnetArr);
echo "v=spf1 +a +mx ".$ips." -all";
<强>输出强>
v=spf1 +a +mx ip4:32.16.8.1/24 ip4:32.16.4.1/24 ip4:35.16.8.1/24 ip4:32.16.2.1/24 ip4:39.16.2.1/24 ip4:32.16.0.1/24 ip4:43.16.8.1/24 ip4:52.16.4.1/24 -all
<强> 编辑: 强>
刚改变,所以它实际上是回声的SPF!
答案 1 :(得分:1)
你可以把它分解成多个包含的..
"v=spf1 mx a include:iprange1.example.com include:iprange2.example.com -all"
然后在每个包含DNS的情况下,您将拥有
iprange1.example.com = "v=spf1 ip4:32.16.8.133 ... -all"
iprange2.example.com = "v=spf1 ip4:32.16.4.238 ... -all"
这将为您提供更多空间,因为您将能够包含8个包含以及您的mx和
然后每个include都可以容纳16个ip4地址,这些地址将获得大约128个无法CIDR的IP地址。
编辑 - iprange1 - &gt;第二个代码片段第2行的iprange2
答案 2 :(得分:0)
你需要通过子网做。使用标准IP4子网表示法:
“v = spf1 ip4:192.168.0.1/16 -all”
允许192.168.0.1和192.168.255.255之间的任何IP地址。
答案 3 :(得分:-2)
我找到了解决方案:
echo "v=spf1 +a +mx ( "'.implode('" "',$array_ips).' " ) -all";
但是我发现它并不是很有用的页面。 (需要空格和()
)
http://www.nullpointer.at/keyword/spf/
翻译:
TXT记录太长。这里,在这个例子中,TXT记录被分成几行。这个语法是:括号(然后是引号&#34;第一部分&#34;引号中的下一行&#34;第二部分&#34;等等,最后是括号)。重要提示:不要忘记用引号括起来的每个部分中的空白:&#34;第一部分&#34; &#34;第二部分&#34;然后组成&#34;第一部分第二部分&#34;。