drupal_mail () loại bỏ tất cả các thẻ html khỏi email


7

Vì vậy, như tiêu đề giải thích, khi gửi email HTML bằng drupal_mail (), email không có thẻ HTML.

    $module = 'module';
    $key = 'contact_message';
    $language = language_default();
    $params = array();
    $email = 'sender@email.com';
    $from = variable_get('site_mail', 'admin@example.com');
    $send = TRUE;
    $message = drupal_mail($module, $key, $email, $language, $params, $from, $send);
    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8';
    $message['subject'] = 'Test';
    $message['body'] = array();
    $message['body'][] = '<a href="#">Testing anchor in mail</a>';
    $system = drupal_mail_system($module, $key);
    $message = $system->format($message);
    $message['result'] = $system->mail($message);

Và khi nhận email, và xem nguồn:

Message-Id: <201305090722.r497MLAV005654@test.server>
X-Authentication-Warning: testserver : www-data set sender to sender@email.com using -f
To: from@email.com
Subject: Test
X-PHP-Originating-Script: 1000:system.mail.inc
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8Bit
X-Mailer: Drupal
Sender: sender@email.com
From: from@email.com

Testing anchor in mail [1]

[1] #

Vì vậy, bạn có thể thấy rằng bất kỳ thẻ HTML đã bị tước. Và nó không quan trọng những thẻ HTML nào tôi đặt trong cơ thể.

Tôi nghĩ rằng nó có thể liên quan đến Text Fomats, nhưng tôi có các bộ lọc hoạt động "Đã lọc HTML" và "Full HTML" với bất kỳ quyền nào.


Điều làm tôi bối rối là hóa đơn Ubercart. Lúc đầu, chúng được gửi bằng HTML, và rồi đến một lúc nào đó nó dừng lại. Họ đã nhận được văn bản đơn giản. Sau khi đào một câu trả lời @develkar, tôi đã tìm thấy điều này trong một trong các bản cập nhật ubercart:

/**
 * Installs HTML Mail System for Ubercart.
 */
function uc_store_update_7004() {
  // Set mail handler for all Ubercart modules
  variable_set('mail_system',
    array_merge(
      variable_get('mail_system', array('default-system' => 'DefaultMailSystem')),
      array(
        'uc_cart'  => 'UbercartMailSystem',
        'uc_order' => 'UbercartMailSystem',
        'uc_file'  => 'UbercartMailSystem',
        'uc_roles' => 'UbercartMailSystem',
        'uc_stock' => 'UbercartMailSystem',
        'uc_store' => 'UbercartMailSystem',
      )
    )
  );
}

Tôi đoán rằng tại một số điểm, một trong các mô-đun đã cài đặt (tôi nghi ngờ mô-đun SMTP) đã ghi đè biến này và đó là lý do tại sao các email đến văn bản đơn giản. Sau khi chạy lại bản cập nhật này một cách thủ công, hóa đơn Ubercat lại là HTML.

Đối với phần còn lại của email, tôi sẽ phải cài đặt một số mô-đun như được đề xuất trong các câu trả lời khác.

Thanx.

Câu trả lời:


10

drupal_mail () , theo mặc định sẽ gửi thư dưới dạng văn bản thuần túy.

Nếu bạn in ra mảng $message['headers'], bạn sẽ nhận được một cái gì đó như:

array(
    'MIME-Version' => '1.0',
    'Content-Type' => 'text/plain; charset=UTF-8; format=flowed; delsp=yes',
    'Content-Transfer-Encoding' => '8Bit',
    'X-Mailer' => 'Drupal',
  );

Như bạn có thể thấy, Content-Typetiêu đề trong thư là text/plain; charset=UTF-8; format=flowed; delsp=yes. Bạn có thể thử bằng cách sửa đổi tiêu đề này trong hook_mail_alter () , bạn có thể sử dụng một trong các mô-đun cho phép bạn gửi thư dưới dạng HTML, như HTML Mail hoặc Mime Mail .

Biên tập:

