【问题标题】:Random errors appear in alert emails - how could this happen?警报电子邮件中出现随机错误 - 这怎么会发生?
【发布时间】:2013-09-02 01:27:57
【问题描述】:

我是一组提供评估服务的网站的网站管理员和首席开发人员。我没有服务器管理方面的背景,并且很惭愧地说成为系统管理员对我来说非常吓人。我对基本的命令行很满意,但我经常对让标准 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);

简而言之,这是我的问题:我们看到的电子邮件(由于上述事件)有时中会出现拼写错误——不一致。这里有几张图片作为示例,显示了一组使用 same PHP 代码在 same 日生成和发送的自动电子邮件。 > 我们数据库中的(未更改的)字符串。这些是我们在 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. 马萨诸塞州北安普敦 01060

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

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

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

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

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

【问题讨论】:

  • 在发送电子邮件之前,将模板文本与所有替换操作的最终结果进行比较。确保拼写错误没有出现在 PHP 级别。如果您从未在 PHP 中看到拼写错误,请开始查看邮件服务器,但我认为邮件客户端(或服务器)不太可能随机添加/删除 . 字符。
  • 谢谢@MarcB。不确定我在上面的背景解释中是否已经清楚地说明了这一点,但我认为我对 PHP 的熟练程度足以验证 PHP 拼写错误不会造成这种情况。我上面复制的 PHP 代码是处理模板文本的所有 PHP 代码。您在括号中看到的文本(如“[NAME]”)是模板文本中唯一被 PHP 替换更改的部分。该代码绝对不负责随机添加点,因为 str_replace 的唯一行为是全局替换。此外,“两个点”的情况非常不一致——到目前为止只发生过两次。
  • sendEmail 函数是什么样的?另外,哪个版本的 SwiftMailer?
  • @pilsetnieks,sendEmail 函数是执行以下操作的简单过程:a) 确保电子邮件地址存在且有效(如果格式错误,Swift 会崩溃),b) 创建 Swift SMTP 传输 & mailer 实例,以及 c) 通过 Swift 发送消息。该函数是基于 Swift 的 howto 文档 swiftmailer.org/docs/sending.html> 构建的。奇怪的是,当我查看我的 Swift 插件时,我没有看到任何版本信息……但我在 2012 年 3 月左右设置了 Swift。
  • 我认为您的第一张图片中出现的问题(间距损坏)几乎可以肯定是由于折叠了长主题行 - 查看原始电子邮件进行验证。至于添加额外的时间段,查看原始电子邮件可能再次有助于了解发生了什么 - 但向我们展示数据库中模板的相关部分也会有所帮助。

标签: php mysql email lamp


【解决方案1】:

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

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

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

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

【讨论】:

  • 我在自动插入新行时遇到了同样的问题。但这并不能解释空间的消失,而只能解释出现 ...
  • 谢谢@Jirka。根据您的经验,这可以解释我在链接中遇到的“额外期间”问题吗?毕竟,至少主题怪异的间距不会“破坏”电子邮件的任何功能,只是看起来很难看。正如我在上面对 Eggyal 提到的,有问题的链接是电子邮件模板本身的一部分;它不是由 PHP 代码“换入”的。另请注意,链接出现在换行符之后,所以我不相信当 SMTP 得到它肮脏的手时链接本身会“包装”。但是,请注意,实时 above 链接会被多次换行。我会尝试纠正。
  • @Jirka,你提供了我所拥有的最好的线索,所以赏金是你的。感谢您的想法。
  • 哎呀,抱歉回复晚了。那个额外的点对我来说仍然是个谜。换行只插入换行符或空格,但不插入字符。它看起来也不像任何类型的 URL 卫生。我建议检查 SwiftMailer 发生了什么,或者使用另一个 SMTP 进行调试 - 跟踪是哪一个导致它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 2016-07-24
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多