1

I want to allow other text formats on the /contact form than just plain text. I haven't been able to find a module that does this. Is it possible to do this in D7?

1

You have two solutions one is

  1. https://www.drupal.org/project/htmlmail - html mail module especially for html mails

  2. you have to customize the drupal_mail function to accept html

https://www.drupal.org/node/900794

https://www.drupal.org/node/224333#email-html

below is the sample:

Since Drupal 7 automatically converts all HTML emails to plain text before sending them (http://drupal.org/node/224333#email-html), you must now write your own implementation of MailSystemInterface and set a variable telling Drupal to use it in order to send HTML emails. Here is the class which needs to go in your module:

<?php
/**
 * Modify the drupal mail system to send HTML emails.
 */
class ExampleMailSystem implements MailSystemInterface {
  /**
   * 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("\n\n", $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?\n@', $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)
    );
  }
}
?>

Rename the class for your module (i.e. ForwardMailSystem). Then, you need to set the mail_system variable:

<?php
variable_set('mail_system', array('default-system' => 'ExampleMailSystem'));
?>

If you wish to have only emails from your module be sent in HTML but leave all others untouched, use this code:

<?php
variable_set('mail_system', array('default-system' => 'DefaultMailSystem', 'example' => 'ExampleMailSystem'));
?>

That code can go in your module's install file in hook_install to set that variable as soon as your module is enabled. Make sure to also set the variable back to the default in hook_uninstall.

3
  • The text input on /contact does not currently have a dropdown to change text formats. I've seen your answer elsewhere regarding the email system accepting HTML, but this doesn't address allowing different text format selections in the form itself.
    – Allen
    Mar 2 '15 at 14:11
  • you want to sent html mail right if i believe i understand correct :) Mar 2 '15 at 14:15
  • First sentence of the question: "I want to allow other text formats on the /contact form than just plain text."
    – Allen
    Mar 2 '15 at 14:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.