web-dev-qa-db-ja.com

HTMLのdrupal_mail()

カスタムモジュールから送信される送信メールをHTML形式にしたいのですが、方法がわかりません。

これは私の送信機能です:

//create an array from the companies in the db in a comma separated list
$companies = db_query("SELECT companies FROM {offer} WHERE id = $id")->fetchField();
$companies = explode(',', $companies);

// Set some variables
$from = '[email protected]';
$subject = 'Sent mail';
$module = 'mymodule';
$key = 'mykey';
$language = language_default();
$params = array();
$send = TRUE;

// the data
$question = db_query("SELECT message FROM {offer} WHERE id = $id")->fetchField();
$name = db_query("SELECT name FROM {offer} WHERE id = $id")->fetchField();
$mail = db_query("SELECT mail FROM {offer} WHERE id = $id")->fetchField();
$phone = db_query("SELECT phone FROM {offer} WHERE id = $id")->fetchField();
$compname = db_query("SELECT compname FROM {offer} WHERE id = $id")->fetchField();
$comptype = db_query("SELECT comptype FROM {offer} WHERE id = $id")->fetchField();

// Sort the companies
foreach($companies as $company) {
        $message = drupal_mail($module, $key, $company, $language, $params, $from, $send);
        // Create the mail content
        $message['subject'] = $subject;
        $message['body'] = array();
$message['body'][] = 'THe HTML MAIL HERE';

        // Retrieve the responsible implementation for this message.
        $system = drupal_mail_system($module, $key);

        // Format the message body.
        $message = $system->format($message);

        // Send e-mail.
        $message['result'] = $system->mail($message);

        // Update table where sent to 1
        $update = db_update('offer')
            ->fields(array(
            'sent' => '1',
            ))
            ->condition('id', $id, '=')
            ->execute();

        // Set message of performed action
        drupal_set_message('Done');
        $form_state['redirect'] = 'admin/content/offer';
        cache_clear_all();
}
3
Daniel Holm

drupal_mail()はデフォルトでtext/plainヘッダーを追加します。ここには3つのオプションがあります。

  1. hook_mail_alterを使用して、カスタムのtext/htmlヘッダーを追加します。
  2. ここですでに述べたカスタムの事前ビルドモジュールを使用します。
  3. MailSystemInterfaceを実装し、次のように独自のメールを送信します。
class YourMailSystem 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']);

    if ($message['module'] == 'your_module') {
        $body =  $message['body'];
        $message['body'] = array();

        // Convert any HTML to plain-text.
        $message['body']['plain'] = drupal_html_to_text($body);
        $message['body']['plain'] = drupal_wrap_mail($message['body']['plain']);

        // Wrap the mail body for sending.
        $message['body']['html'] = drupal_wrap_mail($body);
    } else {
        $message['body'] = drupal_wrap_mail($message['body']);
    }

    return $message;
}

