 eabe3a4d33
			
		
	
	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
		
			
				
	
	
		
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.0 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();
 | |
| }
 | |
| 
 | |
| 
 |