Come inviare e-mail HTML


25

Sto creando un semplice modulo che invierà e-mail HTML agli utenti per le offerte sul nostro sito Web.

Ho cercato molto, ma non riesco a trovare una soluzione adeguata per Drupal. Ora posso inviare mail ma testo semplice.

Che cos'è una procedura dettagliata per inviare e-mail HTML in Drupal 7?

function example_form_submit( $form,&$form_state) {
    $friend_email=$form_state['values']['friend_email'];
    $mailto =$friend_email;  //gift to a friend
    $mailfrom ='no-reply@example.com';
    $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;
    }
}

Non stai passando la pagina HTML completa
GoodSp33d

Risposte:


22

Come Geoff ha menzionato, un'opzione sarebbe quella di utilizzare il modulo Mime Mail, ma puoi anche abilitare il tuo modulo personalizzato per inviare e-mail HTML con qualche codice aggiuntivo. In breve, dovresti modificare la mail_systemvariabile e scrivere la tua implementazione di MailSystemInterface. Un esempio è il seguente codice.

All'interno di "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);
}

All'interno di "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;
  }
}

Dovresti sostituire le istanze di mymodule con il nome del tuo modulo attuale, quindi disabilitare e riattivare il modulo per far cambiare la variabile dopo la quale le cose dovrebbero funzionare. Per un esempio completo puoi consultare la mia risposta qui . Inoltre questa pagina su drupal.org è da dove originariamente ho ricevuto tutte le informazioni.


2
ho seguito le tue istruzioni + l'esempio completo che hai dato ora tutto funziona ... Grazie mille.
mrcniceguy,

7

Il modulo Mime Mail è quasi sicuramente quello che stai cercando.

Questo è un modulo componente Mime Mail (per l'utilizzo da parte di altri moduli).

  • Consente agli utenti di ricevere e-mail HTML e può essere utilizzato da altri moduli. La funzionalità di posta elettronica accetta un corpo di messaggio HTML, lo mime-codifica e lo invia.
  • Se l'HTML ha una grafica incorporata, questa grafica è codificata MIME e inclusa come allegato al messaggio.
  • Adotta lo stile del tuo sito includendo automaticamente i file del foglio di stile del tuo tema in un formato di messaggio HTML tematico
  • Se la preferenza del destinatario è disponibile e preferisce il testo normale, l'HTML verrà convertito in testo normale e inviato così com'è. Altrimenti, l'e-mail verrà inviata in HTML tematico con un'alternativa in chiaro.
  • Consente di inviare messaggi a tema con una chiave di posta specifica.
  • Converte gli stili CSS in attributi di stile incorporati.
  • Fornisce semplici azioni di sistema e azioni di regole per inviare e-mail HTML con immagini e allegati incorporati.

5
ho scaricato il modulo mimemail + sistema di posta ... sarai gentile a spiegare per favore di chiamare la funzione mimemail al mio modulo come il codice sopra.
mrcniceguy,

3

Potresti anche voler guardare il modulo Swift Mailer. Ti consente di inviare e-mail HTML con allegati sia in linea che regolari (come immagini o file). Inoltre, è anche in grado di generare automaticamente versioni di testo normale basate sull'e-mail HTML.

Puoi dare un'occhiata a http://www.drupal.org/project/swiftmailer

Per la cronaca: sono l'autore e il manutentore del modulo.


2

Non stai inviando HTML corretto, stai includendo solo tag H1 e tag B, probabilmente dovrai includere anche tag HTML completi a partire da
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


grazie per il tuo commento, ho usato l'esempio @Dooshta, ho anche aggiunto l'html corretto come hai suggerito .. tutto funziona.
mrcniceguy,

Sono sicuro che non c'è nulla di male nell'usare un doctype e nel validare completamente l'HTML, ma non è necessario inviare una email HTML tramite drupal. Ho appena rimosso il tag doctype & html e l'email resa bene in Gmail e Outlook. Tuttavia , è molto importante disporre della correzione di Dooshta: prima di implementare quelle modifiche non sono stato in grado di generare alcun HTML.
doub1ejack,

2

Nessuna delle risposte sopra ha funzionato per me, quindi ecco la mia opinione sulla domanda originale.

Prima di tutto, installa e abilita il modulo Mime Mail . Puoi leggere il file README.txt per le istruzioni complete su come usarlo. Ti darò la versione breve.

Devi abilitare Mime Mail per il tuo modulo. Puoi farlo usando hook_enableo hook_update_Nin example.install:

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

Quando vai a admin/config/system/mailsystem, vedrai che è stata aggiunta una nuova voce per il tuo modulo:

Classe del modulo di esempio (chiave send_gift)

MimeMailSystem

Ora non hai più bisogno di specificare alcuna text/htmlintestazione, Mime Mail se ne occupa. Quindi non è necessario questo:

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

Se lo desideri, puoi aggiungerlo $message['plaintext']alla tua posta per un'alternativa non HTML, ma non è necessario.

Questo è tutto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.