smeserver-dmarc-srg/root/opt/dmarc-srg/classes/Mail/MailAttachment.php

111 lines
3.0 KiB
PHP

<?php
/**
* dmarc-srg - A php parser, viewer and summary report generator for incoming DMARC reports.
* Copyright (C) 2020 Aleksey Andreev (liuch)
*
* Available at:
* https://github.com/liuch/dmarc-srg
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Liuch\DmarcSrg\Mail;
use Liuch\DmarcSrg\ReportFile\ReportFile;
use Liuch\DmarcSrg\Exception\SoftException;
class MailAttachment
{
private $conn;
private $filename;
private $bytes;
private $number;
private $mnumber;
private $encoding;
private $stream;
private $mime_type;
public function __construct($conn, $params)
{
$this->conn = $conn;
$this->filename = $params['filename'];
$this->bytes = $params['bytes'];
$this->number = $params['number'];
$this->mnumber = $params['mnumber'];
$this->encoding = $params['encoding'];
$this->stream = null;
$this->mime_type = null;
}
public function __destruct()
{
if (!is_null($this->stream) && get_resource_type($this->stream) == 'stream') {
fclose($this->stream);
}
}
public function mimeType()
{
if (is_null($this->mime_type)) {
$this->mime_type = ReportFile::getMimeType($this->filename, $this->datastream());
}
return $this->mime_type;
}
public function size()
{
return $this->bytes;
}
public function filename()
{
return $this->filename;
}
public function extension()
{
return pathinfo($this->filename, PATHINFO_EXTENSION);
}
public function datastream()
{
if (is_null($this->stream)) {
$this->stream = fopen('php://temp', 'r+');
fwrite($this->stream, $this->toString());
}
rewind($this->stream);
return $this->stream;
}
private function fetchBody()
{
return imap_fetchbody($this->conn, $this->mnumber, strval($this->number), FT_PEEK);
}
private function toString()
{
switch ($this->encoding) {
case ENC7BIT:
case ENC8BIT:
case ENCBINARY:
return $this->fetchBody();
case ENCBASE64:
return base64_decode($this->fetchBody());
case ENCQUOTEDPRINTABLE:
return imap_qprint($this->fetchBody());
}
throw new SoftException('Encoding failed: Unknown encoding');
}
}