我正在使用SYmfony 1.4和
swift邮件程序通过Sendgrid发送大量电子邮件.
一个解决方案是remove the condition to throw the error,它确实有效,但它涉及改变核心.你如何在站点文件而不是symfony核心中扩展MailBoxHeader.PHP.像这样的东西,但不是因为它不起作用:
class overrideRFCError extends Swift_Mime_Headers_AbstractHeader { private function _assertValidAddress($address) { if (!preg_match('/^' . $this->getGrammar('addr-spec') . '$/D',$address)) { // throw new Swift_RfcComplianceException( // 'Address in mailBox given [' . $address . // '] does not comply with RFC 2822,3.6.2.' // ); } } }
这似乎有点沉重.有没有办法验证电子邮件的RFC合规性.如果是这样,那么我可以从阵列中取消它.
更新07/17/13
我能够对每个地址进行彻底的清理,使其符合RFC标准,从而解决了这个问题.但是,我想知道SwiftMailer中是否存在执行此检查的函数,而不是编写自定义函数.
更新07/18/13
这就是我的工作.我试图尽可能地清理条目.
在名为$emailList的变量中加载地址数组
在行动中:
$cleanList = sendGridEmailer::validateEmails($emailList);
在sendGridEmailer类中:
// loop and validate each email address public static function validateEmails($emailList) { foreach($emailList as $address => $name) { try { $v = new sfValidatorEmail(); $email = $v->clean($address); } catch (sfValidatorError $e) { unset($emailList[$address]); } } foreach($emailList as $address => $name) { $rfcTesting = validateEmailForRFC::is_email($address); if(!$rfcTesting) { unset($emailList[$address]); } if (!preg_match('/^[a-zA-Z0-9_.-@]/',$address)) { unset($emailList[$address]); } } // List should be clean return $emailList; }
所以这首先使用sfValidator来踢出最初的坏地址.接下来,我获得了RFC合规性脚本here并在validateEmailForRFC类中执行该脚本,这应该使它们符合RFC标准.
最后,我为任何有着怪异角色的散兵游勇做了最后的预赛,以前的检查没有抓到.
这使我能够保持Symfony核心不受影响,并为没有合规性错误的Swift准备好地址.
您可以使用symfony的sfValidatorEmail或
filter-var函数.它们与SwiftMailer一起工作得很好,但它们都不符合RFC IIRC.要验证RFC,您可以使用
https://github.com/egulias/EmailValidator或
https://github.com/dominicsayers/isemail.