grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026setEmail($email); $this->clearErrors(); $this->addErrors($this->validateFrom()); $this->addErrors($this->validateFromAddr()); $this->addErrors($this->validateFromName()); $this->addErrors($this->validateFrom_Name()); $this->addErrors($this->validateFromAddrName()); // Should be finished the rest fields like to, to address, cc, bcc etc.. (reply-to??) // $this->addErrors($this->validateTo()); // $this->addErrors($this->validateCCs()); // $this->addErrors($this->validateBCCs()); $valid = !$this->hasErrors(); if (!$valid && $tryToFix) { $valid = !$this->hasErrors(); } return $valid; } /** * * @param Email $email */ protected function setEmail(Email $email) { $this->email = $email; } /** * * @return Email * @throws EmailValidatorException */ protected function getEmail() { if (!$this->email) { throw new EmailValidatorException( 'Trying to get Email but previously is not set.', EmailValidatorException::EMAIL_IS_NOT_SET ); } if (!($this->email instanceof Email)) { throw new EmailValidatorException( 'Trying to get Email but object type is incorrect:' . gettype($this->email), EmailValidatorException::EMAIL_ISNT_EMAILOBJ ); } return $this->email; } /** * */ protected function clearErrors() { $this->errors = []; } /** * * @param $error * @throws InvalidArgumentException */ protected function addError($error) { if ($error !== (int)$error) { throw new InvalidArgumentException( 'Error code should be an integer, ' . gettype($error) . ' given', self::EX_ERROR_CODE_TYRE_IS_INCORRECT ); } if (!in_array($error, $this->errors)) { $this->errors[] = $error; } } /** * * @param array $errors */ protected function addErrors($errors) { $this->errors = array_merge($this->errors, $errors); $this->errors = array_unique($this->errors); } /** * * @return array */ public function getErrors() { $errorsArray = $this->errors; $this->clearErrors(); return $errorsArray; } /** * @return array * @throws \SuiteCRM\ErrorMessageException */ public function getErrorsAsText() { $txts = []; $errorsArray = $this->getErrors(); foreach ($errorsArray as $error) { $txts[] = $this->getErrorAsText($error); } return [ 'messages' => implode("\n", $txts), 'codes' => implode(', ', $errorsArray) ]; } /** * @param $error * @return string * @throws \SuiteCRM\ErrorMessageException */ protected function getErrorAsText($error) { if ($error !== (int)$error) { throw new InvalidArgumentException( 'Error code should be an integer, ' . gettype($error) . ' given', self::EX_ERROR_CODE_TYRE_IS_INCORRECT ); } $lbl = $this->getErrorTextLabel($error); return LangText::get($lbl, null, LangText::USING_ALL_STRINGS, true, false, 'Emails'); } /** * * @param int $error * @return string * @throws InvalidArgumentException */ protected function getErrorTextLabel($error) { if ($error !== (int)$error) { throw new InvalidArgumentException( 'Error code should be an integer, ' . gettype($error) . ' given', self::EX_ERROR_CODE_TYRE_IS_INCORRECT ); } switch ($error) { case self::ERR_FIELD_FROM_IS_NOT_SET: $lbl = 'ERR_FIELD_FROM_IS_NOT_SET'; break; case self::ERR_FIELD_FROM_IS_EMPTY: $lbl = 'ERR_FIELD_FROM_IS_EMPTY'; break; case self::ERR_FIELD_FROM_IS_INVALID: $lbl = 'ERR_FIELD_FROM_IS_INVALID'; break; case self::ERR_FIELD_FROM_ADDR_IS_NOT_SET: $lbl = 'ERR_FIELD_FROM_ADDR_IS_NOT_SET'; break; case self::ERR_FIELD_FROM_ADDR_IS_EMPTY: $lbl = 'ERR_FIELD_FROM_ADDR_IS_EMPTY'; break; case self::ERR_FIELD_FROM_ADDR_IS_INVALID: $lbl = 'ERR_FIELD_FROM_ADDR_IS_INVALID'; break; case self::ERR_FIELD_FROMNAME_IS_NOT_SET: $lbl = 'ERR_FIELD_FROMNAME_IS_NOT_SET'; break; case self::ERR_FIELD_FROMNAME_IS_EMPTY: $lbl = 'ERR_FIELD_FROMNAME_IS_EMPTY'; break; case self::ERR_FIELD_FROMNAME_IS_INVALID: $lbl = 'ERR_FIELD_FROMNAME_IS_INVALID'; break; case self::ERR_FIELD_FROM_NAME_IS_NOT_SET: $lbl = 'ERR_FIELD_FROM_NAME_IS_NOT_SET'; break; case self::ERR_FIELD_FROM_NAME_IS_EMPTY: $lbl = 'ERR_FIELD_FROM_NAME_IS_EMPTY'; break; case self::ERR_FIELD_FROM_NAME_IS_INVALID: $lbl = 'ERR_FIELD_FROM_NAME_IS_INVALID'; break; case self::ERR_FIELD_FROM_ADDR_NAME_IS_NOT_SET: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_IS_NOT_SET'; break; case self::ERR_FIELD_FROM_ADDR_NAME_IS_EMPTY: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_IS_EMPTY'; break; case self::ERR_FIELD_FROM_ADDR_NAME_IS_INVALID: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_IS_INVALID'; break; case self::ERR_FIELD_FROM_ADDR_NAME_DOESNT_MATCH_REGEX: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_DOESNT_MATCH_REGEX'; break; case self::ERR_FIELD_FROM_ADDR_NAME_INVALID_NAME_PART: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_INVALID_NAME_PART'; break; case self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART'; break; case self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM'; break; case self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM_ADDR: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM_ADDR'; break; case self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROMNAME: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROMNAME'; break; case self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM_NAME: $lbl = 'ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM_NAME'; break; default: throw new InvalidArgumentException( 'Error code is not implemented: ' . $error, self::EX_ERROR_CODE_IS_NOT_IMPLEMENTED ); } return $lbl; } /** * * @return bool */ protected function hasErrors() { return !empty($this->errors); } /** * * @param string $emailAddress * @return bool */ protected function isValidEmailAddress($emailAddress) { return is_string($emailAddress) && isValidEmailAddress($emailAddress, '', false, ''); } /** * * @param string $nonEmailAddress * @return boolean */ protected function isValidNonEmailAddress($nonEmailAddress) { $valid = true; if (!is_string($nonEmailAddress) || !$nonEmailAddress || isValidEmailAddress($nonEmailAddress, '', false, '')) { $valid = false; } return $valid; } /** * * @param string $fromAddress * @return bool */ protected function isValidFromAddress($fromAddress) { return $this->isValidEmailAddress($fromAddress); } /** * * @param string $fromName * @return boolean */ protected function isValidFromName($fromName) { return $this->isValidNonEmailAddress($fromName); } /** * * @param string $fromAddrName * @return boolean * @throws EmailValidatorException */ protected function isValidFromAddrName($fromAddrName) { $valid = false; $matches = null; $results = preg_match('/([^<]+)\s+<([^>]+)>/', $fromAddrName, $matches); if ($results === false) { throw new EmailValidatorException( 'preg_match error occurred at from_addr_name check.', EmailValidatorException::PREG_MATCH_ERROR_AT_FROMADDRNAME ); } if (!$results) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_DOESNT_MATCH_REGEX); } else { $name = $matches[1]; $emailAddress = $matches[2]; $ok = true; if (!$this->isValidNonEmailAddress($name)) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_INVALID_NAME_PART); $ok = false; } if (!$this->isValidEmailAddress($emailAddress)) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART); $ok = false; } $emailObj = $this->getEmail(); if (isset($emailObj->From) && $emailAddress !== $emailObj->From) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM); $ok = false; } if (isset($emailObj->from_addr) && $emailAddress !== $emailObj->from_addr) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM_ADDR); $ok = false; } if (isset($emailObj->FromName) && $name !== $emailObj->FromName) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROMNAME); $ok = false; } if (isset($emailObj->from_name) && $name !== $emailObj->from_name) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_INVALID_EMAIL_PART_TO_FIELD_FROM_NAME); $ok = false; } if ($ok) { $valid = true; } } return $valid; } /** * validate field 'From' - should be a valid email address * * @return array * @throws EmailValidatorException */ protected function validateFrom() { $emailAddress = $this->getEmail(); if (!isset($emailAddress->From)) { $this->addError(self::ERR_FIELD_FROM_IS_NOT_SET); } elseif (!$emailAddress->From) { $this->addError(self::ERR_FIELD_FROM_IS_EMPTY); } elseif (!$this->isValidFromAddress($emailAddress->From)) { $this->addError(self::ERR_FIELD_FROM_IS_INVALID); } return $this->getErrors(); } /** * validate field 'from_addr' - should be a valid email address * * @return array * @throws EmailValidatorException */ protected function validateFromAddr() { $emailAddress = $this->getEmail(); if (!isset($emailAddress->from_addr)) { $this->addError(self::ERR_FIELD_FROM_ADDR_IS_NOT_SET); } elseif (!$emailAddress->from_addr) { $this->addError(self::ERR_FIELD_FROM_ADDR_IS_EMPTY); } elseif (!$this->isValidFromAddress($emailAddress->from_addr)) { $this->addError(self::ERR_FIELD_FROM_ADDR_IS_INVALID); } return $this->getErrors(); } /** * validate field 'FromName' - should be a valid name string * * @return array * @throws EmailValidatorException */ protected function validateFromName() { $emailAddress = $this->getEmail(); if (!isset($emailAddress->FromName)) { $this->addError(self::ERR_FIELD_FROMNAME_IS_NOT_SET); } elseif (!$emailAddress->FromName) { $this->addError(self::ERR_FIELD_FROMNAME_IS_EMPTY); } elseif (!$this->isValidFromName($emailAddress->FromName)) { $this->addError(self::ERR_FIELD_FROMNAME_IS_INVALID); } return $this->getErrors(); } /** * validate field 'from_name' - should be a valid name string * * @return array * @throws EmailValidatorException */ protected function validateFrom_Name() { $emailAddress = $this->getEmail(); if (!isset($emailAddress->from_name)) { $this->addError(self::ERR_FIELD_FROM_NAME_IS_NOT_SET); } elseif (!$emailAddress->from_name) { $this->addError(self::ERR_FIELD_FROM_NAME_IS_EMPTY); } elseif (!$this->isValidFromName($emailAddress->from_name)) { $this->addError(self::ERR_FIELD_FROM_NAME_IS_INVALID); } return $this->getErrors(); } /** * validate field 'from_addr_name' - should be a valid name string and email address pair * where email address in between '<' and '>' characters * * @return array * @throws EmailValidatorException */ protected function validateFromAddrName() { $emailAddress = $this->getEmail(); if (!isset($emailAddress->from_addr_name)) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_IS_NOT_SET); } elseif (!$emailAddress->from_addr_name) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_IS_EMPTY); } elseif (!$this->isValidFromAddrName($emailAddress->from_addr_name)) { $this->addError(self::ERR_FIELD_FROM_ADDR_NAME_IS_INVALID); } return $this->getErrors(); } }