Как продлить MailboxHeader.php в почтовой программе Swift или для проверки электронных писем


Я работаю с SYmfony 1.4 и почтовой программой swift для отправки большого массива электронных писем через Sendgrid.

Я получаю ошибку соответствия RFC на некоторых адресах электронной почты.

Одним из решений было бы удалить условие, вызывающее ошибку, и это действительно работает, но требует изменения ядра. Как бы вы расширили MailboxHeader.php в файлах сайта, а не в ядре symfony. Что-то вроде этого, но не это, потому что это не работает:

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 без ошибок соответствия.

Author: Carey Estes, 2013-07-16

1 answers

Вы можете использовать функцию symfony sfValidatorEmail или функцию filter-var. Они достаточно хорошо работают с SwiftMailer, но ни один из них не является IIRC, совместимым с RFC. Для проверки на соответствие RFC вы можете использовать https://github.com/egulias/EmailValidator или https://github.com/dominicsayers/isemail.

 3
Author: 1ed, 2016-04-23 18:31:45