PhpMailer,电子邮件地址字符集是什么?

时间:2017-02-14 16:51:45

标签: php jquery regex email phpmailer

管理电子邮件我正在使用php库PHPMailer。在客户端,我使用jquery验证器插件的email方法验证电子邮件地址。

$("#regForm").validate({
   rules:{
              email:
                        {
                            required: true,
                            email: true            
                        }
          }

现在,问题是验证器email方法的允许字符集和PHPMailer上允许的字符集是不一样的。 例如,email方法允许' $'字符,但当电子邮件地址包含' $'字符Phpmailer的send()方法返回false(发送电子邮件失败)和错误: '以下收件人失败:example$@mail.it:无效的电子邮件地址'。

我可以解决问题,使用完成的专用正则表达式来创建一个新的自定义方法,以验证客户端的电子邮件地址。但是PHPMailer发送方法的电子邮件地址允许的字符是什么,我在哪里可以找到它们?

2 个答案:

答案 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_varfilter_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提到它),如果你不喜欢这些,你可以动态注入你自己 - 虽然我真的不会打扰!