警报电子邮件中会出现随机错误 - 这怎么可能发生?

时间:2013-08-29 14:36:14

标签: php mysql email lamp

我是一组提供评估服务的网站的网站管理员和首席开发人员。我没有服务器管理的背景,我很惭愧地说,作为一个系统管理员对我来说是相当令人生畏的;我对基本的命令行感到满意,但是我经常为使标准LAMP堆栈使用多个子域和运行的电子邮件服务器所需的所有无数配置所震撼。

我终于达成了彻底扼杀我的东西。我先列出我们的基本服务器配置:

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

我们的某些网页(与帐户和评估管理相关)会在采取特定操作时向测试者,教练和/或我们发送警报电子邮件。这些电子邮件的文本来自"样板" mysql db中的表。然后在PHP中,一对"占位符"标记被替换为测试者名称,日期等。然后,PHP代码使用Swift Mailer将准备好的文本作为电子邮件与我们的本地Citadel电子邮件服务器一起发送到给定的一组(通常是外部的)地址。我们对大部分电子邮件都是CC,为我们提供我们发送的所有自动邮件的第二条记录。

(随意跳过此处)以下是我的代码的要点,它提取并处理文本,并将其作为电子邮件发送:

$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代码绘图,在相同的日发送。这些是我们内部(CC' d)帐户的屏幕截图,在Mac Mail中查看;但根据考生投诉,所有电子邮件收件人似乎都看到相同的文字。在第一张图片中,请注意标题中间距的差异。

在第二个&第三张图片,请注意错误的链接(最后两个句点)。我检查了PHP代码和mysql源文本,并且完全没有理由将登录链接更改为在该位置有两个句点。 编辑:根据评论者的要求,我已在图片下方复制了完整的电子邮件文字。

Alert email titles: note inconsistent spacing in the "ready to view" text Alert email content: what the login link SHOULD look like Alert email content: what the login link OCCASIONALLY looks like

  

[姓名已删除]的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个字符)。

1 个答案:

答案 0 :(得分: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服务器之前手动换行。