web-dev-qa-db-ja.com

モジュールを使用しないHTMLメール

Drupal 8のMailManagerクラスを使用してHTMLメールを送信しようとしています。動作しましたが、HTMLマークアップを解析していません。何かが間違っていると思いますメールのヘッダー付き。

私が持っているのは、フォームを含み、Mailmanager::mail()メソッドでsubmitForm()を呼び出すカスタムモジュール(Custom_forward)です。これには、次のコードが含まれています。

        // Email body
        $header = $sender . ' thought you would like to see this page from the website.';
        $personal_message = $form_state->getValues()['message_body'];
        $entity_url_value = '<a href="' . $entity_url->toString() . '">Go to article</a>';
        $message = $header . '<br>' . $personal_message . '<br>' . $entity_url_value;

        // Email
        $langcode = 'en';
        $mailManager = \Drupal::service('plugin.manager.mail');
        $to = $form_state->getValues()['recipient'];

        $params['title'] = 'Forward';
        $params['message'] = $message;
        $result = $mailManager->mail('custom_forward', 'forward', $to, $langcode, $params, NULL, true);

        if ($result['result'] !== true) {
            drupal_set_message(t('There was a problem sending your message and it was not sent.'), 'error');
            \Drupal::logger('mail-log')->error($message);
        }
        else {
            drupal_set_message(t('Your message has been sent.'));
        }

Drupalによると、メッセージを送信するにはmytheme.themeにhook_mailメソッドも必要です。このメソッドはここにあります。

function custom_forward_mail($key, &$message, $params) {
  $message['body'] = [];
  $message['subject'] = [];
  $message['headers'] = array(
    'content-type' => 'text/html',
    'charset' => 'UTF-8',
    'format' => 'flowed',
    'delsp' => 'yes',
    'from' => \Drupal::config('system.site')->get('mail')
  );

  switch ($key) {
    case 'forward':
      $message['subject'] = $params['title'];
      $message['body'][] = '<html><body>' . $params['message'] . '</body></html>';
      break;
  }
}

ご覧のとおり、コンテンツタイプをtext/htmlに設定しています。これにより、メールシステムでコンテンツをHTMLとして解析するように指示されますが、これはいくつかの理由で機能しません。

これはテスト用メールです。すべてのHTMLマークアップは表示されませんが、機能しません。

Bassem thought you would like to see this page from the website. personal message Go to article [1] [1] http://myhost/node/81
3
Bassem Mohamed

モジュールがないと、HTMLメールを送信できません。これは、MailManagerクラス(プラグインマネージャ)がメールを効率的に送信するために使用するデフォルトのプラグインに次のコードが含まれているためです。 ( PhpMail.php を参照してください。)

_public function format(array $message) {

    // Join the body array into one string.
    $message['body'] = implode("\n\n", $message['body']);

    // Convert any HTML to plain-text.
    $message['body'] = MailFormatHelper::htmlToText($message['body']);

    // Wrap the mail body for sending.
    $message['body'] = MailFormatHelper::wrapMail($message['body']);
    return $message;
  }
_

コメントは明確に述べています:HTMLをプレーンテキストに変換します

MailFormatHelper::htmlToText() を見ると、HTMLマークアップをプレーンテキストに変換するコードが表示されます。特に、次のように、_<a>_タグを変更します。テストメールで。

_  // Replace inline <a> tags with the text of link and a footnote.
  // 'See <a href="https://www.drupal.org">the Drupal site</a>' becomes
  // 'See the Drupal site [1]' with the URL included as a footnote.
  static::htmlToMailUrls(NULL, TRUE);
  $pattern = '@(<a[^>]+?href="([^"]*)"[^>]*?>(.+?)</a>)@i';
  $string = preg_replace_callback($pattern, 'static::htmlToMailUrls', $string);
  $urls = static::htmlToMailUrls();
  $footnotes = '';
  if (count($urls)) {
    $footnotes .= "\n";
    for ($i = 0, $max = count($urls); $i < $max; $i++) {
      $footnotes .= '[' . ($i + 1) . '] ' . $urls[$i] . "\n";
    }
  }
_

format()メソッドの異なる実装を使用して新しいメールプラグインを定義し、MailManagerクラスがそれを使用するようにするモジュールが必要です。 MailManager::getInstance() のドキュメントで述べたように、クラスはsystem.mail.interfaceの構成を使用します。 (\Drupal::config('system.mail.interface')から返される配列)。例では、custom_forward_formardの配列値(例_'custom_forward_forward => 'custom_forward_mail'_、ここでcustom_forward_mailは、モジュールによって実装されたクラスのプラグインIDです)トリックを行います。

9
kiamlaluno

デフォルトのメールモジュールではHTMLメールを送信できませんが、ハックがあります。本文にhtml変数を割り当てる前に、PHP function htmlentitiesを使用してください。これにより、htmlタグがメッセージから削除されなくなり、htmlメールを取得できます。

$message['body'][] =  htmlentities($msg); 

これは、コアコードを変更せずにすばやくハックするためのものです。

1
Shahbaz Zafar