CakePHP捕获无效的电子邮件

时间:2013-09-09 19:28:57

标签: php cakephp sendmail

我正在尝试使用CakePHP(2.3.6)发送电子邮件邀请,其中用户将逗号分隔的电子邮件地址列表输入到输入字段中。

目前,只要没有无效的电子邮件地址,我就可以发送没有问题的电子邮件。但是,我尝试添加一个Try / Catch来捕获错误,如果有错误的电子邮件,但我的代码永远不会遇到问题。

这就是我所拥有的

try {
            if($Email->send()) {
                $this->Session->setFlash(__('Email successfully sent'), 'flash/success');
            } else {
                $this->Session->setFlash(__('Could not invite guests. Please, try again.'), 'flash/error');
                $this->redirect($this->referer());
            }
        } catch(Exception $e) {
            $this->Session->setFlash(__('Could not invite guests. Probably a bad email. Please, try again.'), 'flash/error');
            $this->redirect($this->referer());
        }
        $this->redirect($this->referer());

当我输入无效的电子邮件并进行调试时,我收到以下错误:

  

电子邮件无效:“foo”   错误:发生内部错误。

当调试关闭时:

  

发生了内部错误。

我认为我的Try / Catch有问题,但它对我来说是对的。是否有其他方法可以解决CakePHP错误?

提前致谢!!

2 个答案:

答案 0 :(得分:0)

检查导致此错误的异常的确切位置,很可能不在您发布的try块中,而是采用CakeEmail方法之一(from,验证地址的senderreplyTo等...)。

话虽这么说,你应该将单个CakeEmail方法调用包装到try catch块中(如果你想根据哪个值完全错误来响应正确的错误消息),或者可能使用单个一个包装所有操作并输出一般错误消息。

另请注意,CakeEmail::send()返回array(包含标题和消息数据),而不是boolean,确定是否已成功发送电子邮件必须使用{{1}即,当没有抛出异常时,电子邮件可能已成功发送。

不幸的是,Cookbook缺少一些适当的例子。这是一些未经测试的示例代码,应该说明它是如何工作的:

try...catch

答案 1 :(得分:0)

无效的电子邮件地址会导致在设置时立即抛出异常。这是在调用send方法之前发生的,因此它没有到达您发布的try块。

这是我编写的一个组件,它处理在这里为我们的系统发送几个不同的电子邮件。我已将每个地址设置包装在try块中,因此可以更容易地跟踪违规地址,但如果您不想要那么多细节,可以将它们全部包装在一个块中。您可以使用getMessage方法检查异常中的消息,以查看有问题的地址字符串。这适用于Cake 2.3:

$email = new CakeEmail();
//...

// set to for email
try 
{
    $email->to($recipient);
}
catch(SocketException $e) 
{
    $result['problem'] = 'Recipient Address';
    $result['message'] = $e->getMessage();
    return $result;
}

// set cc for email - not required
try 
{
    if($cclist != '') $email->cc(preg_split('/, */', $cclist));
}
catch(SocketException $e) 
{
    $result['problem'] = 'CC List';
    $result['message'] = $e->getMessage();
    return $result;
}