Cómo enviar correos electrónicos HTML

25

Estoy creando un módulo simple que enviará correos electrónicos HTML a los usuarios para ofertas en nuestro sitio web.

He buscado mucho, pero no puedo encontrar una solución adecuada para Drupal. Ahora puedo enviar correos pero texto sin formato.

¿Qué es un procedimiento paso a paso para enviar correos electrónicos HTML en Drupal 7?

function example_form_submit( $form,&$form_state) {
    $friend_email=$form_state['values']['friend_email'];
    $mailto =$friend_email;  //gift to a friend
    $mailfrom ='[email protected]';
    $subject = "another message for  HTML email from example.com";
    $body="<h2 style='font-size:28px;color:red;'>Hello EMAIL, i here i want to be <b>bolded</b></h2>";
    if (drupal_mail('example', 'send_gift', $mailto, language_default(),$params,$mailfrom,TRUE)) {
        drupal_set_message(t('Your gift was sent successfully!!!'));
    }
    else {
        drupal_set_message(t('<font color="red">Error occured while sending your mail!!!</font>'));
    }


/****hook_mail*/
function example_mail($key,&$message,$params) {
    $language = $message['language'];
    switch ($key) {
        case 'send_gift':
            $message['subject']=t($params['subject'], $var, $language->language);
            $message['body'][]=$params['body'];
            $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
        break;
    }
}
mrcniceguy
fuente
No está pasando la página HTML completa
GoodSp33d

Respuestas:

22

Como mencionó geoff, una opción sería usar el módulo Mime Mail, pero también puede habilitar su módulo personalizado para enviar correos electrónicos HTML con algún código adicional. En resumen, necesitaría alterar la mail_systemvariable y escribir su propia implementación de MailSystemInterface. Un ejemplo de eso es el siguiente código.

Dentro de 'mymodule.install':

function mymodule_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('mymodule' => 'MymoduleMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function mymodule_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['mymodule']);
  variable_set('mail_system', $mail_system);
}

Dentro de 'mymodule.module':

class MymoduleMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

Tendría que reemplazar las instancias de mymodule con el nombre de su módulo real y luego deshabilitar y volver a habilitar su módulo para cambiar la variable después de lo cual las cosas deberían estar funcionando. Para ver un ejemplo completo, puede consultar mi respuesta aquí . Además, esta página en drupal.org es de donde originalmente obtuve toda la información.

Madis
fuente
2
Seguí tus instrucciones + el ejemplo completo que diste ahora todo funciona ... Muchas gracias.
mrcniceguy
7

El módulo Mime Mail es casi seguro lo que está buscando.

Este es un módulo componente de Mime Mail (para uso de otros módulos).

  • Permite a los usuarios recibir correo electrónico HTML y puede ser utilizado por otros módulos. La funcionalidad de correo acepta un cuerpo de mensaje HTML, mime lo codifica y lo envía.
  • Si el HTML tiene gráficos incrustados, estos gráficos están codificados con MIME y se incluyen como un mensaje adjunto.
  • Adopta el estilo de su sitio al incluir automáticamente los archivos de hoja de estilo de su tema en un formato de mensaje HTML con tema
  • Si la preferencia del destinatario está disponible y prefieren texto sin formato, el HTML se convertirá en texto sin formato y se enviará tal cual. De lo contrario, el correo electrónico se enviará en HTML con temas con una alternativa de texto sin formato.
  • Le permite enviar mensajes de tema con una clave de correo específica.
  • Convierte estilos CSS en atributos de estilo en línea.
  • Proporciona acciones simples del sistema y acciones de Reglas para enviar correo electrónico HTML con imágenes incrustadas y archivos adjuntos.
Geoff
fuente
55
He descargado el módulo mimemail + sistema de correo ... ¿será amable de explicar por favor llamar a la función mimemail a mi módulo como el código anterior?
mrcniceguy
3

También es posible que desee ver el módulo Swift Mailer. Le permite enviar correos electrónicos HTML con archivos adjuntos regulares y en línea (como imágenes o archivos). Además, también es capaz de generar automáticamente versiones de texto sin formato basadas en el correo electrónico HTML.

Puedes echarle un vistazo http://www.drupal.org/project/swiftmailer

Para el registro: soy el autor y mantenedor del módulo.

sbrattla
fuente
2

No está enviando HTML adecuado, solo está incluyendo etiquetas H1 y B, probablemente también necesite incluir etiquetas HTML completas a partir de
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

GoodSp33d
fuente
Gracias por tu comentario, utilicé el ejemplo de @Dooshta, también agregué el html adecuado como sugeriste ... todo está funcionando.
mrcniceguy 03 de
Estoy seguro de que no hay ningún daño en usar un doctype y validar completamente HTML, pero no es necesario enviar un correo electrónico HTML a través de drupal. Acabo de eliminar la etiqueta doctype y html y el correo electrónico se procesó bien en Gmail y Outlook. Sin embargo , es muy importante tener la solución de Dooshta: antes de implementar esos cambios no pude generar ningún html.
doub1ejack
2

Ninguna de las respuestas anteriores funcionó para mí, así que aquí está mi opinión sobre la pregunta original.

En primer lugar, instale y habilite el módulo Mime Mail . Puede leer el archivo README.txt para obtener instrucciones completas sobre cómo usarlo. Te daré la versión corta.

Debe habilitar Mime Mail para su módulo. Puedes hacer esto usando hook_enableo hook_update_Nen example.install:

function example_enable() {
  mailsystem_set(array(
    'example_send_gift' => 'MimeMailSystem',
  ));
}

Cuando vaya a admin/config/system/mailsystem, verá que se ha agregado una nueva entrada para su módulo:

Clase de módulo de ejemplo (tecla send_gift)

MimeMailSystem

Ahora ya no necesita especificar ningún text/htmlencabezado, Mime Mail se encarga de esto. Entonces no necesitas esto:

$message['headers']['Content-Type'] = ...

Si lo desea, puede agregar $message['plaintext']a su correo una alternativa que no sea HTML, pero esto no es obligatorio.

¡Eso es!

Wim Mostrey
fuente