如何在Swift Mailer中扩展MailboxHeader.php或验证电子邮件


How to extend MailboxHeader.php in Swift Mailer or validate emails

我正在使用SYmfony 1.4和swift mailer通过Sendgrid发送大量电子邮件。

我在一些电子邮件地址上收到一个符合RFC的错误。

一种解决方案是删除抛出错误的条件,这确实有效,但需要更改核心。如何在站点文件而不是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的脚本,并在validateEmailForRFC类中执行它,这将使它们符合RFC。

最后,我为之前检查没有发现的有奇怪字符的掉队者做最后一次预赛。

这使我能够保持Symfony核心不变,并为Swift准备地址,而不会出现合规性错误。

您可以使用symfony的sfValidatorEmail或filter var函数。它们与SwiftMailer配合使用已经足够好了,但它们都不是符合RFC的IIRC。为了根据RFC进行验证,您可以使用https://github.com/egulias/EmailValidator或https://github.com/dominicsayers/isemail.