You are here

SendinblueManager.php in SendinBlue 8.2

Same filename and directory in other branches
  1. 8 src/SendinblueManager.php

Namespace

Drupal\sendinblue

File

src/SendinblueManager.php
View source
<?php

namespace Drupal\sendinblue;

use Drupal\Component\Serialization\Json;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Mail\MailManagerInterface;
use Drupal\Core\Render\Renderer;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\sendinblue\Form\ConfigurationSendinblueForm;
use Drupal\sendinblue\Form\LogoutForm;
use Drupal\sendinblue\Form\RegisteringUserForm;
use Drupal\sendinblue\Form\TransactionnalEmailForm;
use Drupal\sendinblue\Tools\Api\SendInBlueApiInterface;
use Drupal\sendinblue\Tools\Api\SendinblueApiV2;
use Drupal\sendinblue\Tools\Api\SendinblueApiV3;

/**
 * Basic manager of module.
 */
class SendinblueManager {
  use StringTranslationTrait;
  const SENDINBLUE_SIGNUP_ENTITY = 'sendinblue_signup_form';
  const SENDINBLUE_SIGNUP_BLOCK = 1;
  const SENDINBLUE_SIGNUP_PAGE = 2;
  const SENDINBLUE_SIGNUP_BOTH = 3;
  const SENDINBLUE_API_VERSION_V2 = 'v2';
  const SENDINBLUE_API_VERSION_V3 = 'v3';

  /**
   * Variable name of Sendinblue URL.
   */
  const SIB_URL = 'https://my.sendinblue.com';

  /**
   * Variable name of Sendinblue access key.
   */
  const CONFIG_SETTINGS = 'sendinblue.config_global.settings';

  /**
   * Variable name of Sendinblue access key.
   */
  const CONFIG_SETTINGS_REGISTERING_USER = 'sendinblue.config_registering_user.settings';

  /**
   * Variable name of Sendinblue access key.
   */
  const CONFIG_SETTINGS_SEND_EMAIL = 'sendinblue.config_send_email.settings';

  /**
   * Variable name of Sendinblue access key.
   */
  const ACCESS_KEY = 'sendinblue_access_key';

  /**
   * Variable name of Sendinblue account email.
   */
  const ACCOUNT_EMAIL = 'sendinblue_account_email';

  /**
   * Variable name of Sendinblue account user name.
   */
  const ACCOUNT_USERNAME = 'sendinblue_account_username';

  /**
   * Variable name of Sendinblue account data.
   */
  const ACCOUNT_DATA = 'sendinblue_account_data';

  /**
   * Variable name of access_token.
   */
  const ACCESS_TOKEN = 'sendinblue_access_token';

  /**
   * Variable name of smtp details.
   */
  const SMTP_DETAILS = 'sendinblue_smtp_details';

  /**
   * ConfigFactoryInterface.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  private $configFactory;

  /**
   * FormBuilderInterface.
   *
   * @var \Drupal\Core\Form\FormBuilderInterface
   */
  private $formBuilder;

  /**
   * Renderer.
   *
   * @var \Drupal\Core\Render\Renderer
   */
  private $renderer;

  /**
   * SendinblueMailin.
   *
   * @var \Drupal\sendinblue\Tools\Api\SendInBlueApiInterface
   */
  private $sendinblueMailin;

  /**
   * Connection.
   *
   * @var \Drupal\Core\Database\Connection
   */
  private $connection;

  /**
   * MailManagerInterface.
   *
   * @var \Drupal\Core\Mail\MailManagerInterface
   */
  private $mailManager;

  /**
   * AccountProxyInterface.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  private $accountProxy;

  /**
   * SendinblueApi V2.
   *
   * @var \Drupal\sendinblue\Tools\Api\SendinblueApiV2
   */
  private $sendinblueApiV2;

  /**
   * SendinblueApi V3.
   *
   * @var \Drupal\sendinblue\Tools\Api\SendinblueApiV3
   */
  private $sendinblueApiV3;

