我如何使用CakePHP电子邮件组件?

时间:2010-01-05 13:36:30

标签: email cakephp

我是CakePHP的新手,拼命想学习!

我最近的斗争是使用电子邮件组件。

我有合同。当我创建合同时,我添加了一个用户。当我保存新合同时......我第一次在合同中向用户发送一封电子邮件,允许他们点击返回合同的链接,然后接受或拒绝合同。

如何发送此电子邮件?

我能得到的细节越多,回答越多越好。我在那里读到的所有内容都令人惊讶地令人困惑。我需要配置smtp设置吗?保存后如何抓住合同中的用户并将其传递给合同的链接到电子邮件?我怎么知道电子邮件是否已经发送,而不是每次都检查我的电子邮件?

以下是我在contract_controller.php中为电子邮件发送功能提供的代码:(合同属于用户,用户有多个合同。)

function _sendContractEmail($id) {
        $this->Email->smtpOptions = array(
        'port'=>'465',
        'timeout'=>'30',
        'host'=>'ssl://smtp.gmail.com',
        'username'=>'username',
        'password'=>'password'
        );
        $this->Email->delivery = 'smtp';
        $User = $this->Contract->User->read(null,$id);
        $this->Email->to = 'jeremiah@jeremiahotis.com';
        $this->Email->subject = '';
        $this->Email->replyTo = 'no-reply@goodvaluation.com';
        $this->Email->from = 'Jeremiah Oits <jeremiah@jeremiaotis.com>';
        $this->Email->template = 'simple_message';
        $this->Email->sendAs = 'html';
        $this->set('User', $User);
        $this->Email->_debug = true;
        $this->Email->send('Test Email');
        $this->redirect(array('controller'=>'contracts', 'action'=>'index'));
    }

以下是我在contract_controller.php add()函数中的代码:

function add() {
        if (!empty($this->data)) {
            $this->Contract->create();
            if ($this->Contract->save($this->data)) {
                $this->Session->setFlash(__('The Contract has been saved', true));
                $this->_sendContractEmail($this->Contract->User->id);
            } else {
                $this->Session->setFlash(__('The Contract could not be saved. Please, try again.', true));
            }

而且,在$ name和$ helpers之后,这是我的contracts_controller.php文件的顶部:

var $components = array('Email');

我想我应该指出我的模板有问题,所以为了测试它,我直接在send()中包含了电子邮件的正文,并且我指定了电子邮件地址而不是使用变量。依然没有!没有错误,没有电子邮件。

任何帮助将不胜感激!我真的不知道我做错了什么!

谢谢,

3 个答案:

答案 0 :(得分:2)

http://book.cakephp.org/view/481/Sending-A-Message-Using-SMTP

使用页面中的代码示例,特别是最后一节获取错误通知

/* Check for SMTP errors. */
    $this->set('smtp-errors', $this->Email->smtpError);

您可以使用 pr(smtp-errors)视图打印smtp错误。

电子邮件的布局应位于

/app/view/layout/email/html
/app/view/layout/email/text

如果您想复制和修改默认模板,可以在

下找到
/libs/view/layouts/email/html
/libs/view/layouts/email/text

您的代码看起来是正确的。问题可能在于SMTP服务器拒绝该电子邮件。

哦,您还应该检查 / app / tmp / logs

下的debug.log和error.log

答案 1 :(得分:0)

我会把它放在评论中,但它有点长。

您是否尝试过仅使用本地电子邮件服务器,而不是连接到Gmail?可能是gmail服务器拒绝您的电子邮件,因为它是从本地源生成的。我建议在本地尝试像MDaemon这样的东西,看看你是否可以先给自己发一封电子邮件。一定要允许开放中继,否则你的邮件会在本地反弹。

您在哪里保存了电子邮件模板?他们应该在这里,app/views/elements/email/htmlapp/views/elements/email/text也一定要设置你的内容,并在模板中使用echo $ content_for_layout按照文档,http://book.cakephp.org/view/269/Sending-a-basic-message api也值得一看确保您拥有正确的参数http://api.cakephp.org/class/email-component

要将详细信息传递到电子邮件中,您只需在控制器操作中使用$ this-&gt;设置,然后在电子邮件模板中,您可以执行echo $ var输出。电子邮件就像常规视图一样,除了通过电子邮件而不是浏览器发送。

如果要检查邮件是否已发送,则可以在if语句中包装$ email-&gt; Send()。

if($email->Send()){ echo "Your contract has been dispatched!"; }

这让我觉得你有没有实例化电子邮件组件?我倾向于使用,

$email = new Email();

然后在其上设置类变量。我没有看到它用作$ this-&gt;之前的电子邮件,虽然这可能很有效:)

答案 2 :(得分:0)

也许这个问题已经解决,但对我来说解决方案是安装一个电子邮件服务器。我选择了postfix;有一个有用的指南可以在https://help.ubuntu.com/community/MailServer安装它。

有了它,您不必从Mail的实例设置smtpOptions,考虑到该邮件也可以作为垃圾邮件传送。