| 
									
										
										
										
											2011-11-29 08:58:04 -05:00
										 |  |  | #!/usr/bin/env php
 | 
					
						
							| 
									
										
										
										
											2011-05-04 23:09:42 -07:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-05 15:11:36 -07:00
										 |  |  | if ($argc > 1) { | 
					
						
							|  |  |  |   $_SERVER['PHABRICATOR_ENV'] = $argv[1]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 23:09:42 -07:00
										 |  |  | $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')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-02 08:47:45 -08:00
										 |  |  | $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) && | 
					
						
							| 
									
										
										
										
											2012-08-12 08:50:19 -07:00
										 |  |  |   (preg_match('/charset="(.*?)"/', $content_type, $matches) || | 
					
						
							|  |  |  |    preg_match('/charset=(\S+)/', $content_type, $matches)) | 
					
						
							| 
									
										
										
										
											2011-12-02 08:47:45 -08:00
										 |  |  | ) { | 
					
						
							| 
									
										
										
										
											2012-08-12 08:50:19 -07:00
										 |  |  |   $text_body = phutil_utf8_convert($text_body, "UTF-8", $matches[1]); | 
					
						
							| 
									
										
										
										
											2011-12-02 08:47:45 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $headers = $parser->getHeaders(); | 
					
						
							|  |  |  | $headers['subject'] = iconv_mime_decode($headers['subject'], 0, "UTF-8"); | 
					
						
							|  |  |  | $headers['from'] = iconv_mime_decode($headers['from'], 0, "UTF-8"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 23:09:42 -07:00
										 |  |  | $received = new PhabricatorMetaMTAReceivedMail(); | 
					
						
							| 
									
										
										
										
											2011-12-02 08:47:45 -08:00
										 |  |  | $received->setHeaders($headers); | 
					
						
							| 
									
										
										
										
											2011-05-04 23:09:42 -07:00
										 |  |  | $received->setBodies(array( | 
					
						
							| 
									
										
										
										
											2011-12-02 08:47:45 -08:00
										 |  |  |   'text' => $text_body, | 
					
						
							| 
									
										
										
										
											2011-05-04 23:09:42 -07:00
										 |  |  |   'html' => $parser->getMessageBody('html'), | 
					
						
							|  |  |  | )); | 
					
						
							| 
									
										
										
										
											2013-01-03 17:04:30 -08:00
										 |  |  | $received->setMessageIDHash( | 
					
						
							|  |  |  |   PhabricatorHash::digestForIndex($received->getMessageID()) | 
					
						
							|  |  |  | ); | 
					
						
							| 
									
										
										
										
											2011-05-04 23:09:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | $attachments = array(); | 
					
						
							| 
									
										
										
										
											2011-05-29 03:19:06 -07:00
										 |  |  | foreach ($parser->getAttachments() as $attachment) { | 
					
						
							| 
									
										
										
										
											2011-06-12 21:09:55 -07:00
										 |  |  |   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; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 23:09:42 -07:00
										 |  |  |   $file = PhabricatorFile::newFromFileData( | 
					
						
							|  |  |  |     $attachment->getContent(), | 
					
						
							|  |  |  |     array( | 
					
						
							|  |  |  |       'name' => $attachment->getFilename(), | 
					
						
							|  |  |  |     )); | 
					
						
							|  |  |  |   $attachments[] = $file->getPHID(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-28 08:05:27 -07:00
										 |  |  | try { | 
					
						
							|  |  |  |   $received->setAttachments($attachments); | 
					
						
							|  |  |  |   $received->save(); | 
					
						
							|  |  |  |   $received->processReceivedMail(); | 
					
						
							|  |  |  | } catch (Exception $e) { | 
					
						
							|  |  |  |   $received | 
					
						
							|  |  |  |     ->setMessage('EXCEPTION: '.$e->getMessage()) | 
					
						
							|  |  |  |     ->save(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |