Jak wysłać wiadomość e-mail w formacie HTML

25

Tworzę prosty moduł, który będzie wysyłał użytkownikom wiadomości e-mail w formacie HTML w celu znalezienia okazji w naszej witrynie.

Dużo szukałem, ale nie mogę znaleźć rozwiązania odpowiedniego dla Drupala. Teraz mogę wysyłać maile, ale zwykły tekst.

Co to jest krok po kroku procedura wysyłania e-maili HTML w 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
źródło
Nie przekazujesz pełnej strony HTML
GoodSp33d

Odpowiedzi:

22

Podobnie jak wspomniany przez Geoffa, jedną z opcji byłoby użycie modułu Poczta Mime, ale możesz także włączyć moduł niestandardowy, aby wysyłał wiadomości e-mail w formacie HTML z dodatkowym kodem. Krótko mówiąc, musisz zmienić mail_systemzmienną i napisać własną implementację MailSystemInterface. Przykładem tego jest następujący kod.

Wewnątrz „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);
}

Wewnątrz „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;
  }
}

Będziesz musiał zastąpić instancje wielu modułów rzeczywistą nazwą modułu, a następnie wyłączyć i ponownie włączyć moduł, aby zmienić zmienną, po której wszystko powinno działać. Aby uzyskać pełny przykład, możesz sprawdzić moją odpowiedź tutaj . Dodatkowo, ta strona na drupal.org pochodzi z której pierwotnie otrzymałem wszystkie informacje.

Madis
źródło
2
postępowałem zgodnie z instrukcjami + kompletny przykład, który dałeś teraz wszystko działa ... Dziękuję bardzo.
mrcniceguy,
7

Moduł Mime Mail jest prawie na pewno tym, czego szukasz.

Jest to moduł komponentu Mime Mail (do użytku przez inne moduły).

  • Umożliwia użytkownikom odbieranie wiadomości e-mail w formacie HTML i może być używany przez inne moduły. Funkcja poczty akceptuje treść wiadomości HTML, koduje mime i wysyła ją.
  • Jeśli HTML ma osadzoną grafikę, są one kodowane w formacie MIME i dołączane jako załącznik do wiadomości.
  • Przyjmuje styl witryny, automatycznie dołączając pliki arkusza stylów motywu do motywacyjnego formatu wiadomości HTML
  • Jeśli preferencje odbiorcy są dostępne i wolą zwykły tekst, HTML zostanie przekonwertowany na zwykły tekst i wysłany w niezmienionej postaci. W przeciwnym razie wiadomość e-mail zostanie wysłana w formacie HTML z tekstem alternatywnym.
  • Umożliwia motywowanie wiadomości za pomocą określonego klucza pocztowego.
  • Konwertuje style CSS na wbudowane atrybuty stylu.
  • Zapewnia proste akcje systemowe i akcje reguł do wysyłania wiadomości e-mail HTML z osadzonymi obrazami i załącznikami.
geoff
źródło
5
pobrałem moduł mimemail + system poczty ... proszę o wyjaśnienie, jak wywołać funkcję mimemail do mojego modułu jako powyższy kod.
mrcniceguy
3

Możesz także zajrzeć do modułu Swift Mailer. Umożliwia wysyłanie wiadomości e-mail w formacie HTML z dołączonymi i zwykłymi załącznikami (takimi jak obrazy lub pliki). Ponadto jest w stanie automatycznie generować wersje zwykłego tekstu na podstawie wiadomości e-mail w formacie HTML.

Możesz na to spojrzeć http://www.drupal.org/project/swiftmailer

Dla przypomnienia: jestem autorem i opiekunem modułu.

sbrattla
źródło
2

Nie wysyłasz prawidłowego kodu HTML, dołączasz tylko tagi H1 i tagi B, prawdopodobnie musisz także dołączyć tagi Full HTML, zaczynając od
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

GoodSp33d
źródło
dzięki za komentarz, użyłem @Dooshta, dodałem również odpowiedni HTML jak sugerowałeś .. wszystko działa.
mrcniceguy,
Jestem pewien, że korzystanie z doctype i pełnego sprawdzania poprawności HTML nie jest szkodliwe, ale nie jest wymagane wysyłanie wiadomości e-mail w formacie HTML przez Drupal. Właśnie usunąłem tag doctype & html oraz e-mail dobrze renderowany w Gmailu i Outlooku. Jednak bardzo ważna jest poprawka Dooshty: zanim zaimplementowałem te zmiany, nie byłem w stanie wygenerować żadnego HTML.
doub1ejack
2

Żadna z powyższych odpowiedzi nie działała dla mnie, więc oto moje zdanie na temat pierwotnego pytania.

Przede wszystkim zainstaluj i włącz moduł Mime Mail . Możesz przeczytać plik README.txt aby uzyskać pełne instrukcje korzystania z niego. Dam ci krótką wersję.

Musisz włączyć Mime Mail dla swojego modułu. Możesz to zrobić za pomocą hook_enablelub hook_update_Nw example.install:

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

Gdy przejdziesz do admin/config/system/mailsystemstrony, zobaczysz, że dodano nowy wpis do Twojego modułu:

Przykładowa klasa modułu (klucz send_gift)

MimeMailSystem

Teraz nie musisz text/htmljuż określać żadnych nagłówków, Mime Mail dba o to. Więc nie potrzebujesz tego:

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

Jeśli chcesz, możesz dodać $message['plaintext']do swojej poczty alternatywę inną niż HTML, ale nie jest to wymagane.

To jest to!

Wim Mostrey
źródło