mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-27 16:00:59 +01:00
eabe3a4d33
Summary: We/I broke a couple of things here recently (see D5911) and are doing some work here in general (see D5912, etc.). Generally, this code is pretty oldschool and not especially well architected for modern application-oriented Phabricator. It hardcodes a lot of stuff which should be applications' responsibilites. Take the first steps toward making it more solid to reduce the risk here. In particular: - Factor out the "self mail" and "duplicate mail" checks and add unit tests. - Make Message-ID hash handling automatic. Test Plan: Ran unit tests. Reviewers: btrahan, chad Reviewed By: btrahan CC: aran Differential Revision: https://secure.phabricator.com/D5915
67 lines
2 KiB
PHP
Executable file
67 lines
2 KiB
PHP
Executable file
#!/usr/bin/env php
|
|
<?php
|
|
|
|
if ($argc > 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';
|
|
|
|
$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) ||
|
|
preg_match('/charset=(\S+)/', $content_type, $matches))
|
|
) {
|
|
$text_body = phutil_utf8_convert($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($headers);
|
|
$received->setBodies(array(
|
|
'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();
|
|
}
|
|
|
|
|