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

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

问题描述:

我是CakePHP的新手,拼命学习!如何使用CakePHP电子邮件组件?

我最近的努力与电子邮件组件。

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

如何发送此电子邮件?

我可以得到更多的细节,回答明智,更好。我读过的所有内容都令人惊讶地令人困惑。我需要配置smtp设置吗?在保存合同后,我如何获取合同中的用户,并将合同中的链接和合同链接传递给电子邮件?我怎么知道电子邮件是否已发送,而无需每隔一段时间检查一次我的电子邮件?

这里是我在我的contracts_controller.php的电子邮件发送功能的代码:(一种合同属于关联用户,和用户的hasMany合同)

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 = '[email protected]'; 
     $this->Email->subject = ''; 
     $this->Email->replyTo = '[email protected]'; 
     $this->Email->from = 'Jeremiah Oits <[email protected]>'; 
     $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文件$名称后的顶部和$助手:

var $components = array('Email'); 

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

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

感谢,

耶利米

+1

是否有正常的PHP邮件工作?你有一个smtp服务器设置?这可能是一个常规的PHP配置问题,而不是蛋糕特定的。 – 2010-01-05 13:48:26

+0

查看/ app/tmp/logs/ – HyperCas 2010-01-05 22:19:05

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服务器拒绝电子邮件。

哦,你也应该检查你和的debug.log下/应用程序的/ tmp /日志

我会把这一个评论,但它变得有点长。

您是否尝试过使用本地电子邮件服务器,而不是连接到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来输出它。该电子邮件的工作原理与普通视图相似,只是通过电子邮件而不是浏览器发送。

如果你想检查邮件是否已经发送,那么你可以在if语句中包装$ email-> Send()。

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

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

$email = new Email(); 

然后设置类变量。我从来没见过它作为这个 - $>电子邮件之前,尽管这可能会很好地工作:)

+0

下的错误日志我第二次尝试在通过gmail发送邮件之前尝试在本地发送邮件。另外,我认为,我认为gmail对通过SMTP发送的电子邮件数量/天数有严格的限制--500或1k。所以如果你的应用需要发送更多的信息,你需要一个不同的解决方案。就我个人而言,我使用gmail接收邮件,并通过本地服务器发送外发邮件(也允许您在邮件服务器设置中进行快速拨号,以便您可以转储“from travis代表......”行) – 2010-01-05 16:34:05

+0

另外,如果您将David电子邮件在控制器中的$ components数组中,控制器将为您实例化它,创建一个可以从Controller :: Email访问的成员属性(如上所述) – 2010-01-05 16:35:06

+0

您也可以尝试使用第三方电子邮件库PHPMailer确保您的smtp设置是正确的 – HyperCas 2010-01-05 22:20:54

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

有了它,您不必设置smtpOptions从邮件的情况下,考虑到该消息可能也提供为垃圾帐户。