从标准输入读取后,PHP在每行末尾添加"="号

3

标准输入流(stdin)的内容在换行符和尾随"="的影响下被破坏了,这显然会破坏我需要发布的URL。

我需要从电子邮件中提取一个URL/链接,然后发布这个URL。因此,我正在使用我在互联网上看到的标准代码片段,将我的电子邮件通过管道传输到cpanel中的php脚本:

$fd = fopen("php://stdin", "r");
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) { $email .= trim(fread($fd, 1024)); }
fclose($fd);

然后将电子邮件的内容转储到文件"pipemail.txt"中,以便检查并确保一切正常工作。
$fdw = fopen("pipemail.txt", "w+");
fwrite($fdw, $email);
fclose($fdw);

输出结果如下:
...
<table style=3D"width:100%" cellpadding=3D"0" cellspacing=3D"0" border=3D"0=
"><tbody><tr><td><table style=3D"background-color:#ffffff;color:#3c445a;fon=
t-family:arial;font-size:10px;font-weight:bold;width:100%" cellpadding=3D"0=
" cellspacing=3D"0">
...

我已经花了一天多的时间来解决这个问题,但我完全被卡住了。我尝试从传入的行中删除尾随的"=",但它没有给我期望的结果。相反,它似乎从内容中随机删除"="。我猜想这不是随机的,只是因为它不符合我的预期,所以看起来是随机的。如果它只在1024 k/char行的最后一个字符处出现时才会删除它,那么换行符从哪里来?我对这是如何工作的知之甚少,无法自己解决这个问题。
为什么会出现换行?"="来自哪里?有没有人有什么建议?

你确定原始文本中没有 = 字符吗?行末的 = 是在 quoted-printable 格式中使用的,这种格式通常用于电子邮件。 - Barmar
看一下电子邮件的原始源代码,我敢打赌你会发现那些字符已经在那里了。 - Barmar
同样地,=3D 是在 quoted-printable 中表示 = 的方式。 - Barmar
是的,那正是我所缺少的。谢谢@Barmar。 - DSMagic
3个回答

3

就是这样了。谢谢你,@sam-dufel。 - DSMagic
令人惊讶的是,我已经花了很长时间才找到这些信息,正是我所需要的。这应该有更多的赞和在谷歌搜索结果中排名更高。 - Tarquin

0

您的数据以quoted-printable格式存储,使用quoted_printable_decode函数进行解码:

$email = quoted_printable_decode(file_get_contents("php:://stdin"));

0
从电子邮件中看到每行末尾的“=”符号,意味着该电子邮件可能是quoted-printable编码。您需要正确解析消息,并通过quoted_printable_decode()运行正文部分。
有一些Content-Type头信息可以告诉您使用了哪种类型的编码,还有可能有MIME部分和边界需要处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接