保存后在 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 中发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中发送电子邮件后在表格中设置“状态 = 已发送”

Cakephp SMTP 电子邮件语法错误

如何在android中发送电子邮件[重复]

如何在 VC++ 中发送电子邮件?

sh 在shell中发送电子邮件

如何在 Android 中发送电子邮件? [复制]