保存后在 CakePHP 中发送电子邮件
Posted
技术标签:
【中文标题】保存后在 CakePHP 中发送电子邮件【英文标题】:Send Email in CakePHP afterSave 【发布时间】:2012-01-13 16:57:08 【问题描述】:我正在尝试创建一个电子邮件组件/模型,它将向数据库添加电子邮件(具有某些字段,如收件人、发件人、主题、消息、创建、修改等)。
在成功保存数据后(目前是这样),我想实际发送消息。
我认为使用 afterSave() 函数会最简单,但我无法发送电子邮件。
以下是一些相关代码:
电子邮件模型
<?php
class Email extends AppModel
var $name = 'Email';
var $displayField = 'subject';
function afterSave()
$this->Email->to = $this->data['Email']['email'];
$this->Email->subject = $this->data['Email']['subject'];
$this->Email->replyTo = $this->data['Email']['email'];
$this->Email->from = 'Private Message <' . $this->data['Email']['email'] . '>';
//$this->Email->template = 'simple_message';
$this->Email->send($this->data['Email']['email_text']);
add.ctp 用于电子邮件
<div class="universities form">
<?php echo $this->Form->create('Email');?>
<fieldset>
<legend><?php __('Add Email'); ?></legend>
<?php
echo $this->Form->input('subject');
echo $this->Form->input('email_text');
echo $this->Form->hidden('email', array('value' => $this->params['named']['contact_email']));
echo $this->Form->hidden('user_from', array('value' => $this->Session->read('User.id')));
echo $this->Form->hidden('created', array('value' => date("Y-m-d")));
echo $this->Form->hidden('modified', array('value' => date("Y-m-d")));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit', true));?>
</div>
控制器保存代码:
function add()
if (!empty($this->data))
$this->Email->create();
// pr($this->data);
// die;
if ($this->Email->save($this->data))
$this->Session->setFlash(__('The email has been saved', true));
else
$this->Session->setFlash(__('The email could not be saved. Please, try again.', true));
我在尝试发送时出错:
Fatal error: Call to undefined method stdClass::send() in /Users/[USER]/Sites/example_app/app/models/email.php on line 14
新控制器代码:
function add()
if (!empty($this->data))
$this->Email->create();
// pr($this->data);
// die;
if ($this->Email->save($this->data))
$this->Session->setFlash(__('The email has been saved', true));
function _sendMail()
$this->Email->to = $this->data['Email']['email'];
$this->Email->subject = $this->data['Email']['subject'];
$this->Email->replyTo = $this->data['Email']['email'];
$this->Email->from = 'Private Message <' . $this->data['Email']['email'] . '>';
$this->Email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text')
$email->send();
$this->_sendMail();
else
$this->Session->setFlash(__('The email could not be saved. Please, try again.', true));
【问题讨论】:
【参考方案1】:组件是用于控制器,而不是模型——所以最简洁的方法是在 $this->Model->save() 返回 true 时从控制器发送邮件。
因为您确实将模型命名为“电子邮件”,所以我认为您不能以标准方式使用组件“电子邮件”并且需要手动加载它:
在控制器中(函数add())
if ($this->Email->save($this->data))
// save was successfull
App::import('Component', 'Email');
$email = new EmailComponent();
$email->startup($this);
$email->from='joe@example.com';
$email->to = $this->data['Email']['email'];
$email->subject = $this->data['Email']['subject'];
$email->replyTo = $this->data['Email']['email'];
$email->from = 'Private Message <' . $this->data['Email']['email'] . '>';
$email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text')
$email->send();
$this->Session->setFlash(__('The email has been saved', true));
尽管如此,可以从模型发送邮件,请参阅此(重复)线程的第二个答案: How do I use the email component from a model in CakePHP?
【讨论】:
如果我在控制器的 afterSave 中使用相同的代码,它会起作用,还是我需要修改其他东西? hmm ...这并不容易,因为您的模型也被命名为“电子邮件” - 您可以将控制器中保存数据的部分发布到模型中吗? 好的,我已将其移至控制器,并按照上面答案中该链接中的说明进行操作,并收到我刚刚添加到大文本底部的错误消息。 添加了我正在尝试的新控制器代码,顺便感谢您的帮助。真的很感激。 所以我应该将代码保留在我的模型中并将您的代码插入它上面?抱歉,不是每个人都像其他人一样有经验和了解 CakePHP...再次感谢您的帮助。以上是关于保存后在 CakePHP 中发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章