  /**
   * EntityModerationForm constructor.
   *
   * @param \Drupal\sendinblue\Tools\Api\SendinblueApiV2 $sendinblueApiV2
   *   SendinblueMailin.
   * @param \Drupal\sendinblue\Tools\Api\SendinblueApiV3 $sendinblueApiV3
   *   SendinblueMailin.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   ConfigFactoryInterface.
   * @param \Drupal\Core\Database\Connection $connection
   *   Connection.
   * @param \Drupal\Core\Form\FormBuilderInterface $formBuilder
   *   FormBuilderInterface.
   * @param \Drupal\Core\Render\Renderer $renderer
   *   Renderer.
   * @param \Drupal\Core\Mail\MailManagerInterface $mailManager
   *   MailManagerInterface.
   * @param \Drupal\Core\Session\AccountProxyInterface $accountProxy
   *   AccountProxyInterface.
   */
  public function __construct(SendinblueApiV2 $sendinblueApiV2, SendinblueApiV3 $sendinblueApiV3, ConfigFactoryInterface $configFactory, Connection $connection, FormBuilderInterface $formBuilder, Renderer $renderer, MailManagerInterface $mailManager, AccountProxyInterface $accountProxy) {
    $this->configFactory = $configFactory;
    $this->connection = $connection;
    $this->formBuilder = $formBuilder;
    $this->renderer = $renderer;
    $this->mailManager = $mailManager;
    $this->accountProxy = $accountProxy;
    $this->sendinblueApiV2 = $sendinblueApiV2;
    $this->sendinblueApiV3 = $sendinblueApiV3;
    $this
      ->updateSendinblueMailin($this
      ->getAccessKey());
  }

  /**
   * Get the access key store in configuration.
   *
   * @return string
   *   The SiB access key
   */
  public function getAccessKey() {
    return $this->configFactory
      ->get(self::CONFIG_SETTINGS)
      ->get(self::ACCESS_KEY);
  }

  /**
   * Get the access key store in configuration.
   *
   * @param string $accessKey
   *   The SiB access key.
   *
   * @return string
   *   The SiB API version (V2 or V3)
   */
  public function getApiVersion($accessKey) {
    if (strlen($accessKey) > 20 && strpos($accessKey, 'xkeysib') !== FALSE) {
      return self::SENDINBLUE_API_VERSION_V3;
    }
    return self::SENDINBLUE_API_VERSION_V2;
  }

  /**
   * Get the correct Class in function of API version.
   *
   * @return \Drupal\sendinblue\Tools\Api\SendInBlueApiInterface
   *   SendInBlueApiInterface (V2 or V3)
   */
  public function getSendinblueMailin() : SendInBlueApiInterface {
    return $this->sendinblueMailin;
  }

  /**
   * Change Class Class in function of API version.
   *
   * @param string $accessKey
   *   The SiB access key.
   *
   * @return \Drupal\sendinblue\Tools\Api\SendInBlueApiInterface
   *   SendInBlueApiInterface (V2 or V3)
   */
  public function updateSendinblueMailin($accessKey) {
    if ($this
      ->getApiVersion($accessKey) === self::SENDINBLUE_API_VERSION_V3) {
      $this->sendinblueMailin = $this->sendinblueApiV3;
    }
    else {
      $this->sendinblueMailin = $this->sendinblueApiV2;
    }
    $this->sendinblueMailin
      ->setApiKey($accessKey);
    return $this->sendinblueMailin;
  }

  /**
   * Get the account email store in configuration.
   *
   * @return string
   *   The SiB account email
   */
  public function getAccountEmail() {
    return $this->configFactory
      ->get(self::CONFIG_SETTINGS)
      ->get(self::ACCOUNT_EMAIL);
  }

  /**
   * Get the account username store in configuration.
   *
   * @return string
   *   The SiB account username
   */
  public function getAccountUsername() {
    return $this->configFactory
      ->get(self::CONFIG_SETTINGS)
      ->get(self::ACCOUNT_USERNAME);
  }

  /**
   * Get the data account store in configuration.
   *
   * @return string
   *   The SiB account store
   */
  public function getAccountData() {
    return $this->configFactory
      ->get(self::CONFIG_SETTINGS)
      ->get(self::ACCOUNT_DATA);
  }