/**
 * Send an e-mail message, using Drupal variables and default settings.
 *
 * @see <a href="http://php.net/manual/en/function.mail.php
  " title="http://php.net/manual/en/function.mail.php
  " rel="nofollow">http://php.net/manual/en/function.mail.php
  </a>   * @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();

    if ($message['module'] == 'your_module') {
        $separator = md5(time());
        // carriage return type (we use a PHP end of line constant)
        $eol = PHP_EOL;

        // main header
        $message['headers']['From'] = $message['from'];
        $message['headers']['Sender'] = $message['from'];
        $message['headers']['Return-Path'] = $message['from'];
        $message['headers']['Reply-to'] = $message['from'];
        $message['headers']['Errors-To'] = $message['from'];
        $message['headers']['Content-Type'] = "multipart/alternative; boundary=\"".$separator."\"";

        // message
        $body = "--".$separator.$eol;
        $body .= "Content-Type: text/plain; charset=\"UTF-8\"; format=\"flowed\"; delsp=\"yes\"".$eol;
        $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
        $body .= $message['body']['plain'].$eol;

        // message
        $body .= "--".$separator.$eol;
        $body .= "Content-Type: text/html; charset=\"UTF-8\"; format=\"flowed\"; delsp=\"yes\"".$eol;
        $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
        $body .= $message['body']['html'].$eol;
        $body .= "--".$separator."--";

        foreach ($message['headers'] as $name => $value) {
            $mimeheaders[] = $name . ': ' . mime_header_encode($value);
        }

        $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);

        $sendM = mail(
                $message['to'], mime_header_encode($message['subject']),
                preg_replace('@\r?\n@', $line_endings, $body),
                join("\n", $mimeheaders)
        );

        return $sendM;
    } else {
        $message['headers']['From'] = $message['from'];
        $message['headers']['Sender'] = $message['from'];
        $message['headers']['Return-Path'] = $message['from'];
        $message['headers']['Reply-to'] = $message['from'];
        $message['headers']['Errors-To'] = $message['from'];
        $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';

        if(isset($message['customMode']) && $message['customMode'] == 1) {
            $message['headers']['Content-Type'] = 'text/plain; charset=UTF-8; format=flowed; delsp=yes';
        }

        foreach ($message['headers'] as $name => $value) {
            $mimeheaders[] = $name . ': ' . mime_header_encode($value);
        }

        $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
        $heads = join("\n", $mimeheaders);

        $sendM = 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.
                $heads
        );

       return $sendM;
    }
  }
}

次に、モジュールに次のようなmailSystemの使用法を実装する必要があります。

  function hook_install() {
      variable_set('mail_system', array_merge(
                      variable_get('mail_system', array('default-system' => 'DefaultMailSystem')), // Previously set mail_system variable
                      array('your_module' => 'YourMailSystem')   // My new key(s) which ADD to the previous keys
              )
      );
  }

  function hook_uninstall() {
      // Unset module keys in variable mail_system
      $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
      unset($mail_system['your_module']);
      variable_set('mail_system', $mail_system);
  }

    function hook_mail($key, &$message, $params) {
      global $language;
        // We can define more then one email template, naming is by key
        //global $language;
        switch ($key) {
          case 'registration':
              // note: data can be passed to this function in the $params array
              $body = ''; // GET YOUR BODY CONTENT
              $subject = ''; // YOUR SUBJECT HERE

              break;
          case 'remind_pass':
              // note: data can be passed to this function in the $params array
              $body = ''; // GET YOUR BODY CONTENT
              $subject = ''; // YOUR SUBJECT HERE

              break;
        }

        $message['subject'] = $subject;
        $message['body'] = array();
        $message['body'][] = '<html><body>';
        $message['body'][] = $body;
        $message['body'][] = '</body></html>';
        return $message;
    }

このmailSystemを使用するには、次のようにモジュールからdrupal_mailを呼び出します。

drupal_mail('your_module', 'remind_pass', '[email protected]', language_default(), $params, '[email protected]', true);

注意事項:この実装は、複数の電子メールタイプ、つまり、プレーンとHTMLを一度に送信します。添付ファイルをサポートするために、これをさらに改善することもできます。

この実装は、カスタムモジュールコンテンツを探してplain/htmlとして処理します。取得されない場合は、すべてのものをデフォルトとして送信します:text/plain。

Mime Mail モジュールを試すことができます。

これはMime Mailコンポーネントモジュールです(他のモジュールで使用するため)。

  1. これにより、ユーザーはHTMLメールを受信でき、他のモジュールで使用できます。メール機能は、HTMLメッセージ本文を受け入れ、mime-endcodeして送信します。
  2. HTMLにグラフィックが埋め込まれている場合、これらのグラフィックはMIMEエンコードされ、メッセージの添付ファイルとして含まれます。
  3. テーマ設定可能なHTMLメッセージ形式でテーマのスタイルシートファイルを自動的に含めることにより、サイトのスタイルを採用します
  4. 受信者の設定が利用可能であり、プレーンテキストを好む場合、HTMLはプレーンテキストに変換され、そのまま送信されます。それ以外の場合、メールはプレーンテキストの代替を含むテーマ化可能なHTMLで送信されます。
  5. 特定のメールキーでメッセージのテーマを設定できます。
  6. CSSスタイルをインラインスタイル属性に変換します。
  7. 画像と添付ファイルが埋め込まれたHTMLメールを送信するための簡単なシステムアクションとルールアクションを提供します。
11
niksmac

私はDrupalとSwift Mailer PHPライブラリ)をつなぐ、HTML、添付ファイル、インライン画像、テーマなど。デフォルトでは、電子メールをHTMLまたはプレーンテキストとして送信するかどうかを定義できます。

現在、承認待ちですが、私は自分で本番サイトで使用しており、問題なく動作しています。 http://drupal.org/sandbox/sbrattla/1163884 をご覧ください。

5
sbrattla