0

我是一组提供评估服务的网站的网站管理员和首席开发人员。我没有服务器管理方面的背景,并且很惭愧地说成为系统管理员对我来说非常吓人。我对基本的命令行很满意,但我经常对让标准 LAMP 堆栈与多个子域和电子邮件服务器一起运行所需的所有无数配置感到不知所措。

我终于达到了彻底难倒我的东西。让我先列出我们的基本服务器配置:

  • 运行 Ubuntu 12.04 的 VPS
  • 标准 Apache、PHP、Mysql、BIND 服务
  • 上述服务中配置1个主域+4个子域网站,其中2个大量使用mysql数据库,每个数据库有300-400个表
  • Citadel 电子邮件服务器(我越来越认为这是一个错误的选择)
  • Swiftmailer(用于从 PHP 发送自动电子邮件)

当采取特定行动时,我们的一些页面(与帐户和评估管理相关)会向应试者、教练和/或我们发送警报电子邮件。这些电子邮件的文本是从 mysql 数据库中的“样板”表中获取的。然后在 PHP 中,一对“占位符”标签被替换为应试者姓名、日期等。然后 PHP 代码使用 Swift Mailer 将准备好的文本作为电子邮件发送到我们本地的 Citadel 电子邮件服务器,到给定的一组(通常是外部)地址。我们对这些电子邮件中的大多数都进行了抄送,以便为我们提供我们已发送的所有自动消息的第二条记录。

(请随意跳过)这是我获取和处理文本并将其作为电子邮件发送的代码的要点:

$subject = $bp['email_report_title'];
$subject = str_replace("[NAME]", $name, $subject);
$subject = str_replace("[INSTRUMENT_NAME]", $instrument_name, $subject);

$body = $bp['email_report'];
$body = str_replace("[NAME]", $name, $body);
$body = str_replace("[INSTRUMENT_NAME]", $instrument_name, $body);
$body = str_replace("[INSTRUMENT_BASE]", $instrument_base, $body);

sendEmail($email_to, $email_from, $email_cc, $subject, $body);

简而言之,这是我的问题:我们看到的电子邮件(由于上述事件)有时会出现拼写错误——不一致。这里有几张图片作为示例,显示了一组在一天生成和发送的自动电子邮件,这些电子邮件使用来自我们数据库中相同(未更改)字符串的相同PHP 代码绘制。这些是我们在 Mac Mail 中查看的内部 (CC'd) 帐户的屏幕截图;但根据应试者的投诉,所有电子邮件收件人似乎都看到了相同的文本。在第一张图片中,请注意标题中的间距差异。

在第二张和第三张图片中,请注意不正确的链接(末尾有两个句点)。我已经检查了 PHP 代码和 mysql 源文本,并且绝对没有理由将登录链接更改为在那个位置有两个句点。编辑:根据评论者的要求,我复制了图片下方的完整电子邮件文本。

警报电子邮件标题:请注意邮件中的间距不一致 警报电子邮件内容:登录链接应该是什么样子 警报电子邮件内容:登录链接偶尔会是什么样子

[name removed] 的 LSUA 报告已完成。要查看报告,请单击以下链接: https ://www.devtestservice.org/security/logIn..php

登录后,单击 LSUA 图标,然后点击“查看您的报告”链接。

对我们评估的评论是由训练有素的人完成的,他们偶尔会犯错误。如果您在报告中发现任何不一致或错误,请告知我们,我们将及时修复。如果您在登录或查看报告时遇到任何问题,请使用以下链接与我们联系: https ://www.devtestservice.org/contactus.php


Lectica, Inc. 北安普顿, MA 01060

我们的使命是对应对 21 世纪挑战所需的知识和技能进行标准化、形成性和诊断性的发展评估。我们的目标有三个:(1) 为 K-18 学生及其教师构建引人入胜、教育性和反馈丰富的发展评估和学习资源,(2) 创建同样丰富的评估来诊断学习需求并支持成人的发展(在工作场所内外),以及(3)建立(和分享)关于学习及其在社会未来中的作用的知识。

此消息包含仅供上述收件人使用的特权和机密信息。严禁他人披露、分发、复制或使用这些信息。如果您错误地收到此邮件,请立即回复通知发件人,并删除原始邮件和所有附件。谢谢你。

抱歉,背景解释太长了。但我的问题很简单:这些错别字怎么会发生?在工作流中的什么时候,由(直接)PHP代码获取和处理的(验证一致的)mysql数据单元,放入标准的PHP - > SMTP邮件插件中,导致创建似乎有随机拼写错误的电子邮件?

我会喜欢你的任何想法,如果需要,我很乐意提供更详细的代码。提前致谢。

编辑:感谢 Eggyal 指出只有较长的主题行才会删除空格。这种模式也适用于其他较旧的电子邮件。另外,我在上面提供了一封电子邮件警报的全文;请注意链接末尾的“..php”。所有电子邮件都具有相同的签名行,并且所有相同类型的警报电子邮件具有相同的正文长度(不同仪器名称和应试者姓名加减 15 个字符)。

4

1 回答 1

2

在使用普通 php 的 mail() 函数和 postfix smtp 服务器时,我在电子邮件中遇到了非常相似的行为。我花了数周时间才弄清楚为什么这些电子邮件中的 HTML 会随机损坏:电子邮件源中的行很长,正如@eggyal 在评论中所写的那样。

RFC2822规定行不应超过 78 个字符。为了遵守,SMTP 服务器在选定的位置插入换行符,但这很容易损坏对空间敏感的内容。检查电子邮件中的 Content-Transfer-Encoding 标头,我假设它是 7 位、8 位或引用可打印的。尝试将其更改为 base64 - 这是简单的方法。我对 Swift Mailer 不熟悉,但我想这可能可行:

$transferEncoding = $message->getHeaders()->get('Content-Transfer-Encoding');
$transferEncoding->setValue('base64');

或者,您可以尝试在移交给 SMTP 服务器之前手动换行。

于 2013-09-06T08:45:12.597 回答