我正在尝试使用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错误?
提前致谢!!
答案 0 :(得分:0)
检查导致此错误的异常的确切位置,很可能不在您发布的try
块中,而是采用CakeEmail
方法之一(from
,验证地址的sender
,replyTo
等...)。
话虽这么说,你应该将单个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;
}