diff --git a/scripts/mail/mail_handler.php b/scripts/mail/mail_handler.php index 050b894a0b..da28d8c367 100755 --- a/scripts/mail/mail_handler.php +++ b/scripts/mail/mail_handler.php @@ -1,74 +1,89 @@ #!/usr/bin/env php 1) { $_SERVER['PHABRICATOR_ENV'] = $argv[1]; } $root = dirname(dirname(dirname(__FILE__))); require_once $root.'/scripts/__init_script__.php'; require_once $root.'/externals/mimemailparser/MimeMailParser.class.php'; phutil_require_module( 'phabricator', 'applications/metamta/storage/receivedmail'); phutil_require_module( 'phabricator', 'applications/files/storage/file'); $parser = new MimeMailParser(); $parser->setText(file_get_contents('php://stdin')); +$text_body = $parser->getMessageBody('text'); + +$text_body_headers = $parser->getMessageBodyHeaders('text'); +$content_type = idx($text_body_headers, 'content-type'); +if ( + !phutil_is_utf8($text_body) && + preg_match('/charset="(.*?)"/', $content_type, $matches) +) { + $text_body = mb_convert_encoding($text_body, "UTF-8", $matches[1]); +} + +$headers = $parser->getHeaders(); +$headers['subject'] = iconv_mime_decode($headers['subject'], 0, "UTF-8"); +$headers['from'] = iconv_mime_decode($headers['from'], 0, "UTF-8"); + $received = new PhabricatorMetaMTAReceivedMail(); -$received->setHeaders($parser->getHeaders()); +$received->setHeaders($headers); $received->setBodies(array( - 'text' => $parser->getMessageBody('text'), + 'text' => $text_body, 'html' => $parser->getMessageBody('html'), )); $attachments = array(); foreach ($parser->getAttachments() as $attachment) { if (preg_match('@text/(plain|html)@', $attachment->getContentType()) && $attachment->getContentDisposition() == 'inline') { // If this is an "inline" attachment with some sort of text content-type, // do not treat it as a file for attachment. MimeMailParser already picked // it up in the getMessageBody() call above. We still want to treat 'inline' // attachments with other content types (e.g., images) as attachments. continue; } $file = PhabricatorFile::newFromFileData( $attachment->getContent(), array( 'name' => $attachment->getFilename(), )); $attachments[] = $file->getPHID(); } try { $received->setAttachments($attachments); $received->save(); $received->processReceivedMail(); } catch (Exception $e) { $received ->setMessage('EXCEPTION: '.$e->getMessage()) ->save(); }