使用 Zend_View 中的文本电子邮件模板丢失换行符

Posted

技术标签:

【中文标题】使用 Zend_View 中的文本电子邮件模板丢失换行符【英文标题】:Text email template in using Zend_View losing line breaks 【发布时间】:2011-03-25 05:44:16 【问题描述】:

我正在使用 Zend_View 来模板文本电子邮件内容。但是,我遇到了一个我无法解决的问题:如果一行以 php 块 (?>) 结尾,则换行符丢失。

有人知道我该如何解决这个问题吗?

应用程序正在使用 Zend 框架,但我没有特别的理由使用 Zend_View 来呈现电子邮件模板(除了它看起来是最简单、最明显的方法),所以如果有替代解决方案,那就是不错。

我试过检查原始文本输出,换行符完全丢失了。看不到“\r”或“\n”,所以没有什么可以替换的了。

发送电子邮件的代码:

$emailView = new Zend_View(); $emailView->setScriptPath(realpath (FRONTEND_APPLICATION_PATH .'/../email/')); $bodyText = $emailView->render('recruitment-job-alert-text.phtml'); // $model = new Model_VacancyDetail(); // $model->find(1); // $emailView->vacancyDetail = $model; $mail = 新 Zend_Mail(); $mail->setSubject( '工作提醒:' . $model->references['vacancy_type'] ); $mail->addTo($fromEmail, $fromName); $mail->setFrom($fromEmail, $fromName); $mail->setBodyHtml($bodyHtml); $mail->setBodyText($bodyText); $邮件->发送();

电子邮件模板内容:

标题:= $this->escape($this->vacancyDetail->references['vacancy_type']) ?> 位置:= $this->vacancyDetail->references['name'] ?> 部门:= $this->vacancyDetail->references['department_name'] ?> 需要驾驶执照:= ($this->vacancyDetail->requireDrivingLicence == 1) ? “是”:“不是”?> 工作时间:= $this->vacancyDetail->workingHours ?>。 好处:= $this->vacancyDetail->好处 ?>。 薪水:= $this->vacancyDetail->salary ?>。 细节: = strip_tags($this->vacancyDetail->description) ?> 现在申请 http://www.example.com/recruitment

生成的电子邮件内容示例:

标题:示例空缺类型 地点:示例地点部门:示例部门要求驾驶执照:是工作时间:40。 福利:公司用车。 薪水:15,000英镑。 细节: 这是一个示例位置。它并不存在。 现在申请 http://www.example.com/recruitment

【问题讨论】:

在 PHP 脚本查看时,电子邮件是否不显示换行符或文本没有换行符?即 var_dump($bodyText);死;在脚本中执行此操作然后查看源代码,换行符还在吗?如果是这样,那么就是邮件部分正在删除它,否则就是 zend_view。 它们在视图被渲染后不在那里,但在它们被放入 Zend_Mail 之前,所以它看起来像是 Zend_View 或 php 本身的问题(还没有查看到底如何文件由 Zend_View 渲染) 【参考方案1】:

我相信只有 3 个选项。

1- 按照蒂姆的建议做并添加额外的“\n”

2- 在 ?> 的末尾添加一个空格:

Title: <?= 'xxx' // NO SPACE here >>> ?>
Location: <?= 'loc' // SPACE HERE >>> ?> 
Department: <?= 'RIAA' ?>

结果是:

Title: xxxLocation: loc
Department:

3- 添加第二个换行符,即:

Title: <?= 'xxx' // NO EXTRA newline >>> ?>
Location: <?= 'loc' // EXTRA HERE >>> ?>

Department: <?= 'RIAA' ?>

结果是:

Title: xxxLocation: loc
Department:

我知道这很糟糕,但你可以做的事情并不多。您可以告诉使用您系统的其他开发人员这是 PHP 的限制,我相信他们会理解。

PHP 这样做的原因是因为通常 PHP 用于 HTML 文件,它不需要所有可能导致 HTML 文件出现问题的额外换行符。如果您正在处理纯文本,则必须准备好实现一些特殊的东西,因为在处理计划文本和脚本语言时会遇到许多奇怪的事情。

【讨论】:

我的编辑器会修剪尾随空格,所以我在行尾使用Non-breaking space。【参考方案2】:

我相信是 PHP 在吃掉 ?> 之后的换行符。一般来说这是一件好事,但我明白为什么在你的情况下它很烦人。

您可能需要执行以下操作:

Title: <?= $this->escape($this->vacancyDetail->references['vacancy_type'])."\n" ?>

Location: <?= $this->vacancyDetail->references['name']."\n" ?>
Department: <?= $this->vacancyDetail->references['department_name']."\n" ?>

编辑:

这是一个参考,只是为了确认我不会发疯:http://www.php.net/manual/en/faq.using.php#faq.using.newlines

为什么这是一件好事?想象一下您的电子邮件模板是:

Title: <?= $this->escape($this->vacancyDetail->references['vacancy_type'])."\n" ?>

<?php if (!empty($this->vacancyDetail->references['name']))  ?>
Location: <?= $this->vacancyDetail->references['name']."\n" ?>
<?php  ?>
Departments:
<?php foreach ($this->vacancyDetail->references['departments'] as $dept)  ?>
<?=$dept->name."\n"?>
<?php  ?>

在这种情况下,您不希望在实际输出的每行之间出现几个换行符(我最近在非 PHP 项目的电子邮件模板中遇到的问题)。

您的另一个选择可能是不将模板存储在 PHP 中,只需使用 name、department_name 或类似变量作为变量,然后将它们解析出来。

【讨论】:

我不想使用这种方法。该项目是其他开发人员将使用的框架,因此我宁愿不需要仅适用于特定情况的代码。如果可能的话,我希望在模板文件中添加换行符 === 生成的电子邮件中的换行符。坦率地说,我不明白 PHP 仅仅因为它们出现在 ?> 之后而不必要地吃掉换行符是一件好事(除非它们出现在文件的最后 - 但这应该是一种特殊情况而不是规则)。 根据您的评论,我已经将我的答案扩展了一点。我认为这只是大多数时候你甚至没有注意到的方便的东西之一,但在这种情况下并不理想。有时,当您查看非 PHP 网站的 HTML 源代码并看到大量换行符时 - 这就是原因!

以上是关于使用 Zend_View 中的文本电子邮件模板丢失换行符的主要内容,如果未能解决你的问题,请参考以下文章

如何在不丢失 css 的情况下将模板从桌面发送到移动设备

如何在 django 模板中的一行中显示来自 db 的输出文本

Google脚本:从文档生成电子邮件会丢失格式

Django - 在同一个模板(ajax 和表单)中处理多个 CSRF 令牌禁止(CSRF 令牌丢失或不正确。)

邮件模板——科普篇

ThymeLeaf 中的条件文本:如何以纯文本形式进行?