当调用mail()时,MIME编码的折叠主题标头会导致警告


MIME encoded folded Subject header results in warning when calling mail()

当一个主题标题是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;
}