我正在使用SYmfony 1.4和
swift邮件程序通过Sendgrid发送大量电子邮件.
我在某些电子邮件地址上收到RFC合规性错误.
一个解决方案是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准备好地址.