  /**
   * Get the data account store in configuration.
   *
   * @return string
   *   The SiB account store
   */
  public function getSmtpDetails() {
    return $this->configFactory
      ->get(self::CONFIG_SETTINGS_SEND_EMAIL)
      ->get(self::SMTP_DETAILS);
  }

  /**
   * Get the access token store in configuration.
   *
   * @return string
   *   The SiB access token
   */
  public function getAccessKeyToken() {
    return $this->configFactory
      ->get(self::CONFIG_SETTINGS)
      ->get(self::ACCESS_TOKEN);
  }

  /**
   * Generate Home layout of Log out.
   *
   * @return array
   *   A html of home page when log out.
   */
  public function generateHomeLogout() {
    $form = $this->formBuilder
      ->getForm(ConfigurationSendinblueForm::class);
    return [
      '#formulaire_api_key' => $this->renderer
        ->render($form),
    ];
  }

  /**
   * Generate Home layout of Log out.
   *
   * @return array
   *   A html of home page when login.
   */
  public function generateHomeLogin() {

    // Calculate total count of subscribers.
    $lists = $this->sendinblueMailin
      ->getLists();
    $totalSubscribers = 0;
    $listIds = [];
    if ($lists
      ->getCount() > 0) {
      $listData = $lists
        ->getLists();
      foreach ($listData as $list) {
        $listIds[] = $list['id'];
      }
      $totalSubscribers = $this->sendinblueMailin
        ->countUserlists($listIds);
    }

    // Get account details.
    $accountEmail = $this
      ->getAccountEmail();
    $accountUsername = $this
      ->getAccountUsername();
    $account_data = Json::decode($this
      ->getAccountData());
    $sendinblue_logout_form = $this->formBuilder
      ->getForm(LogoutForm::class);
    $sendinblue_send_email_form = $this->formBuilder
      ->getForm(TransactionnalEmailForm::class);
    $sendinblue_user_register_form = $this->formBuilder
      ->getForm(RegisteringUserForm::class);
    return [
      '#account_username' => [
        '#plain_text' => $accountUsername,
      ],
      '#account_email' => [
        '#plain_text' => $accountEmail,
      ],
      '#total_subscribers' => [
        '#plain_text' => $totalSubscribers,
      ],
      '#account_data' => $account_data,
      '#api_version' => $this
        ->getApiVersion($this
        ->getAccessKey()),
      '#sendinblue_logout_form' => $this->renderer
        ->render($sendinblue_logout_form),
      '#sendinblue_send_email_form' => $this->renderer
        ->render($sendinblue_send_email_form),
      '#sendinblue_user_register_form' => $this->renderer
        ->render($sendinblue_user_register_form),
    ];
  }

  /**
   * Generate List page when log in.
   *
   * @return string
   *   A html of list page.
   */
  public function generateListLogin() {
    $access_token = $this
      ->updateAccessToken();
    return sprintf(self::SIB_URL . '/lists/index/access_token/%s', $access_token);
  }

  /**
   * Generate Campaign page when log in.
   *
   * @return string
   *   A html of campaign.
   */
  public function generateCampaignLogin() {
    $access_token = $this
      ->updateAccessToken();
    return sprintf(self::SIB_URL . '/camp/listing/access_token/%s', $access_token);
  }

  /**
   * Generate Statistic page when log in.
   *
   * @return string
   *   A html of statistic page.
   */
  public function generateStatisticLogin() {
    $access_token = $this
      ->updateAccessToken();
    return sprintf(self::SIB_URL . '/camp/message/access_token/%s', $access_token);
  }

  /**
   * Check if current state is logged in.
   *
   * @return bool
   *   A status of login of user.
   */
  public function isLoggedInState() {
    $access_key = $this
      ->getAccessKey();
    if (!empty($access_key)) {
      return TRUE;
    }
    return FALSE;
  }

  /**
   * Update access token.
   *
   * @return string
   *   An access token information.
   */
  public function updateAccessToken() {
    $config = $this->configFactory
      ->getEditable('sendinblue.settings');

    // Get new access_token.
    $access_token = $this->sendinblueMailin
      ->getAccessTokens();
    $config
      ->set(self::ACCESS_TOKEN, $access_token);
    return $access_token;
  }

