drupal9

Enviar Correos por código en Drupal 9 y 10

Ante todo para poder hacer en envio de correos en sí deberíamos tener un servidor de correos instalado o algún módulo como SMTP.

Ahora vamos construir un módulo que envie un correo siempre que se cree un nodo de tipo evento (event). El nombre de este módulo será email_on_event_create.

  1. Para ello debemos crear nuestro clasico archivo email_on_event_create.info (este proceso será el común que siempre se hace, por lo que no entraremos en detalle).

     

  2. Ahora crearemos nuestro archivo email_on_event_create.module y dentro de él debemos poner un hook_entity_insert() en el que detectaremos cada vez que se crea un nodo del tipo evento .

    <?php
    
    /**
     * Implements hook_entity_insert().
     */
    function email_on_event_create_node_insert($node) {
      if ($node->getType() == 'event') {
    
      }
    }
  3. Luego debemos usar el servicio plugin.manager.mail en el que pondremos los datos que enviaremos utilizando la template que más adelante definiremos en el hook_mail().

    <?php
    
    /**
     * Implements hook_entity_insert().
     */
    function email_on_event_create_node_insert($node) {
      if ($node->getType() == 'event') {
        \Drupal::service('plugin.manager.mail')->mail(
    
        );  
      }
    }
  4. Ahora pondremos los datos que requiere este servicio.

    <?php
    
    /**
     * Implements hook_entity_insert().
     */
    function email_on_event_create_node_insert($node) {
      if ($node->getType() == 'event') {
      $to = user@example.com
        \Drupal::service('plugin.manager.mail')->mail(
          'email_on_event_create', //Es el nombre del módulo.
          'email_on_event_create', //Es el nombre del template que se usará en el correo, Drupal buscará dicho template en el hook_mail() ya que ahí lo definiremos más adelante.
          $to, //Es el email a donde se enviarán los correos.
          'en', //Es el langcode
          ['node' => $node, 'subject' => $subject, 'message' => $message] //aquí ponemos el subject y el message (body) del correo
        );  
      }
    }
  5. Luego vamos a usar el hook _mail() en donde definiremos el template email_on_event_create (que podría tener cualquier otro nombre) que usamos hace un momento en el servicio plugin.manager.mail.

    Además en este hook, recibiremos el subject y el message que definimos hace un momento en el servicio creado, estos valores vendrán en  la variable $params.

    /**
     * Implements hook_mail().
     */
    function email_on_event_create_mail($key, &$message, $params) {
      switch ($key) {
        case 'email_on_event_create':
          $message['subject'] = $params['subject'];
          $message['body'][] = $params['message'];
          break;
      }
    }
  6. Hasta aquí, haciendo esto Drupal usará un template simple sin que tengamos que crear nada más, pero ahora vamos a crear un template personalizado para nuestro correo en los siguientes pasos.

    Creando un template custom para enviar el correo

  7. Para nuestro ejemplo en el template que vamos a crear, vamos a pasarle sólo el message y lo haremos a través de una función custom llamada send_email_add_template_to_body().

    function send_email_add_template_to_body($message) {
      /** @var \Drupal\Core\Render\RendererInterface $renderer */
      $renderer = \Drupal::service('renderer');
      $template = [
        '#theme' => 'id_template_email',
        '#message' => $message
      ];
      return $renderer->render($template);
    }

    * En esta función vemos que estamos usando el servicio renderer al cual luego le pasamos una estructura renderizable para convertirla en un string que se enviará en el cuerpo del correo.

    * La estructura renderizable que le estamos pasando al servicio renderer es la del id del template (id_template_email) y el mensaje ($message).

  8. Ahora vamos a usar el hook_theme() para decirle cual es el nombre del template que vamos a crear y las variables que vamos a usar.

    /**
     * Implements hook_theme().
     */
    function email_on_event_create_theme() {
      return [
        'id_template_email' => [
          'template' => 'custom_template_send_email',
          'variables' => [
            'message' => NULL
          ],
        ]
      ];
    }

    * En esta estructura le estamos pasando el mismo id_template_email que pusimos en el array renderizable del paso anterior.

    * Además estamos definiendo el nombre de nuestro archivo template que crearemos luego, para nuestro caso nuestro template será custom_template_send_email.

    * Además estamos inicializando la variable message que necesitamos como null y debe tener el mismo nombre que pasamos en la función send_email_add_template_to_body(). Aquí tengamos en cuenta que incluso podría pasarle más variables y de diferentes tipos como por ejemplo arrays.

  9. Luego vamos a alterar nuestro hook_mail para que en el body del correo se envie el template que estamos definiendo, esto lo haremos pasando la función custom send_email_add_template_to_body() al body.

    /**
     * Implements hook_mail().
     */
    function email_on_event_create_mail($key, &$message, $params) {
      switch ($key) {
        case 'email_on_event_create':
          $message['subject'] = $params['subject'];
          $message['body'][] = send_email_add_template_to_body($params['message']);
          break;
      }
    }
  10. Y finalmente procederemos a crear el archivo custom_template_send_email.html.twig del template en la ruta:

    email_on_event_create/templates/custom_template_send_email.html.twig

  11. En dicho archivo procederemos a crear nuestra estructura twig y HTML deseada.

     

Me pareció interesante el artículo

Deseo más información

O también puedes comunicarte con nosotros.

por whatsapp por whatsapp

Añadir nuevo comentario

Me gustaría más información sobre:

CAPTCHA