Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?php
/**
 * Copyright 2012-2017 Horde LLC (http://www.horde.org/)
 *
 * See the enclosed file LICENSE for license information (BSD). If you
 * did not receive this file, see http://www.horde.org/licenses/bsd.
 *
 * @category  Horde
 * @copyright 2012-2017 Horde LLC
 * @license   http://www.horde.org/licenses/bsd New BSD License
 * @package   Mail
 */

/**
 * Object representation of a RFC 822 e-mail address.
 *
 * @author    Michael Slusarz <slusarz@horde.org>
 * @category  Horde
 * @copyright 2012-2017 Horde LLC
 * @license   http://www.horde.org/licenses/bsd New BSD License
 * @package   Mail
 *
 * @property-read string $bare_address  The bare mailbox@host address.
 * @property-read string $bare_address_idn  The bare mailbox@host address (IDN
 *                                          encoded). (@since 2.1.0)
 * @property-read boolean $eai  Returns true if the local (mailbox) address
 *                              part requires EAI (UTF-8) support.
 *                              (@since 2.5.0)
 * @property-read string $encoded  The full MIME/IDN encoded address (UTF-8).
 * @property string $host  Returns the host part (UTF-8).
 * @property-read string $host_idn  Returns the IDN encoded host part.
 * @property-read string $label  The shorthand label for this address.
 * @property string $personal  The personal part (UTF-8).
 * @property-read string $personal_encoded  The MIME encoded personal part
 *                                          (UTF-8).
 * @property-read boolean $valid  Returns true if there is enough information
 *                                in object to create a valid address.
 */
class Horde_Mail_Rfc822_Address extends Horde_Mail_Rfc822_Object
{
    /**
     * Comments associated with the personal phrase.
     *
     * @var array
     */
    public $comment = array();

    /**
     * Local-part of the address (UTF-8).
     *
     * @var string
     */
    public $mailbox = null;

    /**
     * Hostname of the address.
     *
     * @var string
     */
    protected $_host = null;

    /**
     * Personal part of the address.
     *
     * @var string
     */
    protected $_personal = null;

    /**
     * Constructor.
     *
     * @param string $address  If set, address is parsed and used as the
     *                         object address. Address is not validated;
     *                         first e-mail address parsed is used.
     */
    public function __construct($address = null)
    {
        if (!is_null($address)) {
            $rfc822 = new Horde_Mail_Rfc822();
            $addr = $rfc822->parseAddressList($address);
            if (count($addr)) {
                foreach ($addr[0] as $key => $val) {
                    $this->$key = $val;
                }
            }
        }
    }

    /**
     */
    public function __set($name, $value)
    {
        switch ($name) {
        case 'host':
            try {
                $value = Horde_Idna::decode($value);
            } catch (Horde_Idna_Exception $e) {}
            $this->_host = Horde_String::lower($value);
            break;

        case 'personal':
< $this->_personal = strlen($value)
> $this->_personal = !empty($value)
? Horde_Mime::decode($value) : null; break; } } /** * @throws Horde_Idna_Exception */ public function __get($name) { switch ($name) { case 'bare_address': return is_null($this->host) ? $this->mailbox : $this->mailbox . '@' . $this->host; case 'bare_address_idn': $personal = $this->_personal; $this->_personal = null; $res = $this->encoded; $this->_personal = $personal; return $res; case 'eai': return is_null($this->mailbox) ? false : Horde_Mime::is8bit($this->mailbox); case 'encoded': return $this->writeAddress(true); case 'host': return $this->_host; case 'host_idn': return Horde_Idna::encode($this->_host); case 'label': return is_null($this->personal) ? $this->bare_address : $this->_personal; case 'personal':
< return (strcasecmp($this->_personal, $this->bare_address) === 0)
> return $this->_personal === null || (strcasecmp($this->_personal, $this->bare_address) === 0)
? null : $this->_personal; case 'personal_encoded': return Horde_Mime::encode($this->personal); case 'valid':
< return (bool)strlen($this->mailbox);
> return !empty($this->mailbox);
} } /** */ protected function _writeAddress($opts) { $rfc822 = new Horde_Mail_Rfc822(); $address = $rfc822->encode($this->mailbox, 'address'); $host = empty($opts['idn']) ? $this->host : $this->host_idn;
< if (strlen($host)) {
> if (!empty($host)) {
$address .= '@' . $host; } $personal = $this->personal;
< if (strlen($personal)) {
> if (!empty($personal)) {
if (!empty($opts['encode'])) { $personal = Horde_Mime::encode($this->personal, $opts['encode']); } if (empty($opts['noquote'])) { $personal = $rfc822->encode($personal, 'personal'); } } if (!empty($opts['comment']) && !empty($this->comment)) { foreach ($this->comment as $val) { $personal .= ' (' . $rfc822->encode($val, 'comment') . ')'; } }
< return (strlen($personal) && ($personal != $address))
> return (!empty($personal) && ($personal != $address))
? ltrim($personal) . ' <' . $address . '>' : $address; } /** */ public function match($ob) { if (!($ob instanceof Horde_Mail_Rfc822_Address)) { $ob = new Horde_Mail_Rfc822_Address($ob); } return ($this->bare_address == $ob->bare_address); } /** * Do a case-insensitive match on the address. Per RFC 822/2822/5322, * although the host portion of an address is case-insensitive, the * mailbox portion is platform dependent. * * @param mixed $ob Address data. * * @return boolean True if the data reflects the same case-insensitive * address. */ public function matchInsensitive($ob) { if (!($ob instanceof Horde_Mail_Rfc822_Address)) { $ob = new Horde_Mail_Rfc822_Address($ob); } return (Horde_String::lower($this->bare_address) == Horde_String::lower($ob->bare_address)); } /** * Do a case-insensitive match on the address for a given domain. * Matches as many parts of the subdomain in the address as is given in * the input. * * @param string $domain Domain to match. * * @return boolean True if the address matches the given domain. */ public function matchDomain($domain) { $host = $this->host; if (is_null($host)) { return false; } $match_domain = explode('.', $domain); $match_host = array_slice(explode('.', $host), count($match_domain) * -1); return (strcasecmp($domain, implode('.', $match_host)) === 0); } }