  /**
   * Get email template by type.
   *
   * @param string $type
   *   A type of email.
   *
   * @return array
   *   An array of email content.
   */
  public function getEmailTemplate($type = 'test') {
    $file = 'temp';
    $file_path = drupal_get_path('module', 'sendinblue') . '/asset/email-templates/' . $type . '/';

    // Get html content.
    $html_content = file_get_contents($file_path . $file . '.html');

    // Get text content.
    $text_content = file_get_contents($file_path . $file . '.txt');
    $templates = [
      'html_content' => $html_content,
      'text_content' => $text_content,
    ];
    return $templates;
  }

  /**
   * Send mail.
   *
   * @param string $type
   *   A type of email.
   * @param string $to_email
   *   A recipe address.
   * @param string $template_id
   *   A template identification.
   */
  public function sendEmail($type, $to_email, $template_id = '-1') {
    $subjects = [
      'confirm' => $this
        ->t('Subscription confirmed'),
      'test' => $this
        ->t('[SendinBlue SMTP] test email'),
    ];
    $account_email = $this
      ->getAccountEmail();
    $account_username = $this
      ->getAccountUsername();

    // Set subject info.
    $subject = $subjects[$type] ?? '[SendinBlue]';
    $sender_email = !empty($account_email) ? $account_email : $this
      ->t('no-reply@sendinblue.com');
    $sender_name = !empty($account_username) ? $account_username : $this
      ->t('SendinBlue');

    // Get template html and text.
    $template_contents = $this
      ->getEmailTemplate($type);
    $html_content = $template_contents['html_content'];
    $text_content = $template_contents['text_content'];
    if ($type === "confirm" && $template_id !== '-1') {
      $template = $this->sendinblueMailin
        ->getTemplate($template_id);
      if ($template !== NULL) {
        $html_content = $template
          ->getHtmlContent();
        $subject = $template
          ->getSubject();
        if ($template
          ->getFromName() !== '[DEFAULT_FROM_NAME]' && $template
          ->getFromEmail() !== '[DEFAULT_FROM_EMAIL]') {
          $sender_name = $template
            ->getFromName();
          $sender_email = $template
            ->getFromEmail();
        }
      }
    }

    // Send mail.
    $replyTo = [
      'email' => $sender_email,
      'name' => $sender_name,
    ];
    $from = [
      'email' => $sender_email,
      'name' => $sender_name,
    ];
    $to = [
      'email' => $to_email,
    ];
    $base_url = $this
      ->getBaseUrl();
    $site_domain = str_replace([
      'https://',
      'http://',
    ], '', $base_url);
    $html_content = str_replace([
      '{title}',
      '{site_domain}',
    ], [
      $subject,
      $site_domain,
    ], $html_content);
    $text_content = str_replace('{site_domain}', $base_url, $text_content);
    $this->sendinblueMailin
      ->sendEmail($to, $subject, $html_content, $text_content, $from, $replyTo);
  }

  /**
   * Get Base URL.
   *
   * @return string
   *   A base url of the site.
   */
  public function getBaseUrl() {
    global $base_url;
    return $base_url;
  }

  /**
   * Get Attribute lists.
   *
   * @return \Drupal\sendinblue\Tools\Model\GetAttributesAttributes[]
   *   An array of attributes.
   */
  public function getAttributeLists() {
    $sibAttributes = $this->sendinblueMailin
      ->getAttributes();
    if (!empty($sibAttributes
      ->getAttributes())) {
      $attributes = [];
      foreach ($sibAttributes
        ->getAttributes() as $attribute) {
        if ($attribute
          ->getCategory() === 'normal') {
          $attributes[] = $attribute;
        }
      }
      return $attributes;
    }
    return [];
  }

  /**
   * Get template list.
   *
   * @return \Drupal\sendinblue\Tools\Model\GetSmtpTemplates
   *   An array of template.
   */
  public function getTemplateList() {
    return $this->sendinblueMailin
      ->getTemplates();
  }

