Saltar al contenido

Drupal – Cómo usar drupal_mail () para enviar correos electrónicos con plantilla personalizada

Intenta interpretar el código de forma correcta antes de usarlo a tu proyecto y si tdeseas aportar algo puedes compartirlo con nosotros.

Solución:

Si está intentando enviar los correos a través de su módulo personalizado, puede seguir la guía que se menciona a continuación. Digamos, tenía un módulo llamado “Commerce Canvas (commerce_canvas)” 1. Primero, modifique la función de correo de Drupal para admitir enlaces y agregue otros tipos de codificación


/**
 * Implements hook_mail_alter()
 * @param string $message
 */
function commerce_canvas_mail_alter(&$message) 
    $headers = array(
        'MIME-Version' => '1.0',
        'Content-Type' => 'text/html; charset=iso-8859-1; format=flowed',
        'Content-Transfer-Encoding' => '8Bit',
        'X-Mailer' => 'Drupal',
    );
    foreach ($headers as $key => $value) 
        $message['headers'][$key] = $value;
    

  1. Luego, a continuación, enganche HOOK_mail en su módulo como

/**
 * Implements hook_mail()
 * @param string $key
 * @param string $message
 * @param unknown_type $params
 */
function commerce_canvas_mail($key, &$message, $params) 

    //Language Selection
    $options = array(
        'langcode' => $message['language']->language,
    );
    switch($key) 
        case "user_payment_notification" :
            $message['subject'] = isset($params['subject']) ? $params['subject'] : $message['subject'] = t('Payment recieved @site-name', array('@site-name' => variable_get('site_name', 'Express Canvas')), $options);
            $message['body'][] = isset($params['body']) ? $params['body'] : NULL;
            if (isset($params['headers']) && is_array($params['headers'])) 
                $message['headers'] += $params['headers'];
            
            break;
    


  1. Luego, debe crear una función contenedora para invocar el correo desde su módulo.

function commerce_canvas_mail_send(array $values = array()) 
    $module = $values['module'];
    $key = $values['key'];
    $to = $values['to'];
    $from = $values['form'];
    $language = isset($values['lang']) ? $values['lang'] : language_default();
    $params = array(
        'subject' => $values['subject'],
        'body' => $values['body'],
    );
    if(array_key_exists('headers', $values)) 
        $params['headers'] = $values['headers']; //Assumed as an array
    
    $send = TRUE;
    $mail = drupal_mail($module, $key, $to, $language, $params, $from, $send);
    if($mail['result']) 
        return TRUE;
     else 
        $error_msg = 'Failed to send the email in commerce_canvas Module';
        watchdog('canvas-email', $error_msg, array(), WATCHDOG_ALERT);
        return FALSE;
    

Esta función enviará el correo electrónico y también creará mensajes de depuración si algo sucede mal. Pero aún no podrá enviar el correo HTML porque necesita extender el valor predeterminado de Drupal 7 DefaultMailSystem contigo mismo. Así que necesito hacer lo siguiente,


class CommerceCanvasMailSystem extends DefaultMailSystem 
    /**
     * Concatenate and wrap the e-mail body for plain-text mails.
     *
     * @param $message
     *   A message array, as described in hook_mail_alter().
     *
     * @return
     *   The formatted $message.
     */
    public function format(array $message) 
        $message['body'] = implode("nn", $message['body']);
        return $message;
    

    /**
     * Send an e-mail message, using Drupal variables and default settings.
     *
     * @see http://php.net/manual/en/function.mail.php
        * @see drupal_mail()
     *
     * @param $message
     *   A message array, as described in hook_mail_alter().
     * @return
     *   TRUE if the mail was successfully accepted, otherwise FALSE.
     */
    public function mail(array $message) 
        $mimeheaders = array();
        foreach ($message['headers'] as $name => $value) 
            $mimeheaders[] = $name . ': ' . mime_header_encode($value);
        
        $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
        return mail(
        $message['to'],
        mime_header_encode($message['subject']),
        // Note: e-mail uses CRLF for line-endings. PHP's API requires LF
        // on Unix and CRLF on Windows. Drupal automatically guesses the
        // line-ending format appropriate for your system. If you need to
        // override this, adjust $conf['mail_line_endings'] in settings.php.
        preg_replace('@r?[email protected]', $line_endings, $message['body']),
        // For headers, PHP's API suggests that we use CRLF normally,
        // but some MTAs incorrectly replace LF with CRLF. See #234403.
        join("n", $mimeheaders)
        );
    


A continuación, debe registrar una nueva función de tema que llamará a su archivo de plantilla personalizada en su hook_theme ().


/**
 * Implements hook_theme();
 */
function commerce_canvas_theme($existing, $type, $theme, $path) 
  if($type == 'module') 
    return array(
      'tracking_code_email' => array(
        'variables' => array(
          'image_path' => NULL,
          'user' => NULL,
          'page' => NULL,
        ),
        'template' => 'commerce-canvas-tracking-code',
        'path' => drupal_get_path('module', 'commerce_canvas').'/theme',
      ),

    );
  

Por último, debe llamar a esta función de tema en el momento de enviar el correo electrónico como,



function a_custom_function($params) 

$email_text_user = theme('tracking_code_email', array(
                    'image_path' => $base_url . '/' . drupal_get_path('module', 'commerce_canvas') . '/images',
                    'user' => null,
                    'page' => array(
                        'greet_text' => t('Thank you for your order at Express Canvas. Your order is ready and has shipped. You may track your order using FedEx tracking with your tracking number: '.$order->field_tracking_number['und']['0']['value'].''),

                    ),
                ));
$sent_to_user = commerce_canvas_mail_send($email_values_user);


Estos son el fragmento completo para manejar el correo electrónico HTML correctamente en Drupal 7, por lo que en el hook_theme puede proporcionar su plantilla personalizada.

Si desea crear un tema para los correos electrónicos salientes con la ayuda de plantillas personalizadas, debe usar el módulo Correo HTML.

Te permite crear un tema para tus mensajes de la misma manera que el tema del resto de tu sitio web.

Funciona bien con otros módulos, como Print, Mail mime, etc.

Tiene que instalar el módulo del sistema de correo para poder utilizar el correo HTML.

Uso de ejemplo:

    $module = 'module_name';
    $key = 'key';
    $language = language_default();
    $params = array();
    $from = NULL;
    $send = FALSE;
    $message = drupal_mail($module, $key, $email, $language, $params, $from, $send);

    $message['subject'] = $subject;
    $message['body'] = array();
    $message['body'][] = $line1;
    $message['body'][] = $line2;

    // Retrieve the responsible implementation for this message.
    $system = drupal_mail_system($module, $key);

    // Format the message body.
    $message = $system->format($message);

    // Send e-mail.
    $message['result'] = $system->mail($message);

Puntuaciones y reseñas

Recuerda que puedes permitirte agregar una reseña si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *