我们如何在cakePHP中的AppController中设置电子邮件配置?

时间:2014-09-26 12:51:22

标签: cakephp-2.0

我想在cakephp中覆盖App Controller中的电子邮件配置设置,我的电子邮件服务器设置存储在数据库中,管理员有权随时更改这些设置,因此我需要在我的应用中动态更新这些设置。我的App Controller代码如下:

<?php
class AppController extends Controller {
public $helpers = array('Front','Custom','Js'=>array('Jquery','MooTools'));
public $components = array(
'Security' => array(
'blackHoleCallback' => 'blackhole',
'csrfUseOnce' => false
),
'Session','Email',
'Auth','Cookie',
'Facebook.Connect' => array('model' => 'User'),'Custom','RequestHandler'
);
public function beforeFilter()
{
parent::beforeFilter();
//Admin Settings
foreach($this->Custom->getSettings() as $key=>$val):
Configure::write("Adminsetting.".$key,$val);
endforeach;
// End Admin Setting
$siteconf=Configure :: read('Adminsetting');
/* Email Server Setting */
//if($siteconf['transport']=='Smtp'){
$this->Email->delivery='Smtp';
$this->Email->smtpOptions=array(
'port'=>$siteconf['port'],
'timeout'=>$siteconf['timeout'],
'host' => $siteconf['hostname'],
'username'=>$siteconf['username'],
'password'=>$siteconf['password']
);
.....
?>

When I using $this->Email->sent() I am getting this error:
"No connection could be made because the target machine actively refused it."
Please suggest...

1 个答案:

答案 0 :(得分:0)

您的电子邮件配置设置位于/app/Config/email.php中。 在发送任何新电子邮件之前的任何时候,您都可以覆盖并设置默认电子邮件参数。

我建议在设置表中处理您的自定义电子邮件设置(并通过烘焙命令行或遵循博客教程创建适当的控制器和模型和视图)。

您的表格可以遵循以下架构:

CREATE TABLE `settings` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  `key` varchar(255) DEFAULT NULL,
  `value` varchar(255) DEFAULT NULL,
  `type` varchar(255) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

然后在AppController类的beforeFilter()回调中加载所有设置。 你可以这样做:

public function beforeFilter() {
    $this->Setting = ClassRegistry::init('Setting');
    $settings = $this->Setting->find('list', array('fields' => array('key' => 'value')));
    foreach($settings as $key => $value) {
        Configure::write($key, $value);
    }
}

使用基本的CRUD操作,您现在可以管理任何设置。

现在,当您想要发送电子邮件时,您应该以某种方式调整您的代码:

$Email = new CakeEmail();
$Email->template('welcome', 'fancy')
    ->emailFormat(Configure::read('emailFormat'))
    ->to('bob@example.com')
    ->from('app@domain.com')
    ->transport(Configure::read('transport'))
    ->host(Configure::read('host'))
    ->port(Configure::read('port'))
    ->username(Configure::read('username'))
    ->password(Configure::read('password'))
    ->send();

警告。这应该回答你的问题,但这不是我个人所做的,因为现在任何现有的设置都可以被覆盖,而且非常危险。