0

我编写了几个 PHP 脚本来读取数据库的内容并将这些内容输出到电子邮件中。每隔一段时间,我会看到一个 SPACE (0x20) 字符嵌入到输出中不应该有的地方。例如,在一个脚本中,我引用了一个 PHP 全局变量,其中正好包含“n”个非空格字符,有时(并非总是),当该变量转储到电子邮件消息中时,该字符串将出现一个嵌入的空白(使字符串“n+1”的总长度)。其他时候,HTML 标记(例如 <BR>)将显示为 <BR>(注意“B”之前的空格)。

因为脚本的行为不一致(一些电子邮件受到影响,而另一些则没有),我似乎找不到问题所在。

我附上了一个 PHP 脚本的链接,该脚本偶尔会在 BREAK 标记中嵌入一个空格。我已经删除了向数据库提供特定登录信息的行。否则,其他一切都完好无损。在您可以在下面的链接中找到的代码文件中,第 281 行是包含带有嵌入式 SPACE 的 BREAK 命令的行(如上所述)。这种情况只发生过一次!

http://jem-software.com/temptest.txt

我想唯一可能相关的信息是这个脚本文件取自输入到 Joomla 中包含的 JUMI 代码块的代码!基于网站。

编辑1:

谢谢你,里卡多,你的建议。这里有一些更清楚的说明:

  1. 我没有阅读电子邮件并解析结果以插入数据库。恰恰相反,我正在从数据库中读取数据并使用结果来创建电子邮件。我将检查数据库以查看使用了什么字符集,并显式传递字符集以查看是否有区别。

  2. 我不使用 Joomla 函数来访问数据库,因为我引用的数据库在 Joomla 之外!环境。它是由几年前编写的 PHP 脚本创建的预先存在的数据库。当我使用 Joomla 重写我的旧网站时,我想完整地“移植” PHP 数据库访问代码,所以我安装了 JUMI 插件来实现这一点。

  3. 我将检查数据库中的字符编码并将其与电子邮件的字符代码同步。

  4. 我不明白字符编码问题会如何导致将空格插入硬编码的 HTML 标记中——该标记不是来自任何数据库,而是作为文字字符串输入到电子邮件中。

4

1 回答 1

0

这是一个奇怪的问题,但这是我的两分钱:

首先是您没有使用 Joomla 函数来访问数据库和邮件子系统。虽然这可以工作,但它并不是很好。

第二个是,这闻起来像字符集/代码页问题。

以下是关于字符集问题的一些注意事项:

我快速阅读了您的代码,并没有发现任何错误。但是 Joomla 使用 UTF-8,并且您的查询没有指定它(缺少 mysql_set_charset()!),这可能是第一个问题。

第二个是您阅读的电子邮件将具有不同的字符集,具体取决于发件人的设置。确保正确处理代码页问题:以下是我用于解析电子邮件的函数片段:

$mime = imap_fetchmime($this->connection, $this->messageNumber, $partNumber);
return $this->decodeMailBody($data,$mime); // QUOTED_PRINTABLE

function decodeMailBody($string,$mime) {
    $str = quoted_printable_decode($string);

    echo "<h3>mime: $mime; charset $charset</h3>";
    //mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8
    //mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252
    $mimes = explode('charset=',$mime);
    foreach($mimes as $mimepiece) {
        $charset = $mimepiece;
    }       
    $charset = strtolower(trim($charset));
    if ($charset == 'utf-8') {
        return $str;
    } else {
        return iconv($charset, 'UTF-8', $str);
    }
}

最后,确保在解析后将邮件插入数据库时​​使用 utf-8。

于 2013-02-02T20:51:30.633 回答