  /**
   * Get lists.
   *
   * @return array
   *   An array of lists.
   */
  public function getLists() {
    $lists = $this->sendinblueMailin
      ->getLists();
    if ($lists !== NULL) {
      return $lists
        ->getLists();
    }
    return [];
  }

  /**
   * Get list name form id.
   *
   * @param int $list_id
   *   A list id.
   *
   * @return string
   *   A list name.
   */
  public function getListNameById($list_id) {
    $list = $this->sendinblueMailin
      ->getList($list_id);
    return $list !== NULL ? $list
      ->getName() : NULL;
  }

  /**
   * Check the email address of subscriber.
   *
   * @param string $email
   *   An email address.
   * @param string $list_id
   *   A list id.
   *
   * @return array
   *   A response information.
   */
  public function validationEmail($email, $list_id) {
    $contactInfo = $this->sendinblueMailin
      ->getUser($email);
    if ($contactInfo === NULL) {
      $ret = [
        'code' => 'success',
        'listid' => [],
      ];
      return $ret;
    }
    $listId = $contactInfo
      ->getListIds();
    if ($contactInfo
      ->isEmailBlacklisted()) {
      $ret = [
        'code' => 'update',
        'listid' => $listId,
      ];
    }
    else {
      if (!in_array($list_id, $listId)) {
        $ret = [
          'code' => 'success',
          'listid' => $listId,
        ];
      }
      else {
        $ret = [
          'code' => 'already_exist',
          'listid' => $listId,
        ];
      }
    }
    return $ret;
  }

  /**
   * Subscriber user.
   *
   * @param string $email
   *   An email address of subscriber.
   * @param array $info
   *   A data of subscriber.
   * @param array $listids
   *   An array of list id.
   */
  public function subscribeUser($email, array $info = [], array $listids = []) {
    $this->sendinblueMailin
      ->createUpdateUser($email, $info, [], $listids, NULL);
  }

  /**
   * Get subscriber data by email on drupal table.
   *
   * @param string $email
   *   An email address.
   *
   * @return string
   *   A details of subscriber.
   */
  public function getSubscriberByEmail($email) {
    $record = $this->connection
      ->select('sendinblue_contact', 'c')
      ->fields('c', [
      'email',
    ])
      ->condition('c.email', $email)
      ->execute()
      ->fetchAssoc();
    return $record;
  }

  /**
   * Add subscriber on drupal table.
   *
   * @param array $data
   *   A data to add in table.
   */
  public function addSubscriberTable(array $data = []) {
    $this->connection
      ->insert('sendinblue_contact')
      ->fields([
      'email' => $data['email'],
      'info' => $data['info'],
      'code' => $data['code'],
      'is_active' => $data['is_active'],
    ])
      ->execute();
  }

  /**
   * Update smtp details.
   *
   * @return string|bool
   *   A access token if exist, else 0.
   */
  public function updateSmtpDetails() {
    $smtpDetails = $this->sendinblueMailin
      ->getSmtpDetails();
    $config = $this->configFactory
      ->getEditable(self::CONFIG_SETTINGS_SEND_EMAIL);
    $drupalEmailconfig = $this->configFactory
      ->getEditable('system.mail');
    if (isset($smtpDetails) && $smtpDetails
      ->isEnabled()) {

      // Set SendinBlue SMTP on ON.
      $config
        ->set('sendinblue_on', 1)
        ->save();
      $config
        ->set(self::SMTP_DETAILS, Json::encode($smtpDetails))
        ->save();

      // Set DRUPAL SMTP on ON with SiB.
      $drupalEmailconfig
        ->set('interface.default', 'sendinblue_mail')
        ->save();
      return $smtpDetails;
    }

    // Set SendinBlue SMTP on OFF.
    $config
      ->set('sendinblue_on', 0)
      ->save();
    $config
      ->set(self::SMTP_DETAILS, NULL)
      ->save();

    // Set DRUPAL SMTP on OFF with SiB, reset with php_mail.
    $drupalEmailconfig
      ->set('interface.default', 'php_mail')
      ->save();
    return NULL;
  }

}

Classes

Namesort descending Description
SendinblueManager Basic manager of module.