mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-30 02:32:42 +01:00
25dee6ecd2
Summary: Provides support for per-user x per-object unique reply-to email addresses, plus SMTP integration. This does not actually make Phabricator use these in outbound email. Test Plan: Used test console to validate in-Phabricator routing and handling. Piped emails into the "mail_handler.php" script to validate mail parsing. Configured sendmail and sent mail to Phabricator. Technically I haven't conducted all parts of this test on the same machine since I lost the will to configure more SMTP servers after configuring phabricator.com Reviewed By: jungejason Reviewers: jungejason, tuomaspelkonen, aran CC: aran, epriestley, jungejason Differential Revision: 226
136 lines
2.8 KiB
PHP
136 lines
2.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Model of an Attachment
|
|
*/
|
|
class MimeMailParser_attachment {
|
|
|
|
/**
|
|
* @var $filename Filename
|
|
*/
|
|
public $filename;
|
|
/**
|
|
* @var $content_type Mime Type
|
|
*/
|
|
public $content_type;
|
|
/**
|
|
* @var $content File Content
|
|
*/
|
|
private $content;
|
|
/**
|
|
* @var $extension Filename extension
|
|
*/
|
|
private $extension;
|
|
/**
|
|
* @var $content_disposition Content-Disposition (attachment or inline)
|
|
*/
|
|
public $content_disposition;
|
|
/**
|
|
* @var $headers An Array of the attachment headers
|
|
*/
|
|
public $headers;
|
|
|
|
private $stream;
|
|
|
|
public function __construct($filename, $content_type, $stream, $content_disposition = 'attachment', $headers = array()) {
|
|
$this->filename = $filename;
|
|
$this->content_type = $content_type;
|
|
$this->stream = $stream;
|
|
$this->content = null;
|
|
$this->content_disposition = $content_disposition;
|
|
$this->headers = $headers;
|
|
}
|
|
|
|
/**
|
|
* retrieve the attachment filename
|
|
* @return String
|
|
*/
|
|
public function getFilename() {
|
|
return $this->filename;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the Attachment Content-Type
|
|
* @return String
|
|
*/
|
|
public function getContentType() {
|
|
return $this->content_type;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the Attachment Content-Disposition
|
|
* @return String
|
|
*/
|
|
public function getContentDisposition() {
|
|
return $this->content_disposition;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the Attachment Headers
|
|
* @return String
|
|
*/
|
|
public function getHeaders() {
|
|
return $this->headers;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the file extension
|
|
* @return String
|
|
*/
|
|
public function getFileExtension() {
|
|
if (!$this->extension) {
|
|
$ext = substr(strrchr($this->filename, '.'), 1);
|
|
if ($ext == 'gz') {
|
|
// special case, tar.gz
|
|
// todo: other special cases?
|
|
$ext = preg_match("/\.tar\.gz$/i", $ext) ? 'tar.gz' : 'gz';
|
|
}
|
|
$this->extension = $ext;
|
|
}
|
|
return $this->extension;
|
|
}
|
|
|
|
/**
|
|
* Read the contents a few bytes at a time until completed
|
|
* Once read to completion, it always returns false
|
|
* @return String
|
|
* @param $bytes Int[optional]
|
|
*/
|
|
public function read($bytes = 2082) {
|
|
return feof($this->stream) ? false : fread($this->stream, $bytes);
|
|
}
|
|
|
|
/**
|
|
* Retrieve the file content in one go
|
|
* Once you retreive the content you cannot use MimeMailParser_attachment::read()
|
|
* @return String
|
|
*/
|
|
public function getContent() {
|
|
if ($this->content === null) {
|
|
fseek($this->stream, 0);
|
|
while(($buf = $this->read()) !== false) {
|
|
$this->content .= $buf;
|
|
}
|
|
}
|
|
return $this->content;
|
|
}
|
|
|
|
/**
|
|
* Allow the properties
|
|
* MimeMailParser_attachment::$name,
|
|
* MimeMailParser_attachment::$extension
|
|
* to be retrieved as public properties
|
|
* @param $name Object
|
|
*/
|
|
public function __get($name) {
|
|
if ($name == 'content') {
|
|
return $this->getContent();
|
|
} else if ($name == 'extension') {
|
|
return $this->getFileExtension();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|