Theo dõi các bình luận của @Ayesh và @alechko và sau khi xem xét các API, tôi phát hiện ra rằng các tiêu đề không phải là lý do duy nhất để gửi thư dưới dạng văn bản thuần túy. Bởi vì drupal_mail()bên trong thực hiện cuộc gọi đến drupal_mail_system () , trả về một đối tượng thực hiện giao diện MailSystemInterface . Các format()phương pháp thực hiện bởi drupal_mail_system()có trách nhiệm tước ra HTML từ email. Vì vậy, ngay cả khi các tiêu đề của thư hiển thị các định dạng là HTML, các thư sẽ chỉ được gửi dưới dạng văn bản thuần túy. Vì vậy, tôi đoán người ta không thể gửi thư HTML bằng cách sử dụng drupal_mail(). Bạn nên tìm kiếm một số thay thế (mô-đun) khác được đề cập ở trên.


Mặc dù bạn đã đặt ctype, Drupal sẽ loại bỏ tất cả các thẻ HTML trong bước chuẩn bị (không thể nhớ tên phương thức).
AyeshK

Nếu bạn nhìn vào đầu ra của thư nhận được, bạn sẽ thấy: Loại nội dung: văn bản / html; bộ ký tự = UTF-8
alechko

@AyeshK Bạn nói đúng. Tôi đã thực hiện chỉnh sửa, chức năng chịu trách nhiệm tước HTML là drupal_mail_sytem().
AjitS

@alechko Xin vui lòng xem để chỉnh sửa.
AjitS

Cảm ơn @develkar :). Trên thực tế, thay đổi tiêu đề thực hiện thủ thuật trong D6 và gần đây tôi đã phải tạo một lớp thư tùy chỉnh để xử lý các email HTML. Vẫn đang sử dụng drupal_mail và chỉ ghi đè các phương thức kết xuất.
AyeshK

3

Trong hook_mail cũng vậy, bạn có thể xác định các tiêu đề là văn bản / html, sau đó bạn sẽ nhận được thư dưới dạng định dạng html, ví dụ:

$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';

2

Hãy thử với mô-đun HTML Mail được cài đặt và định cấu hình.

Cho phép bạn chủ đề tin nhắn của bạn giống như cách bạn chủ đề phần còn lại của trang web của bạn.


Tôi đã thử và nó đã hoạt động, nhưng tôi đang tìm giải pháp gốc, bởi vì trước đây, cùng một cài đặt đã gửi email HTML và sau một thời gian tôi nhận thấy rằng các email đã bị xóa. Tôi không có "mô-đun trợ giúp" trong quá khứ.
alechko

0

Không quan trọng Tiêu đề Kiểu nội dung là gì, hệ thống thư mặc định của Drupal chuyển đổi html thành văn bản thuần túy. Xem DefaultMailSystem :: format () trong mail.inc

<?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'] = drupal_html_to_text($message['body']);
// Wrap the mail body for sending.
$message['body'] = drupal_wrap_mail($message['body']);
return $message;

}

Để gửi cho phép html trong phần thân thông điệp, bạn sẽ cần:

  1. tạo một lớp hệ thống thư tùy chỉnh thực hiện MailSystemInterface có phương thức định dạng không chuyển đổi html thành văn bản thuần túy
  2. Bao gồm lớp mới đó trong tệp mô-đun.info của bạn
  3. Cho Drupal biết bạn muốn sử dụng lớp hệ thống thư tùy chỉnh của bạn

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

  4. Đặt tiêu đề Kiểu nội dung từ "text / plain" thành "html / plain"

    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';

Tài liệu này về làm tốt công việc mô tả giải pháp và cung cấp một ví dụ.

https://www.drupal.org/docs/7/converting-drupal-6-modules-to-drupal-7/creating-html-formatted-emails-in-drupal-7#comment-11792179


Điều này có vẻ khả thi. Có thể chuyển đổi mail_system chỉ trong một số lần cụ thể, như trong trình xử lý gửi biểu mẫu web chỉ cho một số biểu mẫu web không?
phổ biến
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.