Como enviar email em HTML

25

Estou criando um módulo simples que enviará emails em HTML aos usuários para ofertas em nosso site.

Pesquisei bastante, mas não consigo encontrar uma solução adequada para o Drupal. Agora posso enviar e-mails, mas com texto simples.

O que é um procedimento passo a passo para enviar emails em HTML no 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
fonte
Você não está passando a página HTML completa
GoodSp33d 31/03

Respostas:

22

Como Geoff mencionou, uma opção seria usar o módulo Mime Mail, mas você também pode ativar seu módulo personalizado para enviar e-mails em HTML com algum código extra. Em resumo, você precisaria alterar a mail_systemvariável e escrever sua própria implementação MailSystemInterface. Um exemplo disso é o seguinte 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;
  }
}

Você precisaria substituir as instâncias do mymodule pelo nome real do módulo e desativar e reativar o módulo para alterar a variável após a qual as coisas deveriam estar funcionando. Para um exemplo completo, você pode conferir minha resposta aqui . Além disso, esta página no drupal.org é de onde originalmente obtive todas as informações.

Madis
fonte
2
segui suas instruções + o exemplo completo que você deu agora está tudo funcionando ... Muito obrigado.
Mrcniceguy
7

O módulo Mime Mail é quase certamente o que você está procurando.

Este é um módulo do componente Mime Mail (para uso por outros módulos).

  • Permite que os usuários recebam emails em HTML e podem ser usados ​​por outros módulos. A funcionalidade de email aceita um corpo de mensagem HTML, codifica-o pelo mime e o envia.
  • Se o HTML tiver gráficos incorporados, esses gráficos serão codificados em MIME e incluídos como um anexo de mensagem.
  • Adota o estilo do seu site, incluindo automaticamente os arquivos de folha de estilo do seu tema em um formato de mensagem HTML programável
  • Se a preferência do destinatário estiver disponível e ele preferir texto sem formatação, o HTML será convertido em texto sem formatação e enviado como está. Caso contrário, o email será enviado em HTML utilizável com uma alternativa em texto sem formatação.
  • Permite que você tema mensagens com uma chave de correio específica.
  • Converte estilos CSS em atributos de estilo embutido.
  • Fornece ações simples do sistema e ações de regras para enviar email em HTML com imagens e anexos incorporados.
geoff
fonte
5
Eu baixei o módulo mimemail + o sistema de email ... por favor, explique para chamar a função mimemail para o meu módulo como o código acima.
mrcniceguy
3

Você também pode querer olhar para o módulo Swift Mailer. Permite enviar e-mails em HTML com anexos embutidos e regulares (como imagens ou arquivos). Além disso, também é capaz de gerar automaticamente versões de texto sem formatação com base no email em HTML.

Você pode dar uma olhada nele http://www.drupal.org/project/swiftmailer

Para constar: eu sou o autor e mantenedor do módulo.

sbrattla
fonte
2

Você não está enviando HTML adequado, inclui apenas as tags H1 e B, provavelmente precisará incluir tags 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
fonte
thx para o seu comentário, usei o exemplo @ Dooshta, também adicionei o html adequado conforme sugerido .. tudo está funcionando.
Mrcniceguy #
Tenho certeza de que não há mal algum em usar um doctype e validar completamente o HTML, mas não é necessário enviar um email em HTML pelo drupal. Acabei de remover a tag doctype & html e o email renderizado bem no Gmail e no Outlook. No entanto , é muito importante ter a correção de Dooshta em vigor: antes de implementar essas alterações, não era possível gerar nenhum html.
doub1ejack
2

Nenhuma das respostas acima funcionou para mim, então aqui está minha opinião sobre a pergunta original.

Antes de tudo, instale e ative o módulo Mime Mail . Você pode ler o arquivo README.txt para obter instruções completas sobre como usá-lo. Eu vou te dar a versão curta.

Você precisa habilitar o Mime Mail para o seu módulo. Você pode fazer isso usando hook_enableou hook_update_Nem example.install:

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

Ao acessar, admin/config/system/mailsystemvocê verá que uma nova entrada foi adicionada ao seu módulo:

Classe do módulo de exemplo (chave send_gift)

MimeMailSystem

Agora você não precisa mais especificar nenhum text/htmlcabeçalho, o Mime Mail cuida disso. Então você não precisa disso:

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

Se desejar, você pode adicionar $message['plaintext']ao seu email uma alternativa não HTML, mas isso não é necessário.

É isso aí!

Wim Mostrey
fonte