143 lines
3.9 KiB
PHP
143 lines
3.9 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;
|
|
|
|
/**
|
|
* The class is designed to easily create multipart/alternative message bodies.
|
|
*/
|
|
class MailBody
|
|
{
|
|
private $text = null;
|
|
private $html = null;
|
|
private $boundary = null;
|
|
|
|
/**
|
|
* Sets text content as a part of the message body
|
|
*
|
|
* @param array $text Text part of the message as an array of strings
|
|
*
|
|
* @return void
|
|
*/
|
|
public function setText(array &$text): void
|
|
{
|
|
$this->text = $text;
|
|
}
|
|
|
|
/**
|
|
* Sets html content as a part of the message body
|
|
*
|
|
* @param array $html Html part of the message as and array of strings
|
|
*
|
|
* @return void
|
|
*/
|
|
public function setHtml(array $html): void
|
|
{
|
|
$this->html = $html;
|
|
}
|
|
|
|
/**
|
|
* Return Content-Type header value for the whole message
|
|
*
|
|
* @return string
|
|
*/
|
|
public function contentType(): string
|
|
{
|
|
if ($this->boundary()) {
|
|
$ctype = 'multipart/alternative; boundary="' . $this->boundary() . '"';
|
|
} else {
|
|
if (!is_null($this->html)) {
|
|
$ctype = 'text/html';
|
|
} else {
|
|
$ctype = 'text/plain';
|
|
}
|
|
$ctype .= '; charset=utf-8';
|
|
}
|
|
return $ctype;
|
|
}
|
|
|
|
/**
|
|
* Returns all the message parts with required headers as an array of strings
|
|
*
|
|
* @return array
|
|
*/
|
|
public function content(): array
|
|
{
|
|
$content = [];
|
|
if ($this->text) {
|
|
$this->addBodyPart('text', $this->text, $content);
|
|
}
|
|
if ($this->html) {
|
|
$this->addBodyPart('html', $this->html, $content);
|
|
}
|
|
return $content;
|
|
}
|
|
|
|
/**
|
|
* Generates a boundary string of the message. If the body has only one part of the content
|
|
* it returns null
|
|
*
|
|
* @return string|null
|
|
*/
|
|
private function boundary()
|
|
{
|
|
if (!$this->boundary) {
|
|
if ($this->text && $this->html) {
|
|
$this->boundary = '==========' . sha1(uniqid()) . '=====';
|
|
}
|
|
}
|
|
return $this->boundary;
|
|
}
|
|
|
|
/**
|
|
* Adds the specified part of the content to the array passed as the third parameter
|
|
* with the required headers.
|
|
*
|
|
* @param string $type Type of the content to add
|
|
* @param array $part Part of the content to add
|
|
* @param array $content Where the data with headers should be added
|
|
*
|
|
* @return void
|
|
*/
|
|
private function addBodyPart(string $type, array &$part, array &$content): void
|
|
{
|
|
if ($this->boundary()) {
|
|
$content[] = '--' . $this->boundary();
|
|
switch ($type) {
|
|
case 'text':
|
|
$ctype = 'text/plain';
|
|
break;
|
|
case 'html':
|
|
$ctype = 'text/html';
|
|
break;
|
|
}
|
|
$content[] = 'Content-Type: ' . $ctype . '; charset=utf-8';
|
|
$content[] = 'Content-Transfer-Encoding: 7bit';
|
|
$content[] = '';
|
|
}
|
|
foreach ($part as $row) {
|
|
$content[] = $row;
|
|
}
|
|
unset($part);
|
|
}
|
|
}
|