在 PHP 中检查 SPF

Checking SPF in PHP

IT 服务提供商必须在 Internet 上编写我们的 SPF 更改,我只是邮寄我的说明。

我在 PHP 中创建了一个程序来检查我的所有域,看看它是否正确(有时错误的复制粘贴包含错误的字符)

我尝试用

测试 SPF
if (strpos(strtolower($spf), 'v=spf')

但这不会检查坏字符

我试过 preg_match 但它不起作用

一条spf记录只能包含这些字符 [a-z] [0-9] 。 ? - ~ (space) 且必须以 v=spf

开头

所有其他字符必须回显 "Invalid syntax"

示例:

$spfdata='v=spf1 mx 1.2.3.4 ~all';

if (preg_match('/(v=spf)([a-z0-9-~?.])/i', $spfdata)){
    echo "SPF seems to be ok";
} else {
    echo "Invalid syntax";
}

这不起作用它总是说 "ok" 即使我输入了一个错误的字符。

您可以使用

'/^v=spf[a-z0-9~? .-]+$/i'

或者,如果您想允许任何类型的空格:

'/^v=spf[a-z0-9~?\s.-]+$/i'

PHP代码:

$spfdata='v=spf1 mx 1.2.3.4 ~all';

if (preg_match('/^v=spf[a-z0-9~?\s.-]+$/i', $spfdata)){
    echo "SPF seems to be ok";
} else {
    echo "Invalid syntax";
}

PHP demo

正则表达式匹配

  • ^ - 字符串开头
  • v=spf - 文字文本
  • [a-z0-9~?\s.-]+ - 1+ 个 ASCII 字母、数字、~?、空格、.-
  • $ - 字符串结尾。

我不知道为什么,但是当我删除第一个块 (v=spf) 时,正则表达式似乎不错 我尝试了很多不同的东西,终于成功了(我用 ^ 颠倒了逻辑)

所以正则表达式显示 "if your are NOT in the bracket expression you are ok"

$spfdata='v=spf1 mx 1.2.3.4 ~all';

if (preg_match('#[^a-z0-9 :\+=.\-~\?]#', $spfdata)){
    echo "Invalid syntax";
} else {
    echo "SPF seems to be ok";
}