CakePHP在每个新行</p>处呈现带有<p>标记的HTML电子邮件

时间:2013-04-20 13:31:35

标签: html cakephp cakephp-1.3 html-email

这是蛋糕代码.....注意$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

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元素。

这是一个不好的情况。