Php 接收邮件服务器在每行新行前插入空格,从而中断多部分/备选方案
我正在使用PHP向客户发送按需电子邮件。我有一个脚本,它在测试中看起来相当健壮,生成了与MIME-1.0兼容的多部分/可选电子邮件,其中包含文本和html版本。电子邮件以base64编码字符串发送,以保留国际字符(消息文本通常为德语) 但是,某些服务器在接收邮件时,似乎会在每个CR-LF序列之前插入一个空格(Php 接收邮件服务器在每行新行前插入空格,从而中断多部分/备选方案,php,email,multipart-alternative,Php,Email,Multipart Alternative,我正在使用PHP向客户发送按需电子邮件。我有一个脚本,它在测试中看起来相当健壮,生成了与MIME-1.0兼容的多部分/可选电子邮件,其中包含文本和html版本。电子邮件以base64编码字符串发送,以保留国际字符(消息文本通常为德语) 但是,某些服务器在接收邮件时,似乎会在每个CR-LF序列之前插入一个空格(0x20)。当然,这并没有破坏base64,但由于它破坏了将消息头与消息分开的CR-LF-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序列。在纠正了那个问题之后,一切都很顺利。无论如何,谢谢你的回答。