我正在使用 SYmfony 1.4 和 swift mailer 通过 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 合规性。如果是这样,我可以从数组中取消它。
2013 年 7 月 17 日更新
我能够对每个地址进行彻底清理,使其符合 RFC,从而解决了问题。但是,我想知道 SwiftMailer 中是否存在执行此检查的函数,而不是编写自定义函数。
2013 年 7 月 18 日更新
这就是我要工作的地方。我试图尽可能地清理条目。
在名为的变量中加载地址数组$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 准备好地址,而不会出现合规性错误。