0

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

Show Original发送这封电子邮件后,当我通过GMail 下拉菜单中的按钮 [在电子邮件的右上角]查看原始邮件内容时,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

4

3 回答 3

2

在处理电子邮件时,请尝试坚持 MVC 原则。通过在可能是控制器的地方编写电子邮件的 HTML(视图)可能会使事情变得有点混乱并容易使您的代码膨胀(例如,在控制器中编写标记)。

使用模板创作您的电子邮件结构,然后使用视图变量 ( $this->set(...)) 对其应用特定值(参见文档)。

恐怕我不知道为什么要插入标签,但我怀疑它与每次按回车键时隐式插入<p>的换行符有关。\n

总之,将您的标记移至模板,一切都会变得更好。

于 2013-04-20T19:05:23.457 回答
2

如果您直接设置电子邮件的正文,CakePHP 期望传递的文本是纯文本

通过将电子邮件类型设置为 HTML ( ),CakePHP 将通过将换行符转换为标签Email->sendAs = 'html'来创建纯文本正文的 HTML 版本<p>

在您的情况下,您将 HTML 作为消息正文传递,但 CakePHP 假定它是纯文本,因此也将新行转换为<p>标签

在此处阅读文档:发送基本消息

笔记

虽然这应该可以解释您的问题,但请查看 Sam 提供的答案,因为这将为您提供有关如何发送 HTML 电子邮件的答案

于 2013-04-20T21:54:26.980 回答
1

default.ctp我找到了解决方案...我需要在我的应用程序文件夹中创建自己的文件app/views/elements/email/html/default.ctp并将以下内容放入文件中

<?php
echo $content;

这解决了我的问题。请看下面对这个问题的分析。

app/views/elements/email/text/default.ctp[PS 我为正确打印基于文本的邮件做了同样的事情]


问题是,由于我没有default.ctp在自己的 app 文件夹中声明任何元素,因此 cake 回退到其自己的核心 lib 文件夹中的视图元素cake/libs/view/elements/email/html/default.ctp。在那里,这就是它的作用。

<?php
$content = explode("\n", $content);
foreach ($content as $line):
    echo '<p> ' . $line . "</p>\n";
endforeach;
?>

这就是<p>每个新行的标签来自哪里。感谢@thaJeztah 的回答。为了避免这种情况发生,我需要default.ctp在我的 app 文件夹中创建自己的元素,该元素最终会覆盖default.ctp核心 lib 文件夹中的元素。

这是一种糟糕的情况。

于 2013-04-20T23:33:50.260 回答