管理电子邮件我正在使用php库PHPMailer。在客户端,我使用jquery验证器插件的email
方法验证电子邮件地址。
$("#regForm").validate({
rules:{
email:
{
required: true,
email: true
}
}
现在,问题是验证器email
方法的允许字符集和PHPMailer上允许的字符集是不一样的。
例如,email
方法允许' $'字符,但当电子邮件地址包含' $'字符Phpmailer的send()
方法返回false(发送电子邮件失败)和错误:
'以下收件人失败:example$@mail.it:无效的电子邮件地址'。
我可以解决问题,使用完成的专用正则表达式来创建一个新的自定义方法,以验证客户端的电子邮件地址。但是PHPMailer发送方法的电子邮件地址允许的字符是什么,我在哪里可以找到它们?
答案 0 :(得分:1)
根据PHPMailer的文档,您可以设置自己的验证(它们已经提供了几个)。 Docblock声明:
/**
* Check that a string looks like an email address.
* @param string $address The email address to check
* @param string|callable $patternselect A selector for the validation pattern to use :
* * `auto` Pick best pattern automatically;
* * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
* * `pcre` Use old PCRE implementation;
* * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
* * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
* * `noregex` Don't use a regex: super fast, really dumb.
* Alternatively you may pass in a callable to inject your own validator, for example:
* PHPMailer::validateAddress('user@example.com', function($address) {
* return (strpos($address, '@') !== false);
* });
* You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
* @return boolean
* @static
* @access public
*/
$phpmailer->send()
通过validateAddress
方法自动调用preSend
方法。您可以通过(未经测试)设置验证方法:
$phpMailer->validator = function($email) { return true; };
或者,您可以通过创建自己的phpmailer类来覆盖该方法,例如:
class myMailer extends PHPMailer {
public static function validateAddress($address) {
return true;
}
}
旁注,我通常只使用filter_var
:filter_var($email, FILTER_VALIDATE_EMAIL)
答案 1 :(得分:1)
你得出结论。 PHPMailer's validator(非常彻底tested)认为该地址有效。
您收到的错误来自接收邮件服务器,而不是PHPMailer。
PHPMailer会在您添加地址时拒绝地址(例如使用addAddress()
) - 无效地址永远不会发送到地址。例如,PHPMailer很高兴认为这个地址有效:
user+!#$%&'*-/=?+_{}|~test@example.com
PHPMailer在PHPMailer 5.6中的默认地址模式:
/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD
这是一个非常彻底的验证(因此非常宽松)允许许多其他验证器没有的东西,例如IP文字。
PHPMailer 6.0保留了这种模式,但默认使用filter_var
中带有FILTER_VALIDATE_EMAIL
选项的更有限的PHP内置验证程序 - 其中使用的模式最初是由同一作者编写的。 PHPMailer中的一个。
关于验证RFC822的讨论很多,但这通常是无关紧要的; RFC822没有定义要发送到的有效电子邮件地址; RFC821(SMTP)中定义的,它是一个较小的子集。这是一个有效的RFC822地址,但它不是有效的RFC821地址,因此实际上无法发送到:
(foo)cal(bar)@(baz)example.com(queue)
还有其他非RFC因素 - ICANN禁止“无网点”域名,因此a@b
(在821和822中有效)等地址应被视为无效。
WHATWG HTML5规范包含the email
input element的简化地址子集(故意违反RFC5322),使用此模式,我写道:
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
此验证器也可在PHPMailer中使用。
正如validateAddress
函数的函数注释块所说(谢谢你@Half Crazed提到它),如果你不喜欢这些,你可以动态注入你自己 - 虽然我真的不会打扰!