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

Posted

技术标签:

【中文标题】如何使用 CakePHP 电子邮件组件?【英文标题】:How do I use the CakePHP Email Component? 【发布时间】:2011-01-01 15:43:19 【问题描述】:

我是 Cakephp 的新手,正在拼命学习!

我最近的挣扎是电子邮件组件。

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

我如何发送这封电子邮件?

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

这是我在contracts_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'));
    

这是我在contracts_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));
            

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

var $components = array('Email');

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

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

谢谢,

耶利米

【问题讨论】:

普通的php邮件能用吗?你有 smtp 服务器设置吗?这可能是一个常规的 php 配置问题,而不是特定于蛋糕的问题。 检查 /app/tmp/logs/ 下的错误日志 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

您是否尝试过仅使用本地电子邮件服务器,而不是连接到 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->set,然后在您的电子邮件模板中,您可以执行 echo $var 来输出它。电子邮件的工作方式与常规视图一样,只是它是通过电子邮件而不是浏览器发送的。

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

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

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

$email = new Email();

然后在上面设置类变量。我以前没有看到它用作 $this->Email,虽然这可能很好用:)

【讨论】:

我同意 David 的建议,即在通过 gmail 发送邮件之前尝试在本地发送邮件。此外,我认为 gmail 对每天可以通过 SMTP 发送的电子邮件数量有一个硬性限制——我认为是 500 或 1k。因此,如果您的应用需要发送更多信息,您需要一个不同的解决方案。就我个人而言,我使用 gmail 接收邮件,并通过我的本地服务器发送邮件(还允许您修改邮件服务器设置,以便您可以转储“来自 travis 代表...”行。 另外,David,如果您将 Email 放入控制器的 $components 数组中,控制器将为您实例化它,创建一个您可以从 Controller::Email 访问的成员属性(就像您提到的以上)。 您也可以尝试使用 PHPMailer 等第三方电子邮件库来确保您的 smtp 设置正确。 电子邮件模板应位于 /app/views/layouts/email 和文件夹 'html' 和 'text' 下【参考方案3】:

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

有了它,您不必在邮件实例中设置smtpOptions,考虑到邮件也可能作为垃圾邮件发送。

【讨论】:

以上是关于如何使用 CakePHP 电子邮件组件?的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 使用来自 Shell cronjob 的电子邮件组件

cakephp 电子邮件组件 phpmailer

CakePHP-2.0:如何使用 CakEmail 和 SMTP 设置从 gmail 帐户发送电子邮件?

OpenId 组件:使用 CakePHP 从 Google 获取属性

在 CakePHP 中使用控制器之外的组件

如何在 CakePhp 组件中调用回调?