当一个主题标题是MIME编码和折叠mail()
导致PHP警告:
<?php
$mime_subject = "=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?='r'n =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=";
mail( "name@domain.com", $mime_subject , "Hallo");
=> mail(): Bad parameters to mail() function, mail not sent.
主题行是RFC2047 (section 8)中的一个例子,它被折叠成两行,mail()
不喜欢它。由于它在其他主机上运行良好,我怀疑是错误的配置。但会是哪一个呢?
PHP是5.4.0版本
任何想法?
编辑:关于php配置的更多信息:
'./configure' '--prefix=/home/www/PHP/php-5.4.0' '--with-openssl'
'--with-zlib-dir=/usr/lib/' '--with-jpeg-dir=/usr/lib/' '--with-mysql'
'--enable-fastcgi' '--with-informix=/opt/informix'
'--with-oci8=shared,instantclient,/opt/oracleclient/instantclient,10.2'
'--enable-pcntl' '--with-gettext' '--with-ldap' '--with-curl'
'--with-gd' '--with-freetype-dir=/usr/include/freetype2/' '--with-dom'
'--enable-bcmath' '--enable-soap' '--enable-mbstring'
'--with-mcrypt=shared,/usr/local/libmcrypt' '--enable-pdo'
'--with-pdo-mysql' '--enable-zip' '--with-imap' '--with-kerberos'
'--with-imap-ssl' '--with-ldap-sasl' '--with-icu-dir=/usr' '--enable-intl'
mail.add_x_header Off Off
mail.force_extra_parameters no value no value
mail.log no value no value
sendmail_from no value no value
sendmail_path /usr/sbin/sendmail -t -i /usr/sbin/sendmail -t -i
SMTP localhost localhost
smtp_port 25 25
mailparse version 2.1.6
你是正确的,这个例子应该只是工作为'我可以读这个'。但是PHP文档中的另一个注意事项提到,一些邮件传输代理会自动将'n
更改为'r'n
,因此如果已经提供了'r'n
(变为'r'r'n
),则会导致问题。
所以您可以尝试使用下面的代码(尽管它不符合标准,但您的邮件代理可能会使其符合标准)
<?php
$mime_subject = "=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?='n=?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=";
mail( "name@domain.com", $mime_subject , "Hallo");
?>
PHP在代码中很少检查有效的主题,所以它完全由邮件代理处理。
PHP源代码(只有主题检查,看它没有做任何特别的事情):
if (subject_len > 0) {
subject_r = estrndup(subject, subject_len);
for (; subject_len; subject_len--) {
if (!isspace((unsigned char) subject_r[subject_len - 1])) {
break;
}
subject_r[subject_len - 1] = ''0';
}
for (i = 0; subject_r[i]; i++) {
if (iscntrl((unsigned char) subject_r[i])) {
/* According to RFC 822, section 3.1.1 long headers may be separated into
* parts using CRLF followed at least one linear-white-space character (''t' or ' ').
* To prevent these separators from being replaced with a space, we use the
* SKIP_LONG_HEADER_SEP to skip over them. */
SKIP_LONG_HEADER_SEP(subject_r, i);
subject_r[i] = ' ';
}
}
} else {
subject_r = subject;
}