这是蛋糕代码.....注意$email_body
<?php
$this->Email->reset();
$this->Email->delivery = 'smtp';
$this->Email->smtpOptions = array(
'port'=>'465',
'timeout'=>'30',
'host' => 'ssl://smtp.gmail.com',
'username'=>'noreply@example.com',
'password'=>'a_password_you_cant_see',
);
$this->Email->sendAs = 'html';
$this->Email->template = 'default';
$this->Email->from = '"NO-REPLY" <noreply@example.com>';
$this->Email->to = "rakib@example.com";
$this->Email->subject = "test PHP html email";
$email_body = "Hello message body
<hr />
This is rakib
<br />
<table width=\"100%\" bgcolor=\"#ff0\">
<tr>
<td>
In a table
</td>
</tr>
</table>";
$this->Email->send($email_body);
?>
发送此电子邮件后,当我通过GMail的下拉菜单中的Show Original
按钮[在电子邮件的右上角]查看原始邮件内容时,这就是HTML的样子:
<!-- Starting to render - email/html/default -->
<p> Hello message body</p>
<p> <hr /></p>
<p> This is rakib</p>
<p> <br /></p>
<p> <table width="100%" bgcolor="#ff0"></p>
<p> <tr></p>
<p> <td></p>
<p> In a table</p>
<p> </td></p>
<p> </tr></p>
<p> </table></p>
<p> </p>
<!-- Finished - email/html/default -->
<p>
和</p>
个标签.....为什么会这样?使用CakePHP 1.3
答案 0 :(得分:2)
在使用电子邮件做任何事情时,请尝试坚持使用MVC原则。通过在可能是控制器的情况下编写电子邮件的HTML(视图)可能会使事情变得有点混乱,并且会使代码膨胀(例如在控制器中编写标记)。
使用模板编写电子邮件结构,然后使用视图变量($this->set(...)
)向其应用特定值(请参阅documentation)。
我担心我不知道为什么会插入<p>
标签,但我怀疑它与换行符\n
有关,每次点击返回时都会隐式插入键。
总之,将您的标记移动到模板,一切都应该更好。
答案 1 :(得分:2)
如果您直接设置电子邮件正文,CakePHP希望传递的文本为纯文本。
通过将电子邮件类型设置为HTML(Email->sendAs = 'html'
),CakePHP将通过将新行转换为<p>
标记来创建纯文本正文的HTML版本
在您的情况下,您将HTML作为邮件正文传递,但CakePHP假定它是纯文本,因此将新行转换为<p>
标记
请阅读此处的文档:Sending a basic message
虽然这应该解释您的问题,但请查看Sam提供的答案,这将为您提供应该发送HTML电子邮件的答案!
答案 2 :(得分:1)
我找到了解决方法......我需要在default.ctp
的app文件夹中创建自己的app/views/elements/email/html/default.ctp
文件并将以下内容放在文件中
<?php
echo $content;
这解决了我的问题。请看下面的问题分析。
[P.S。我为app/views/elements/email/text/default.ctp
做了同样的事情,基于文本的邮件正确打印了]
问题是 ,因为我没有在我自己的app文件夹中声明任何default.ctp
元素,所以蛋糕正在回落到视图元素中cake/libs/view/elements/email/html/default.ctp
上自己的核心lib文件夹。在那里,这就是它的作用。
<?php
$content = explode("\n", $content);
foreach ($content as $line):
echo '<p> ' . $line . "</p>\n";
endforeach;
?>
这就是<p>
标签来自每个新行的地方。感谢@thaJeztah's answer。为了避免这种情况发生,我需要在我的app文件夹中创建自己的default.ctp
元素,该元素最终将覆盖核心lib文件夹中的default.ctp
元素。
这是一个不好的情况。