*/ class EmailApiController extends CommonApiController { use LeadAccessTrait; /** * @var EmailModel|null */ protected $model; /** * @var array */ protected $extraGetEntitiesArguments = ['ignoreListJoin' => true]; public function __construct(CorePermissions $security, Translator $translator, EntityResultHelper $entityResultHelper, RouterInterface $router, FormFactoryInterface $formFactory, AppVersion $appVersion, RequestStack $requestStack, ManagerRegistry $doctrine, ModelFactory $modelFactory, EventDispatcherInterface $dispatcher, CoreParametersHelper $coreParametersHelper, MauticFactory $factory) { $emailModel = $modelFactory->getModel('email'); \assert($emailModel instanceof EmailModel); $this->model = $emailModel; $this->entityClass = Email::class; $this->entityNameOne = 'email'; $this->entityNameMulti = 'emails'; $this->serializerGroups = ['emailDetails', 'categoryList', 'publishDetails', 'assetList', 'formList', 'leadListList']; $this->dataInputMasks = [ 'customHtml' => 'html', 'dynamicContent' => [ 'content' => 'html', 'filters' => [ 'content' => 'html', ], ], ]; parent::__construct($security, $translator, $entityResultHelper, $router, $formFactory, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper, $factory); } /** * Obtains a list of emails. * * @return Response */ public function getEntitiesAction(Request $request, UserHelper $userHelper) { // get parent level only $this->listFilters[] = [ 'column' => 'e.variantParent', 'expr' => 'isNull', ]; return parent::getEntitiesAction($request, $userHelper); } /** * Sends the email to it's assigned lists. * * @param int $id Email ID * * @return Response * * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public function sendAction(Request $request, $id) { $entity = $this->model->getEntity($id); if (null === $entity || !$entity->isPublished()) { return $this->notFound(); } if (!$this->checkEntityAccess($entity)) { return $this->accessDenied(); } $lists = $request->request->all()['lists'] ?? []; $limit = $request->request->get('limit', null); $batch = $request->request->get('batch', null); [$count, $failed] = $this->model->sendEmailToLists($entity, $lists, $limit, $batch); $view = $this->view( [ 'success' => 1, 'sentCount' => $count, 'failedRecipients' => $failed, ], Response::HTTP_OK ); return $this->handleView($view); } /** * Sends the email to a specific lead. * * @param int $id Email ID * @param int $leadId Lead ID * * @return Response * * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public function sendLeadAction(Request $request, $id, $leadId) { $entity = $this->model->getEntity($id); if (!$entity) { return $this->notFound(); } if (!$this->checkEntityAccess($entity)) { return $this->accessDenied(); } /** @var Lead $lead */ $lead = $this->checkLeadAccess($leadId, 'edit'); if ($lead instanceof Response) { return $lead; } $post = $request->request->all(); $tokens = (!empty($post['tokens'])) ? $post['tokens'] : []; $assetsIds = (!empty($post['assetAttachments'])) ? $post['assetAttachments'] : []; $response = ['success' => false]; $cleanTokens = []; foreach ($tokens as $token => $value) { $value = InputHelper::html($value); if (!preg_match('/^{.*?}$/', $token)) { $token = '{'.$token.'}'; } $cleanTokens[$token] = $value; } $leadFields = array_merge(['id' => $leadId], $lead->getProfileFields()); // Set owner_id to support the "Owner is mailer" feature if ($lead->getOwner()) { $leadFields['owner_id'] = $lead->getOwner()->getId(); } $result = $this->model->sendEmail( $entity, $leadFields, [ 'source' => ['api', 0], 'tokens' => $cleanTokens, 'assetAttachments' => $assetsIds, 'return_errors' => true, 'ignoreDNC' => true, 'email_type' => MailHelper::EMAIL_TYPE_TRANSACTIONAL, ] ); if (is_bool($result)) { $response['success'] = $result; } else { $response['failed'] = $result; } $view = $this->view($response, Response::HTTP_OK); return $this->handleView($view); } /** * @param string $trackingHash * * @return Response */ public function replyAction(Reply $replyService, RandomHelperInterface $randomHelper, $trackingHash) { try { $replyService->createReplyByHash($trackingHash, "api-{$randomHelper->generate()}"); } catch (EntityNotFoundException $e) { return $this->notFound($e->getMessage()); } return $this->handleView( $this->view(['success' => true], Response::HTTP_CREATED) ); } protected function prepareParametersFromRequest(FormInterface $form, array &$params, object $entity = null, array $masks = [], array $fields = []): void { if (isset($params['publicPreview']) && $entity instanceof Email) { $entity->setPublicPreview(InputHelper::boolean($params['publicPreview']) ?? false); unset($params['publicPreview']); } parent::prepareParametersFromRequest($form, $params, $entity, $masks, $fields); } }