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