src/PhpImap/IncomingMailAttachment.php
<?php
declare(strict_types=1);
namespace PhpImap;
use const FILEINFO_NONE;
use finfo;
use UnexpectedValueException;
/**
* @see https://github.com/barbushin/php-imap
*
* @author Barbushin Sergey http://linkedin.com/in/barbushin
*
* @property string|false|null $filePath lazy attachment data file
*
* @psalm-type fileinfoconst = 0|2|16|1024|1040|8|32|128|256|16777216
*/
class IncomingMailAttachment
{
/** @var string|null */
public $id;
/** @var string|null */
public $contentId;
/** @var int|null */
public $type;
/** @var int|null */
public $encoding;
/** @var string|null */
public $subtype;
/** @var string|null */
public $description;
/** @var string|null */
public $name;
/** @var int|null */
public $sizeInBytes;
/** @var string|null */
public $disposition;
/** @var string|null */
public $charset;
/** @var bool|null */
public $emlOrigin;
/** @var string|null */
public $fileInfoRaw;
/** @var string|null */
public $fileInfo;
/** @var string|null */
public $mime;
/** @var string|null */
public $mimeEncoding;
/** @var string|null */
public $fileExtension;
/** @var string|null */
public $mimeType;
/** @var string|null */
private $file_path;
/** @var DataPartInfo|null */
private $dataInfo;
/** @var string|null */
private $filePath;
/**
* @return false|string
*/
public function __get(string $name)
{
if ('filePath' !== $name) {
\trigger_error("Undefined property: IncomingMailAttachment::$name");
}
if (!isset($this->file_path)) {
return false;
}
$this->filePath = $this->file_path;
if (@\file_exists($this->file_path)) {
return $this->filePath;
}
return $this->filePath;
}
/**
* Sets the file path.
*
* @param string $filePath File path incl. file name and optional extension
*/
public function setFilePath(string $filePath): void
{
$this->file_path = $filePath;
}
/**
* Sets the data part info.
*
* @param DataPartInfo $dataInfo Date info (file content)
*/
public function addDataPartInfo(DataPartInfo $dataInfo): void
{
$this->dataInfo = $dataInfo;
}
/**
* Gets information about a file.
*
* @param int $fileinfo_const Any predefined constant. See https://www.php.net/manual/en/fileinfo.constants.php
*
* @psalm-param fileinfoconst $fileinfo_const
*/
public function getFileInfo(int $fileinfo_const = FILEINFO_NONE): string
{
$finfo = new finfo($fileinfo_const);
return $finfo->buffer($this->getContents());
}
/**
* Gets the file content.
*/
public function getContents(): string
{
if (null === $this->dataInfo) {
throw new UnexpectedValueException(static::class.'::$dataInfo has not been set by calling '.self::class.'::addDataPartInfo()');
}
return $this->dataInfo->fetch();
}
/**
* Saves the attachment object on the disk.
*
* @return bool True, if it could save the attachment on the disk
*/
public function saveToDisk(): bool
{
if (null === $this->dataInfo) {
return false;
}
if (false === \file_put_contents($this->__get('filePath'), $this->dataInfo->fetch())) {
unset($this->filePath, $this->file_path);
return false;
}
return true;
}
}