我正在使用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.