diff --git a/smtp.mail.inc b/smtp.mail.inc index 4aa423a..3a44fbb 100644 --- a/smtp.mail.inc +++ b/smtp.mail.inc @@ -538,20 +538,28 @@ class SmtpMailSystem implements MailSystemInterface { protected function _remove_headers($input) { $part_array = explode("\n", $input); - if (strpos($part_array[0], 'Content') !== FALSE) { - if (strpos($part_array[1], 'Content') !== FALSE) { - if (strpos($part_array[2], 'Content') !== FALSE) { - array_shift($part_array); - array_shift($part_array); - array_shift($part_array); - } - else { - array_shift($part_array); - array_shift($part_array); + // will strip these headers according to RFC2045 + $headers_to_strip = array( 'Content-Type', 'Content-Transfer-Encoding', 'Content-ID', 'Content-Disposition'); + $pattern = '/^('. implode('|', $headers_to_strip) .'):/'; + + while (count($part_array) > 0) { + + // ignore trailing spaces/newlines + $line = rtrim($part_array[0]); + + // if the line starts with a known header string + if (preg_match($pattern, $line)) { + $line = rtrim(array_shift($part_array)); + // remove line containing matched header. + + // if line ends in a ';' and the next line starts with four spaces, it's a continuation + // of the header split onto the next line. Continue removing lines while we have this condition. + while (substr($line, -1) == ';' && count($part_array) > 0 && substr($part_array[0], 0, 4) == ' ') { + $line = rtrim(array_shift($part_array)); } - } - else { - array_shift($part_array); + } else { + // no match header, must be past headers; stop searching. + break; } }