Files
glastree/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php
T
2026-05-26 08:14:29 +02:00

104 lines
3.3 KiB
PHP

<?php
/**
* This file is part of the ZBateson\MailMimeParser project.
*
* @license http://opensource.org/licenses/bsd-license.php BSD
*/
namespace ZBateson\MailMimeParser\Header\Part;
use Psr\Log\LoggerInterface;
use ZBateson\MbWrapper\MbWrapper;
/**
* Holds extra information about a parsed Received header part, for FROM and BY
* parts, namely: ehlo name, hostname, and address.
*
* The parsed parts would be mapped as follows:
*
* FROM ehlo name (hostname [address]), for example: FROM computer (domain.com
* [1.2.3.4]) would contain "computer" for getEhloName(), domain.com for
* getHostname and 1.2.3.4 for getAddress().
*
* This doesn't change if the ehlo name is an address, it is still returned in
* getEhloName(), and not in getAddress(). Additionally square brackets are not
* stripped from getEhloName() if its an address. For example: "FROM [1.2.3.4]"
* would return "[1.2.3.4]" in a call to getEhloName().
*
* For further information on how the header's parsed, check the documentation
* for {@see \ZBateson\MailMimeParser\Header\Consumer\Received\DomainConsumer}.
*
* @author Zaahid Bateson
*/
class ReceivedDomainPart extends ReceivedPart
{
/**
* @var string The name used to identify the server in the EHLO line.
*/
protected ?string $ehloName = null;
/**
* @var string The hostname.
*/
protected ?string $hostname = null;
/**
* @var string The address.
*/
protected ?string $address = null;
/**
* @param HeaderPart[] $children
*/
public function __construct(
LoggerInterface $logger,
MbWrapper $charsetConverter,
string $name,
array $children
) {
parent::__construct($logger, $charsetConverter, $name, $children);
$this->ehloName = ($this->value !== '') ? $this->value : null;
$cps = $this->getComments();
$commentPart = (!empty($cps)) ? $cps[0] : null;
$pattern = '~^(\[(IPv[64])?(?P<addr1>[a-f\d\.\:]+)\])?\s*(helo=)?(?P<name>[a-z0-9\-]+[a-z0-9\-\.]+)?\s*(\[(IPv[64])?(?P<addr2>[a-f\d\.\:]+)\])?$~i';
if ($commentPart !== null && \preg_match($pattern, $commentPart->getComment(), $matches)) {
$this->value .= ' (' . $commentPart->getComment() . ')';
$this->hostname = (!empty($matches['name'])) ? $matches['name'] : null;
$this->address = (!empty($matches['addr1'])) ? $matches['addr1'] : ((!empty($matches['addr2'])) ? $matches['addr2'] : null);
}
}
/**
* Returns the name used to identify the server in the first part of the
* extended-domain line.
*
* Note that this is not necessarily the name used in the EHLO line to an
* SMTP server, since implementations differ so much, not much can be
* guaranteed except the position it was parsed in.
*/
public function getEhloName() : ?string
{
return $this->ehloName;
}
/**
* Returns the hostname of the server, or whatever string in the hostname
* position when parsing (but never an address).
*/
public function getHostname() : ?string
{
return $this->hostname;
}
/**
* Returns the address of the server, or whatever string that looks like an
* address in the address position when parsing (but never a hostname).
*/
public function getAddress() : ?string
{
return $this->address;
}
}