Php 接收邮件服务器在每行新行前插入空格,从而中断多部分/备选方案

Php 接收邮件服务器在每行新行前插入空格,从而中断多部分/备选方案,php,email,multipart-alternative,Php,Email,Multipart Alternative,我正在使用PHP向客户发送按需电子邮件。我有一个脚本,它在测试中看起来相当健壮,生成了与MIME-1.0兼容的多部分/可选电子邮件,其中包含文本和html版本。电子邮件以base64编码字符串发送,以保留国际字符(消息文本通常为德语) 但是,某些服务器在接收邮件时,似乎会在每个CR-LF序列之前插入一个空格(0x20)。当然,这并没有破坏base64,但由于它破坏了将消息头与消息分开的CR-LF-CR-LF序列,因此消息没有被正确解析(或者,实际上,因为二级消息头从未停止) 以下是生成的示例消息

我正在使用PHP向客户发送按需电子邮件。我有一个脚本,它在测试中看起来相当健壮,生成了与MIME-1.0兼容的多部分/可选电子邮件,其中包含文本和html版本。电子邮件以base64编码字符串发送,以保留国际字符(消息文本通常为德语)

但是,某些服务器在接收邮件时,似乎会在每个CR-LF序列之前插入一个空格(
0x20
)。当然,这并没有破坏base64,但由于它破坏了将消息头与消息分开的CR-LF-CR-LF序列,因此消息没有被正确解析(或者,实际上,因为二级消息头从未停止)

以下是生成的示例消息:

From: example@example.com
To: example@example.org
Subject: Test Message
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="{$boundary}"

This is a multipart Message in MIME Format
--{$boundary}
MIME-Version: 1.0
Content-ID: <{$content_id}>
Content-Type: text/plain; charset="utf-8"
Content-Disposition: inline
Content-Transfer-Encoding: base64
Content-Length: {$objlen}

UkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVE
QUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNU
RUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQg
UkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVE
QUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNU
RUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQg
UkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVE
QUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNU
RUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQg
UkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVE
QUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNU
RUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQg
UkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVE
QUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNU
RUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQg
UkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQgUkVEQUNURUQ=
--{$boundary}
MIME-Version: 1.0
Content-ID: <{$content_id}>
Content-Type: text/html; charset="utf-8"
Content-Disposition: inline
Content-Transfer-Encoding: base64
Content-Length: {$objlen}

REVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVU
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
RVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIg
REVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVU
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
RVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIg
REVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVU
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
RVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIg
REVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVU
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
RVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIg
REVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVU
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
RVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIg
REVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVI=
--{$boundary}--
来自:example@example.com
致:example@example.org
主题:测试消息
MIME版本:1.0
内容类型:多部分/备选;boundary=“{$boundary}”
这是MIME格式的多部分消息
--{$boundary}
MIME版本:1.0
内容ID:
内容类型:文本/纯文本;charset=“utf-8”
内容配置:内联
内容传输编码:base64
内容长度:{$objlen}
UKVEQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKK
QUNURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUNU
RUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQG
UKVEQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKK
QUNURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUNU
RUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQG
UKVEQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKK
QUNURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUNU
RUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQG
UKVEQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKKVQUU
QUNURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUNU
RUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQG
UKVEQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKVQUUKK
QUNURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUURUQGUKVQUUNU
RUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQG
UKVEQUNURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQGUKVEQUURUQ=
--{$boundary}
MIME版本:1.0
内容ID:
内容类型:text/html;charset=“utf-8”
内容配置:内联
内容传输编码:base64
内容长度:{$objlen}
revuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevu
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
rvigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervig
revuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevu
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
rvigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervig
revuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevu
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
rvigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervig
revuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevu
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
rvigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervig
revuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevu
Q0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FE
rvigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervigrevuq0fervig
REVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVIgREVUQ0FERVI=
--{$boundary}--

有没有办法阻止邮件服务器添加这些空间?

问题是您没有以引用的可打印编码格式发送电子邮件。我强烈考虑使用一个库来发送电子邮件,以避免所有这些问题:

问题与某些电子邮件服务器(例如
t-online.de
)将
CRLF
换行序列视为比
LF
仅换行序列更无效有关。当换行代码从
CRLF
更改为
LF
时,一切正常

一方面,我认为这是对RFC中规定的标准的公然无视,但另一方面,自做出更改以来,我对这些消息没有任何问题,因此,(a)这无关紧要,或者(b)有一些我不知道的更改,这总是可能的


在任何情况下,如果您打算发送
multipart/*
消息,请始终仅以
LF
结尾。

我高度怀疑,当7bit、8bit和base64内容传输编码因某种原因存在时,问题与不发送引用的可打印电子邮件有关。再说一次,我不知道一切,所以我测试了这个理论,不,事实并非如此。事实上,这个问题特别与一些服务器有关(例如:
t-online.de
),它们只选择LF的换行,而不是RFCs中指定的CRLF序列。在纠正了那个问题之后,一切都很顺利。无论如何,谢谢你的回答。