hrow new \InvalidArgumentException($response['message']); } return $response; } public function isEmailAddressAuthorized(string $email): bool { $authorizedEmails = $this->bridge->getAuthorizedEmailAddresses() ?: []; return $this->validateAuthorizedEmail($authorizedEmails, $email); } public function checkAuthorizedEmailAddresses() { if (!Bridge::isMPSendingServiceEnabled()) { $this->settings->set(self::AUTHORIZED_EMAIL_ADDRESSES_ERROR_SETTING, null); $this->updateMailerLog(); return null; } $authorizedEmails = $this->bridge->getAuthorizedEmailAddresses(); // Keep previous check result for an invalid response from API if (!$authorizedEmails) { return null; } $authorizedEmails = array_map('strtolower', $authorizedEmails); $verifiedDomains = $this->senderDomainController->getVerifiedSenderDomainsIgnoringCache(); $result = []; $result = $this->validateAddressesInSettings($authorizedEmails, $verifiedDomains, $result); $result = $this->validateAddressesInScheduledAndAutomaticEmails($authorizedEmails, $verifiedDomains, $result); $this->settings->set(self::AUTHORIZED_EMAIL_ADDRESSES_ERROR_SETTING, $result ?: null); $this->updateMailerLog($result); return $result; } public function onSettingsSave($settings): ?array { $senderAddressSet = !empty($settings['sender']['address']); $mailpoetSendingMethodSet = ($settings[Mailer::MAILER_CONFIG_SETTING_NAME]['method'] ?? null) === Mailer::METHOD_MAILPOET; if ($senderAddressSet || $mailpoetSendingMethodSet) { return $this->checkAuthorizedEmailAddresses(); } return null; } public function onNewsletterSenderAddressUpdate(NewsletterEntity $newsletter, string $oldSenderAddress = null) { if ($newsletter->getSenderAddress() === $oldSenderAddress) { return; } if ($newsletter->getType() === NewsletterEntity::TYPE_STANDARD && $newsletter->getStatus() === NewsletterEntity::STATUS_SCHEDULED) { $this->checkAuthorizedEmailAddresses(); } if (in_array($newsletter->getType(), $this->automaticEmailTypes, true) && $newsletter->getStatus() === NewsletterEntity::STATUS_ACTIVE) { $this->checkAuthorizedEmailAddresses(); } } public function isSenderAddressValid(NewsletterEntity $newsletter, string $context = 'activation'): bool { if (!in_array($newsletter->getType(), NewsletterEntity::CAMPAIGN_TYPES)) { return true; } $isAuthorizedDomainRequired = $context === 'activation' ? $this->senderDomainController->isAuthorizedDomainRequiredForNewCampaigns() : $this->senderDomainController->isAuthorizedDomainRequiredForExistingCampaigns(); if (!$isAuthorizedDomainRequired) { return true; } $verifiedDomains = $context === 'activation' ? $this->senderDomainController->getVerifiedSenderDomainsIgnoringCache() : $this->senderDomainController->getVerifiedSenderDomains(); // The shop is not returning data, so we allow sending and let the Sending Service block the campaign if needed. if ($context === 'sending' && empty($verifiedDomains) && !$this->senderDomainController->isCacheAvailable()) { return true; } return $this->validateEmailDomainIsVerified($verifiedDomains, $newsletter->getSenderAddress()); } private function validateAddressesInSettings($authorizedEmails, $verifiedDomains, $result = []) { $defaultSenderAddress = $this->settings->get('sender.address'); if ($this->validateEmailDomainIsVerified($verifiedDomains, $defaultSenderAddress)) { // allow sending from any email address in a verified domain return $result; } if (!$this->validateAuthorizedEmail($authorizedEmails, $defaultSenderAddress)) { $result['invalid_sender_address'] = $defaultSenderAddress; } return $result; } private function validateAddressesInScheduledAndAutomaticEmails($authorizedEmails, $verifiedDomains, $result = []) { $newsletters = $this->newslettersRepository->getScheduledStandardEmailsAndActiveAutomaticEmails($this->automaticEmailTypes); $invalidSendersInNewsletters = []; foreach ($newsletters as $newsletter) { if ($this->validateAuthorizedEmail($authorizedEmails, $newsletter->getSenderAddress())) { continue; } if ($this->validateEmailDomainIsVerified($verifiedDomains, $newsletter->getSenderAddress())) { // allow sending from any email address in a verified domain continue; } $invalidSendersInNewsletters[] = [ 'newsletter_id' => $newsletter->getId(), 'subject' => $newsletter->getSubject(), 'sender_address' => $newsletter->getSenderAddress(), ]; } if (!count($invalidSendersInNewsletters)) { return $result; } $result['invalid_senders_in_newsletters'] = $invalidSendersInNewsletters; return $result; } /** * @param array|null $error */ private function updateMailerLog(array $error = null) { if ($error) { return; } $mailerLogError = MailerLog::getError(); if ($mailerLogError && $mailerLogError['operation'] === MailerError::OPERATION_AUTHORIZATION) { MailerLog::resumeSending(); } } private function validateAuthorizedEmail($authorizedEmails = [], $email = '') { $lowercaseAuthorizedEmails = array_map('strtolower', $authorizedEmails); return in_array(strtolower($email), $lowercaseAuthorizedEmails, true); } private function validateEmailDomainIsVerified(array $verifiedDomains = [], string $email = ''): bool { $lowercaseVerifiedDomains = array_map('strtolower', $verifiedDomains); $emailDomain = Helpers::extractEmailDomain($email); return in_array($emailDomain, $lowercaseVerifiedDomains, true); } }
Fatal error: Uncaught Error: Class "MailPoet\Services\AuthorizedEmailsController" not found in /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php:4828 Stack trace: #0 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(926): MailPoetGenerated\FreeCachedContainer->getAuthorizedEmailsControllerService() #1 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(5592): MailPoetGenerated\FreeCachedContainer->getSettingsService() #2 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(2612): MailPoetGenerated\FreeCachedContainer->getDotcomLicenseProvisionerService() #3 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(2640): MailPoetGenerated\FreeCachedContainer->getHooks2Service() #4 /htdocs/wp-content/plugins/mailpoet/vendor-prefixed/symfony/dependency-injection/Container.php(122): MailPoetGenerated\FreeCachedContainer->getInitializerService() #5 /htdocs/wp-content/plugins/mailpoet/vendor-prefixed/symfony/dependency-injection/Container.php(110): MailPoetVendor\Symfony\Component\DependencyInjection\Container->make('MailPoet\\Config...', 1) #6 /htdocs/wp-content/plugins/mailpoet/lib/DI/ContainerWrapper.php(39): MailPoetVendor\Symfony\Component\DependencyInjection\Container->get('MailPoet\\Config...') #7 /htdocs/wp-content/plugins/mailpoet/mailpoet_initializer.php(89): MailPoet\DI\ContainerWrapper->get('MailPoet\\Config...') #8 /htdocs/wp-content/plugins/mailpoet/mailpoet.php(194): require_once('/htdocs/wp-cont...') #9 /htdocs/wp-settings.php(526): include_once('/htdocs/wp-cont...') #10 /htdocs/wp-config.php(85): require_once('/htdocs/wp-sett...') #11 /htdocs/wp-load.php(50): require_once('/htdocs/wp-conf...') #12 /htdocs/wp-blog-header.php(13): require_once('/htdocs/wp-load...') #13 /htdocs/index.php(17): require('/htdocs/wp-blog...') #14 {main} thrown in /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php on line 4828
esult[] = $this->get_item_value( $item, $key ); } return new static( $result ); } /** * Group the collection items by specific key in each collection item. * * @param $group_by * * @return $this */ public function group_by( $group_by ) { $result = []; foreach ( $this->items as $item ) { $group_key = $this->get_item_value( $item, $group_by, 0 ); $result[ $group_key ][] = $item; } return new static( $result ); } /** * Sort keys * * @param false $descending * * @return $this */ public function sort_keys( $descending = false ) { $items = $this->items; if ( $descending ) { krsort( $items ); } else { ksort( $items ); } return new static( $items ); } /** * Get specific item from the collection. * * @param $key * @param null $default * * @return mixed|null */ public function get( $key, $default = null ) { if ( ! array_key_exists( $key, $this->items ) ) { return $default; } return $this->items[ $key ]; } /** * Get the first item. * * @param null $default * * @return mixed|null */ public function first( $default = null ) { if ( $this->is_empty() ) { return $default; } foreach ( $this->items as $item ) { return $item; } } /** * Find an element from the items. * * @param callable $callback * @param null $default * * @return mixed|null */ public function find( callable $callback, $default = null ) { foreach ( $this->all() as $key => $item ) { if ( $callback( $item, $key ) ) { return $item; } } return $default; } /** * @param callable|string|int $value * * @return bool */ public function contains( $value ) { $callback = $value instanceof \Closure ? $value : function ( $item ) use ( $value ) { return $item === $value; }; foreach ( $this->all() as $key => $item ) { if ( $callback( $item, $key ) ) { return true; } } return false; } /** * Make sure all the values inside the array are uniques. * * @param null|string|string[] $keys * * @return $this */ public function unique( $keys = null ) { if ( ! $keys ) { return new static( array_unique( $this->items ) ); } if ( ! is_array( $keys ) ) { $keys = [ $keys ]; } $exists = []; return $this->filter( function ( $item ) use ( $keys, &$exists ) { $value = null; foreach ( $keys as $key ) { $current_value = $this->get_item_value( $item, $key ); $value .= "{$key}:{$current_value};"; } // If no value for the specific key return the item. if ( null === $value ) { return true; } // If value is not exists, add to the exists array and return the item. if ( ! in_array( $value, $exists, true ) ) { $exists[] = $value; return true; } return false; } ); } /** * @return array */ public function keys() { return array_keys( $this->items ); } /** * @return bool */ public function is_empty() { return empty( $this->items ); } /** * @return array */ public function all() { return $this->items; } /** * @return array */ public function values() { return array_values( $this->all() ); } /** * Support only one level depth. * * @return $this */ public function flatten() { $result = []; foreach ( $this->all() as $item ) { $item = $item instanceof Collection ? $item->all() : $item; if ( ! is_array( $item ) ) { $result[] = $item; } else { $values = array_values( $item ); foreach ( $values as $value ) { $result[] = $value; } } } return new static( $result ); } /** * @param ...$values * * @return $this */ public function push( ...$values ) { foreach ( $values as $value ) { $this->items[] = $value; } return $this; } public function prepend( ...$values ) { $this->items = array_merge( $values, $this->items ); return $this; } /** * @param mixed $offset * * @return bool */ #[\ReturnTypeWillChange] public function offsetExists( $offset ) { return isset( $this->items[ $offset ] ); } /** * @param mixed $offset * * @return mixed */ #[\ReturnTypeWillChange] public function offsetGet( $offset ) { return $this->items[ $offset ]; } /** * @param mixed $offset * @param mixed $value */ #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { if ( is_null( $offset ) ) { $this->items[] = $value; } else { $this->items[ $offset ] = $value; } } /** * @param mixed $offset */ #[\ReturnTypeWillChange] public function offsetUnset( $offset ) { unset( $this->items[ $offset ] ); } /** * @return \ArrayIterator|\Traversable */ #[\ReturnTypeWillChange] public function getIterator() { return new \ArrayIterator( $this->items ); } /** * @return int|void */ #[\ReturnTypeWillChange] public function count() { return count( $this->items ); } /** * @param $item * @param $key * @param null $default * * @return mixed|null */ private function get_item_value( $item, $key, $default = null ) { $value = $default; if ( is_object( $item ) && isset( $item->{$key} ) ) { $value = $item->{$key}; } elseif ( is_array( $item ) && isset( $item[ $key ] ) ) { $value = $item[ $key ]; } return $value; } }
Fatal error: Uncaught Error: Class "Elementor\Core\Utils\Collection" not found in /htdocs/wp-content/plugins/elementor/includes/utils.php:796 Stack trace: #0 /htdocs/wp-content/plugins/elementor/core/logger/manager.php(41): Elementor\Utils::is_elementor_path('/htdocs/wp-cont...') #1 [internal function]: Elementor\Core\Logger\Manager->shutdown() #2 {main} thrown in /htdocs/wp-content/plugins/elementor/includes/utils.php on line 796