Changeset View
Changeset View
Standalone View
Standalone View
scripts/mail/mail_handler.php
Show All 29 Lines | array( | ||||
'name' => 'env', | 'name' => 'env', | ||||
'wildcard' => true, | 'wildcard' => true, | ||||
), | ), | ||||
)); | )); | ||||
$parser = new MimeMailParser(); | $parser = new MimeMailParser(); | ||||
$parser->setText(file_get_contents('php://stdin')); | $parser->setText(file_get_contents('php://stdin')); | ||||
$text_body = $parser->getMessageBody('text'); | $content = array(); | ||||
foreach (array('text', 'html') as $part) { | |||||
$text_body_headers = $parser->getMessageBodyHeaders('text'); | $part_body = $parser->getMessageBody($part); | ||||
$content_type = idx($text_body_headers, 'content-type'); | $part_headers = $parser->getMessageBodyHeaders($part); | ||||
$content_type = idx($part_headers, 'content-type'); | |||||
if ( | if ( | ||||
!phutil_is_utf8($text_body) && | !phutil_is_utf8($part_body) && | ||||
(preg_match('/charset="(.*?)"/', $content_type, $matches) || | (preg_match('/charset="(.*?)"/', $content_type, $matches) || | ||||
preg_match('/charset=(\S+)/', $content_type, $matches)) | preg_match('/charset=(\S+)/', $content_type, $matches)) | ||||
) { | ) { | ||||
$text_body = phutil_utf8_convert($text_body, 'UTF-8', $matches[1]); | $part_body = phutil_utf8_convert($part_body, 'UTF-8', $matches[1]); | ||||
} | |||||
$content[$part] = $part_body; | |||||
} | } | ||||
$headers = $parser->getHeaders(); | $headers = $parser->getHeaders(); | ||||
$headers['subject'] = iconv_mime_decode($headers['subject'], 0, 'UTF-8'); | $headers['subject'] = iconv_mime_decode($headers['subject'], 0, 'UTF-8'); | ||||
$headers['from'] = iconv_mime_decode($headers['from'], 0, 'UTF-8'); | $headers['from'] = iconv_mime_decode($headers['from'], 0, 'UTF-8'); | ||||
if ($args->getArg('process-duplicates')) { | if ($args->getArg('process-duplicates')) { | ||||
$headers['message-id'] = Filesystem::readRandomCharacters(64); | $headers['message-id'] = Filesystem::readRandomCharacters(64); | ||||
} | } | ||||
$received = new PhabricatorMetaMTAReceivedMail(); | $received = new PhabricatorMetaMTAReceivedMail(); | ||||
$received->setHeaders($headers); | $received->setHeaders($headers); | ||||
$received->setBodies(array( | $received->setBodies($content); | ||||
'text' => $text_body, | |||||
'html' => $parser->getMessageBody('html'), | |||||
)); | |||||
$attachments = array(); | $attachments = array(); | ||||
foreach ($parser->getAttachments() as $attachment) { | foreach ($parser->getAttachments() as $attachment) { | ||||
if (preg_match('@text/(plain|html)@', $attachment->getContentType()) && | if (preg_match('@text/(plain|html)@', $attachment->getContentType()) && | ||||
$attachment->getContentDisposition() == 'inline') { | $attachment->getContentDisposition() == 'inline') { | ||||
// If this is an "inline" attachment with some sort of text content-type, | // 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 | // 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' | // it up in the getMessageBody() call above. We still want to treat 'inline' | ||||
Show All 24 Lines |