1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 
<?php
/* --------------------------------------------------------------
   EmailAddress.inc.php 2016-06-24
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2016 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]
   --------------------------------------------------------------
*/

MainFactory::load_class('EmailAddressInterface');

/**
 * Class EmailAddress
 *
 * Represents an email address (both email address and displayed name).
 *
 * @category   System
 * @package    Email
 * @subpackage ValueObjects
 */
class EmailAddress implements EmailAddressInterface
{
    /**
     * Defines the max length of the database field.
     * 
     * @var int
     */
    const MAX_LENGTH = 128;


    /**
     * E-Mail address.
     * 
     * @var string
     */
    protected $emailAddress;


    /**
     * Constructor
     *
     * Executes the validation checks for the email address.
     *
     * @param string $p_emailAddress          E-Mail address.
     * @param bool   $encodeSpecialCharacters Optional (true), whether to encode the special unicode characters to ASCII.
     *
     * @throws InvalidArgumentException If the provided argument is not valid.
     */
    public function __construct($p_emailAddress, $encodeSpecialCharacters = true)
    {
        if(!is_string($p_emailAddress) || empty($p_emailAddress))
        {
            throw new InvalidArgumentException('Invalid argument provided (expected string email address) $p_emailAddress: '
                                               . print_r($p_emailAddress, true));
        }

        if(strlen(trim($p_emailAddress)) > self::MAX_LENGTH)
        {
            throw new InvalidArgumentException('Argument exceeded the maximum database field length ('
                                               . self::MAX_LENGTH . '):' . $p_emailAddress);
        }
        
        if($encodeSpecialCharacters === true)
        {
            $punycode = new TrueBV\Punycode();
            $emailAddress = $punycode->encode($p_emailAddress); 
        }
        else
        {
            $emailAddress = $p_emailAddress;
        }
        
        if(!filter_var($emailAddress, FILTER_VALIDATE_EMAIL))
        {
            throw new InvalidArgumentException('Invalid email address provided $p_emailAddress: ' . $p_emailAddress);
        }

        $this->emailAddress = $p_emailAddress; // Store the original string and not the encoded one. 
    }


    /**
     * Returns the email address as a string.
     *
     * @return string Equivalent string.
     */
    public function __toString()
    {
        return $this->emailAddress;
    }
}