6

伙计们,

我有一个基于 PHP 的站点(使用QCubed 框架);作为网站的一部分,我有一个每天发送数千封电子邮件的守护进程(不,我不是垃圾邮件发送者,一切都是可选的:))。电子邮件通过自定义框架组件发送;该组件用作 SMTP 客户端。我正在使用来自 DNSExit.com 的付费 SMTP 网关来获取实际发送的电子邮件。

这些电子邮件是简单的基于 HTML 的电子邮件;他们里面真的只有简单的链接。

我的问题是,这些链接有时(并非始终如一!)在过渡期间会被打乱。标签以某种方式混淆了,并且某些链接在电子邮件中不起作用。该问题发生在所有已发送电子邮件的一小部分;它是不一致的(即相同的确切源消息 HTML 可能会或可能不会导致转换中的加扰)。

你们有人见过这个吗?关于如何排除故障的任何想法?

4

6 回答 6

3

您是否有可能使用临时文件来创建电子邮件(或至少创建可变内容)?从前我做过类似的事情。电子邮件文本是根据确切的时间(以秒为单位)生成并写入临时文件的。不幸的是,当每天发送数千次时,我们不止一次达到同一秒(因为只有 86k 秒可用)。这可以解释 a) 小错误率和 b) 明显的随机性。对于故障排除,我只是看看错误是否随着电子邮件数量的增加而增加,然后从那里开始。

于 2010-03-15T18:20:32.173 回答
1

问题是 HTML 与电子邮件不兼容。这就是我创建邮件标记语言的原因。

HTML 是为使用 HTTP 协议而创建的,因为这两种技术几乎是由同一个人在同一时间发明的。不同之处在于 HTTP 是从服务器到客户端的单会话单向传输。这永远不会改变,因为 HTML 文档始终源自服务器,被发送到请求的客户端,并且一旦传输完成,客户端和服务器之间的连接就会断开。

电子邮件不会以这种方式运行。在电子邮件中,通信起源于客户端,发送到一个或多个电子邮件服务,然后终止于远程客户端。然而,最大的区别是文档不会像通过 HTTP 的文档传输那样随着单个传输实例的终结而死亡。在 SMTP 中发送的文档可以回复、转发或复制给多个未请求的用户。在考虑电子邮件线程时,这一差异是深刻的。

问题在于 SMTP 和 HTTP 是不同的,如前两段所示。由于 SMTP 和 HTTP 用于创建标头数据的格式化方法完全不同,这种差异更加复杂。HTML 的标头数据旨在与 HTTP 传输的标头兼容,并且不符合 SMTP 传输。HTML 标头也不考虑电子邮件线程的复杂性。

当电子邮件软件破坏 HTML 文档以添加满足该软件的一致性要求所需的格式更改并将标题数据直接写入文档时,问题就得到了例证。当 HTML 电子邮件成为电子邮件线程时,这个例子变得非常明显。由于 HTML 标头数据无法解释电子邮件线程的复杂性,因此无法从样式表中提供相关的表示定义,这些定义在文档传输后仍然存在。每次将 HTML 文档或具有 HTML 格式的文档从一个电子邮件软件发送到另一个电子邮件软件时,该文档都会损坏,并且每个电子邮件软件设备都会损坏先前的损坏。电子邮件处理软件可能是指电子邮件客户端,它肯定会损坏文档,也可能是电子邮件服务器,

该问题的解决方案是创建一个直接识别电子邮件标题数据要求的标记语言约定。这些要求在 RFC 5321 中针对 SMTP 协议和 RFC 5322 中针对客户端处理进行了定义。正确扩展此解决方案以解决电子邮件线程复杂性的唯一方法是为多代理 DOM 提供约定。

由于技术不准确以及术语多代理 DOM 与此处未提及的发明特性的性质之间的差异,即使在编辑之前,也删除了段落。

编辑:多代理 DOM 应用一定程度的层次结构,这可能不是表示电子邮件线程所必需的。

于 2010-03-20T23:49:50.290 回答
1

当您发送电子邮件时,您应该对其进行编码,以使邮件正文中的每一行都不超过 76 个字符。您可以为此使用 base64,但大多数系统对文本使用带引号的可打印编码,因为它会生成较小的消息。Base64 通常只用于二进制数据。

于 2010-03-20T14:50:27.020 回答
1

我在运行 sendmail 的服务器上遇到了类似的问题。

我正在创建和测试一封 html 电子邮件,该电子邮件有一天会被大量邮寄(当然是选择加入)。我自己有一个电子邮件模板,任何 html 程序员都可以轻松阅读,但这样的空白很重,无法正确排列所有内容。我心想,如果要大量发送电子邮件,在模板渲染后,我想我会尽量减少文件中的空白以节省空间!所以我创建了一个出色的正则表达式来消除任何不必要的从呈现的电子邮件中发送空格。

将电子邮件发送给自己后,我打开了电子邮件,当我看到一些 css 和 html 没有正确显示时,我感到很困惑,而我之前的 regexp 之前的电子邮件是。通过查看原始消息,我注意到每隔一段时间,一个感叹号(!)似乎在整个消息中随机出现,从而破坏了随机路径中的任何 css 和 html。

事实证明,如果您的电子邮件中的一行太长而没有换行符,则 sendmail 不喜欢它。当行变得太长时,sendmail 会插入一个感叹号,然后是一个换行符,只是为了让你感到困惑和困惑。

为什么它不只是在单词之间选择一个空格来换行?为什么要插入感叹号?恐怕有问题,没有答案。

我的解决方案?

sudo apt-get remove sendmail
sudo apt-get install exim4

我在使用 sendmail 时遇到了其他问题,比如发送一封电子邮件需要整整 60 秒,而 exim4 刚刚工作,我再也不必考虑它了。

如果您的邮件服务器正在使用 sendmail,这很可能是问题所在,如果不是,感谢您让我与您分享我的故事。我需要发泄。

于 2010-03-19T17:09:21.983 回答
0

电子邮件数据有 2 个问题 - 通常是“?” 符号不知何故进入了一些单词,另一个是 UTF 和标题相关。首先通过更改托管服务提供商(因此它与邮件服务器相关)得到“修复”,第二个通过更改 PHPmailer 库得到修复。

尝试指定如何准确地对数据进行加扰。

于 2010-03-10T09:26:42.353 回答
0

您的链接中有任何特殊属性吗?可能是标题属性,里面没有转义引号?

像这样的东西:<a href="http://some.site" title="My "correct" link">Link</a>

于 2010-03-19T15:05:41.067 回答