php中、 getmxrr()是一个用于获取指定域名的mx (邮件交换)记录的函数。mx 记录是域名系统( dns
getmxrr()函数的基本语法如下:
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">getmxrr</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span> , </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$mxhosts</span></span><span> [, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$weight</span></span><span> = </span><span><span class="hljs-literal">NULL</span></span><span> ] )
</span></span>
$ hostname :指定要查询的域名。
$ mxhosts :一个数组、返回mx记录服务器的地址。
$ weight (可选):返回的数组、用于存储对应mx 服务器的权重(优先级)。权重较低的服务器具有较高的优先级。
如果成功、返回、 true 、并且$ mxhosts和$ weigh
如果失败、返回、 false 、并且$mxhosts和$ weight数组将为空。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$hostname</span></span><span> = </span><span><span class="hljs-string">"example.com"</span></span><span>;
</span><span><span class="hljs-variable">$mxhosts</span></span><span> = [];
</span><span><span class="hljs-variable">$weight</span></span><span> = [];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">getmxrr</span></span><span>(</span><span><span class="hljs-variable">$hostname</span></span><span>, </span><span><span class="hljs-variable">$mxhosts</span></span><span>, </span><span><span class="hljs-variable">$weight</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"MX Records for <span class="hljs-subst">$hostname</span></span></span><span>:\n";
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$mxhosts</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> => </span><span><span class="hljs-variable">$host</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</span></span></span><span>, Weight: " . </span><span><span class="hljs-variable">$weight</span></span><span>[</span><span><span class="hljs-variable">$index</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Failed to retrieve MX records for <span class="hljs-subst">$hostname</span></span></span><span>.\n";
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
在上面的代码中、 getmxrr()会获取Example.com
通过getmxrr()函数、开发者可以验证一个域名是否配置了邮件服务器、从而判断该域名是否能够接收邮件。如果获取到的mx记录不为空、则说明该域名能够接收邮件。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">isMailServerAvailable</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$domain</span></span></span><span>) {
</span><span><span class="hljs-variable">$mxhosts</span></span><span> = [];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">getmxrr</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>, </span><span><span class="hljs-variable">$mxhosts</span></span><span>)) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>; </span><span><span class="hljs-comment">// 有MX记录,表示可以接收邮件</span></span><span>
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">false</span></span><span>; </span><span><span class="hljs-comment">// 无MX记录,表示不可接收邮件</span></span><span>
}
</span><span><span class="hljs-variable">$domain</span></span><span> = </span><span><span class="hljs-string">"example.com"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">isMailServerAvailable</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$domain</span></span></span><span> 可以接收邮件\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$domain</span></span></span><span> 无法接收邮件\n";
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
根据mx记录的权重值、优先级较低的服务器会被优先使用。通过getmxrr()获取的权重数组、可以帮助开发者找到优先级最高的邮件服务器。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getBestMailServer</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$domain</span></span></span><span>) {
</span><span><span class="hljs-variable">$mxhosts</span></span><span> = [];
</span><span><span class="hljs-variable">$weights</span></span><span> = [];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">getmxrr</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>, </span><span><span class="hljs-variable">$mxhosts</span></span><span>, </span><span><span class="hljs-variable">$weights</span></span><span>)) {
</span><span><span class="hljs-variable">$bestServerIndex</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_search</span></span><span>(</span><span><span class="hljs-title function_ invoke__">min</span></span><span>(</span><span><span class="hljs-variable">$weights</span></span><span>), </span><span><span class="hljs-variable">$weights</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$mxhosts</span></span><span>[</span><span><span class="hljs-variable">$bestServerIndex</span></span><span>];
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">null</span></span><span>;
}
</span><span><span class="hljs-variable">$domain</span></span><span> = </span><span><span class="hljs-string">"example.com"</span></span><span>;
</span><span><span class="hljs-variable">$bestServer</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getBestMailServer</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bestServer</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"最优的邮件服务器是: <span class="hljs-subst">$bestServer</span></span></span><span>\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法找到邮件服务器\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
此代码会根据权重数组的最小值(即优先级最高的服务器)来找出最优的邮件服务器。
在某些情况下、开发者可能只对某些特定的邮件服务器感兴趣、比如选择一个特定区域的邮件服务器或特定类型的服务器。可以在获取mx记录后、通过简单的数组过滤来实现这一需求。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">filterMailServers</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$domain</span></span></span><span>, </span><span><span class="hljs-variable">$filter</span></span><span>) {
</span><span><span class="hljs-variable">$mxhosts</span></span><span> = [];
</span><span><span class="hljs-variable">$weights</span></span><span> = [];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">getmxrr</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>, </span><span><span class="hljs-variable">$mxhosts</span></span><span>, </span><span><span class="hljs-variable">$weights</span></span><span>)) {
</span><span><span class="hljs-variable">$filteredHosts</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$mxhosts</span></span><span>, function(</span><span><span class="hljs-variable">$host</span></span><span>) </span><span><span class="hljs-keyword">use</span></span><span> ($</span><span><span class="hljs-title">filter</span></span><span>) {
</span><span><span class="hljs-title">return</span></span><span> </span><span><span class="hljs-title">strpos</span></span><span>($</span><span><span class="hljs-title">host</span></span><span>, $</span><span><span class="hljs-title">filter</span></span><span>) !== </span><span><span class="hljs-title">false</span></span><span>; </span><span><span class="hljs-comment">// 过滤出包含指定字符串的邮件服务器</span></span><span>
});
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$filteredHosts</span></span><span>;
}
</span><span><span class="hljs-keyword">return</span></span><span> [];
}
</span><span><span class="hljs-variable">$domain</span></span><span> = </span><span><span class="hljs-string">"example.com"</span></span><span>;
</span><span><span class="hljs-variable">$filteredServers</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filterMailServers</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>, </span><span><span class="hljs-string">"gmail"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$filteredServers</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"过滤后的邮件服务器:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$filteredServers</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$server</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$server</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"未找到符合条件的邮件服务器\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
在这个示例中、 filtermailservers()函数会过滤出所有包含gmail字符串的邮件服务器。
dns查询限制: getmxrr()函数依赖于dnsdns服务器出现问题、可能会导致查询失败。
结果顺序: getmxrr()返回的mx记录是按照优先级顺序排列的、优先级较低的服务器会出现在前面(即更高优先级)。
非标准返回值:在某些情况下、如果域名没有配置mx记录、函数返回false 。此时需要合理处理错误情况。
安全性:尽管getmxrr()是一个常用的dns查询工具、但在公、开发者应该注意避免信息泄露、开发者应该注意避免信息泄露、特别是当暴露在外部系统时。
getmxrr()是php中一个简单但功能强大的函数、适用于各种需要获取和操作mx 记录的场景。无论是进行邮件验证、寻找最优邮件服务器、还是实现邮件路由策略、 getmxrr()都能够提供重要的帮助。通过合理使用它、可以在邮件系统的搭建和维护中提高效率。