【问题标题】:CakePHP Catch Invalid EmailCakePHP 捕获无效的电子邮件
【发布时间】:2013-09-09 19:28:56
【问题描述】:

我正在尝试使用 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 错误吗?

提前致谢!!

【问题讨论】:

    标签: php cakephp sendmail


    【解决方案1】:

    无效的电子邮件地址会在设置时立即引发异常。这发生在调用 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;
    }
    

    【讨论】:

    • 这看起来像我要找的。将对此进行测试,一旦我开始工作就会更新。谢谢,JCMX!
    【解决方案2】:

    检查引发此错误的异常的确切位置,它很可能不在您发布的try 块中,而是在CakeEmail 方法之一中(fromsender、@987654326 @, etc...) 来验证地址。

    话虽如此,您可能应该将单个 CakeEmail 方法调用包装到 try catch 块中(以防您想根据确切的值错误响应正确的错误消息),或者可能使用单个包装所有操作并输出通用错误消息。

    还要注意CakeEmail::send()返回array(包含标题和消息数据),而不是boolean,确定电子邮件是否发送成功必须使用try...catch完成,即当没有异常时被抛出,那么E-Mail应该发送成功了。

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

    $Email = new CakeEmail();
    
    try
    {
        $Email->from($from);
        $Email->to($to);
        // etc...
    
        try
        {
            $Email->send();
            $this->Session->setFlash(__('Email successfully sent'), 'flash/success');
        }
        catch(SocketException $e)
        {
            $this->Session->setFlash(__('Could not invite guests. Please, try again.'), 'flash/error');
        }
    }
    catch(SocketException $e)
    {
        $this->Session->setFlash(__('Bad input'), 'flash/error');
    }
    
    $this->redirect($this->referer());
    

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 2015-01-14
      • 2014-11-26
      • 2016-03-30
      • 2013-04-08
      • 2013-04-01
      • 2012-06-14
      • 2017-09-18
      相关资源
      最近更新 更多