Điểm:0

hook_mail_alter() không xóa các tiêu đề Return-Path, Sender và Reply-To

lá cờ us

tôi muốn loại bỏ các Đường dẫn trở lại, Người gửi, và Trả lời tiêu đề từ các email đã gửi. Tôi đang cố gắng đạt được điều này bằng mã sau, nhưng các tiêu đề không bị xóa khỏi email.

function mymodule_mail_alter(&$message) {
  unset($message['headers']['Return-Path']);
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}

Tôi đang làm gì sai?

lá cờ fr
Còn rất nhiều điều chưa nói... chẳng hạn như (các) plugin @Mail bạn đang sử dụng.
lá cờ us
Chúng tôi đang sử dụng trình gửi thư PHP mặc định của Drupal 8 và mô-đun SMTP. Chúng tôi đang cố kích hoạt Thư kiểm tra thông qua mô-đun SMTP sau khi nhập thông tin đăng nhập. Nhưng có vẻ như chúng tôi không thể sửa đổi các tiêu đề từ hook_mail_alter
imclean avatar
lá cờ my
Tại sao chỉnh sửa của tôi bị từ chối? Nhận xét của @ secretsayan ở trên bổ sung thông tin cần thiết nên có trong câu hỏi. Nó thu hẹp nó xuống mô-đun SMTP thay vì chỉ lõi Drupal.
Điểm:1
lá cờ us

Xóa các giá trị khỏi $message['headers'] là không đủ, vì plugin được sử dụng để gửi email cũng có thể sử dụng $message['Đường dẫn trả về'], $message['Người gửi'], hoặc $message['Trả lời'] giá trị để xây dựng các tiêu đề email. Lớp được sử dụng làm plugin mặc định để gửi email, PhpMail sử dụng mã sau đây, nhưng các plugin khác có thể sử dụng mã khác.

$site_mail = $this->configFactory->get('system.site')->get('mail');
$additional_headers = isset($message['Return-Path']) && ($site_mail === $message['Return-Path'] || static::_isShellSafe($message['Return-Path'])) ? '-f' . $message['Đường dẫn trả về'] : '';
$mail_result = @mail($message['to'], $mail_subject, $mail_body, $mail_headers, $additional_headers);

Vì plugin email được sử dụng để gửi email sau khi hook_mail_alter() triển khai được gọi và vì plugin email có thể thêm một trong các tiêu đề đó theo quyết định của nó, nên không có bất kỳ bảo đảm nào rằng email được gửi mà không có các tiêu đề đó. Giả sử plugin email chỉ thêm những tiêu đề đó khi tin nhắn $ hoặc $message['headers'] chứa một giá trị cho chúng, đoạn mã sau sẽ hoạt động.

function mymodule_mail_alter(&$message) {
  unset($message['Return-Path']);
  unset($message['Sender']);
  unset($message['Reply-To']);
  unset($message['headers']['Return-Path']);
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}
lá cờ fr
Tôi muốn nói thêm rằng RFC cho biết các tiêu đề không phân biệt chữ hoa chữ thường, vì vậy, ví dụ: "unset($message['headers']['Return-Path']);" không đủ - khóa tiêu đề có thể là "Đường dẫn trả về", do đó, phần chưa đặt của bạn sẽ không làm được gì. Tương tự như vậy, plugin @Mail có thể giả định một cách viết hoa nhất định, vì vậy, ngay cả khi plugin cố gắng tôn trọng lựa chọn của bạn, trường hợp bạn sử dụng có thể làm hỏng nó.Điểm mấu chốt là những gì apademo đã nói ở trên: "Vì plugin email được sử dụng để gửi email sau khi triển khai hook_mail_alter() được gọi... nên không có bất kỳ bảo đảm nào rằng email được gửi mà không có các tiêu đề đó."
Điểm:0
lá cờ my

Các SMTP mô-đun luôn đặt các tiêu đề nhất định không thể bỏ đặt. Xem các dòng sau từ Drupal\smtp\Plugin\Mail\SMTPMailSystem:

$headers['Sender'] = $from;
$headers['Đường dẫn trả về'] = $from;
$headers['Reply-To'] = $from;

Điều này là để làm cho nó tương thích với lõi Drupal, giống như những gì tôi có thể nói.

Để kiểm soát nhiều hơn, bạn có thể sử dụng mô-đun PHPMailer SMTP thay vào đó, điều này rõ ràng không đặt Đường dẫn trở lại tiêu đề để tuân thủ RFC 5321.

Nó cũng không đưa ra giả định nào về việc nên có các tiêu đề bổ sung nào (ngoài những tiêu đề bắt buộc) và chỉ đặt chúng nếu chúng được thêm vào ở nơi khác.

Những điều sau đây sẽ hoạt động nếu trường hợp của các tiêu đề khớp nhau:

function mymodule_mail_alter(&$message) {
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}

Ngoài ra, những điều sau đây sẽ bỏ đặt tiêu đề bất kể trường hợp nào:

function mymodule_mail_alter(&$message) {
  $message['headers'] = array_change_key_case($message['headers']);
  unset($message['headers']['sender']);
  unset($message['headers']['reply-to']);
}

PHPMailer SMTP chỉ dùng để gửi email và không thực hiện bất kỳ định dạng HTML nào, vì vậy bạn cũng cần sử dụng một mô-đun như Thư MIME cho mục đích đó.

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của PHPMailer SMTP.

Điểm:-1
lá cờ jp

Thay vào đó, hãy sử dụng hàm hook_mail($key, &$message, $params). Ngoài ra, bạn sẽ cần thêm khóa $ mà tôi tin là để phân biệt chức năng nào mà thư được gửi.

Sau đó, hook này sẽ được kích hoạt khi gửi thư theo cách thủ công:

$ gửi = đúng;
$mailManager = \Drupal::service('plugin.manager.mail');
$result = $mailManager->mail($module, $key, $to, $langcode, $params, null, $send);

Tôi khuyên bạn nên sử dụng Swiftmailer, nó bỏ qua tất cả các công việc thủ công.

apaderno avatar
lá cờ us
Tôi cho rằng OP muốn xóa các tiêu đề đó khỏi mọi email. `hook_mail()` sẽ không giúp được gì với điều đó.
apaderno avatar
lá cờ us
Ngay cả khi OP muốn xóa các tiêu đề Đường dẫn trả lại, Người gửi và Trả lời khỏi email được gửi bởi một mô-đun mà OP đã viết hoặc bởi một mô-đun cụ thể, câu trả lời này không cho biết cách đạt được điều đó.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.