2012-11-23 71 views
1

用这个拉我的头发。CakePHP - 不能通过SMTP发送电子邮件

当我在本地机器上开发了这个cakephp(2.2)应用程序时,我可以通过使用smtp的gmail发送电子邮件而没有任何问题。从那以后,我将它部署到1and1服务器上,不能再发送。更令人沮丧的是,我似乎无法从蛋糕中获得任何像样的调试信息。

继承人的代码:

if($fu['name']) {    

      $url = Router::url('/admin/', true); 
      $ms = $url; 
      $ms = wordwrap($ms,1000); 

      //============Email================// 
      // SMTP Options 
      $this->Email->smtpOptions = array(
       'port'=>'465', 
       'timeout'=>'30', 
       'host' => 'ssl://smtp.gmail.com', 
       'username'=>'[email protected]', 
       'password'=>'password' 
       ); 
      $this->Email->template = 'newExpenseClaim'; 
      $this->Email->from = 'Expense Tracker <[email protected]>'; 
      $this->Email->to  = '[email protected]'; 
      $this->Email->subject = 'New Expense Claim Submitted - Please Review'; 
      $this->Email->sendAs = 'both'; 

      $this->Email->delivery = 'smtp'; 

      // Set username & url in email 
      $this->set('user', $fu['name']); 
      $this->set('ms', $ms); 
      //$this->Email->send(); 

      if(!$this->Email->send()) { 
       CakeLog::write('debug', $this->Email->smtpError); 
      } 

      $this->set('smtp_errors', $this->Email->smtpError); 

      //============EndEmail=============// 
     } 

我得到以下调试信息失败的每个时间(显示在屏幕上,没有进入调试日志是大量是烦人)。

Connection refused 

Error: An Internal Error Has Occurred. 
Stack Trace 

    CORE/Cake/Network/Email/SmtpTransport.php line 95 → CakeSocket->connect() 
    CORE/Cake/Network/Email/SmtpTransport.php line 60 → SmtpTransport->_connect() 
    CORE/Cake/Network/Email/CakeEmail.php line 1059 → SmtpTransport->send(CakeEmail) 
    CORE/Cake/Controller/Component/EmailComponent.php line 345 → CakeEmail->send(null) 
    APP/Controller/ExpenseClaimsController.php line 236 → EmailComponent->send() 
    APP/Controller/ExpenseClaimsController.php line 278 → ExpenseClaimsController->notifyAdminsOfNewClaims() 
    [internal function] → ExpenseClaimsController->add() 
    CORE/Cake/Controller/Controller.php line 485 → ReflectionMethod->invokeArgs(ExpenseClaimsController, array) 
    CORE/Cake/Routing/Dispatcher.php line 186 → Controller->invokeAction(CakeRequest) 
    CORE/Cake/Routing/Dispatcher.php line 161 → Dispatcher->_invoke(ExpenseClaimsController, CakeRequest, CakeResponse) 
    APP/webroot/index.php line 92 → Dispatcher->dispatch(CakeRequest, CakeResponse) 

任何人都可以帮忙吗?在此先感谢

**更新了包装和soctet信息**

这些都是包装和插座我从这些函数返回:

包装器:

array(
    (int) 0 => 'https', 
    (int) 1 => 'ftps', 
    (int) 2 => 'compress.zlib', 
    (int) 3 => 'compress.bzip2', 
    (int) 4 => 'php', 
    (int) 5 => 'file', 
    (int) 6 => 'data', 
    (int) 7 => 'http', 
    (int) 8 => 'ftp', 
    (int) 9 => 'zip' 
) 

套接字

array(
    (int) 0 => 'tcp', 
    (int) 1 => 'udp', 
    (int) 2 => 'unix', 
    (int) 3 => 'udg', 
    (int) 4 => 'ssl', 
    (int) 5 => 'sslv3', 
    (int) 6 => 'sslv2', 
    (int) 7 => 'tls' 
) 

回答

1

首先,你应该检查你的主机支持outg连接。简单的检查类似于

echo implode("", file("http://google.com"));

在第二,你应该检查什么PHP支持SSL连接,它具有流包装的SSL。 我现在不记得你如何检查它。但在谷歌搜索关键字:PHP流封装SSL

+0

嗨,我刚刚检查你说的文件()代码,它会返回这个:'URL文件访问被禁用在服务器配置中' 我是没有试图让文件访问一个url,但只能通过smtp发送 - 当然它不一样? –

+0

我正在查看phpinfo文件,我该找什么? –

+0

如果在主机上禁用URL文件访问,那么99%被禁用与套接字一起使用。用于连接到Gmail的套接字。你可以使用这个函数获取包装的列表:http://www.php.net/manual/en/function.stream-get-wrappers.php和支持的套接字列表:http://www.php.net/ manual/en/function.stream-get-transports.php – newman