Рейтинг:0

hook_mail_alter() не удаляет заголовки Return-Path, Sender и Reply-To.

флаг us

Я хочу удалить Обратный путь, Отправитель, и Ответить на заголовки отправленных писем. Я пытаюсь добиться этого, используя следующий код, но заголовки не удаляются из электронной почты.

функция mymodule_mail_alter(&$сообщение) {
  unset($message['headers']['Return-Path']);
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}

Что я делаю не так?

флаг fr
Так много осталось недосказанным... например, какие плагины @Mail вы используете.
флаг us
Мы используем почтовую программу PHP по умолчанию для Drupal 8 и модуль SMTP. Мы пытаемся запустить тестовую почту через модуль SMTP после ввода учетных данных. Но, похоже, мы не можем изменить заголовки из hook_mail_alter.
imclean avatar
флаг my
Почему мое редактирование было отклонено? Комментарий @secretsayan выше добавляет важную информацию, которая должна быть в вопросе. Это сужает его до модуля SMTP, а не только до ядра Drupal.
Рейтинг:1
флаг us

Удаление значений из $сообщение['заголовки'] недостаточно, так как плагин, используемый для отправки электронных писем, также может использовать $message['Путь возврата'], $сообщение['Отправитель'], или же $message['Ответить-кому'] значение для создания заголовков электронной почты. Класс, который используется в качестве плагина по умолчанию для отправки электронных писем, PhpMail использует следующий код, но другие плагины могут использовать другой код.

$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'])) ? '-ф' . $message['Return-Path'] : '';
$mail_result = @mail($message['to'], $mail_subject, $mail_body, $mail_headers, $additional_headers);

Поскольку плагин электронной почты используется для отправки электронной почты после крючок_mail_alter() реализации, и поскольку плагин электронной почты может добавить один из этих заголовков по своему усмотрению, нет никакой гарантии, что электронное письмо будет отправлено без этих заголовков. Предположим, что плагин электронной почты добавляет только те заголовки, когда $сообщение или же $сообщение['заголовки'] содержит значение для них, следующий код должен работать.

функция mymodule_mail_alter(&$сообщение) {
  unset($message['Return-Path']);
  сбросить ($ сообщение ['Отправитель']);
  unset($message['Reply-To']);
  unset($message['headers']['Return-Path']);
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}
флаг fr
Я хотел бы добавить, что RFC говорит, что заголовки нечувствительны к регистру, поэтому, например, "unset($message['headers']['Return-Path']);" недостаточно - ключ заголовка может быть «return-Path», поэтому ваш unset ничего не сделает. Точно так же плагин @Mail может иметь определенный регистр, поэтому, даже если плагин пытается уважать ваш выбор, используемый вами регистр может сбить его с толку.Суть в том, что apademo сказал выше: «Поскольку плагин электронной почты используется для отправки электронной почты после вызова реализации hook_mail_alter() ... нет никаких гарантий, что электронная почта отправляется без этих заголовков».
Рейтинг:0
флаг my

SMTP модуль всегда устанавливает определенные заголовки, которые нельзя отменить. См. следующие строки из Drupal\smtp\Plugin\Mail\SMTPMailSystem:

$headers['Отправитель'] = $от;
$headers['Return-Path'] = $from;
$headers['Reply-To'] = $from;

Это сделано для того, чтобы сделать его совместимым с ядром Drupal, которое, насколько я могу судить, делает то же самое.

Для большего контроля вы можете использовать модуль PHPMailer SMTP вместо этого явно отключает Обратный путь заголовок, чтобы соответствовать RFC 5321.

Он также не делает предположений о том, какие дополнительные заголовки должны присутствовать (помимо обязательных), и устанавливает их только в том случае, если они добавлены в другом месте.

Следующее будет работать, если регистр заголовков совпадает:

функция mymodule_mail_alter(&$сообщение) {
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}

В качестве альтернативы, следующее может отключить заголовки независимо от регистра:

функция mymodule_mail_alter(&$сообщение) {
  $message['headers'] = array_change_key_case($message['headers']);
  unset($message['headers']['sender']);
  unset($message['headers']['reply-to']);
}

PHPMailer SMTP предназначен только для отправки электронной почты и не выполняет никакого форматирования HTML, поэтому вам также необходимо использовать такой модуль, как MIME-почта для этой цели.

Отказ от ответственности: Я автор PHPMailer SMTP.

Рейтинг:-1
флаг jp

Вместо этого используйте функцию hook_mail($key, &$message, $params). Кроме того, вам понадобится дополнительный ключ $, который, как я полагаю, позволяет различать, для каких функций отправляется почта.

Тогда этот хук будет срабатывать при отправке почты вручную:

$ отправить = истина;
$mailManager = \Drupal::service('plugin.manager.mail');
$result = $mailManager->mail($module, $key, $to, $langcode, $params, null, $send);

Я бы предложил использовать Swiftmailer, он исключает всю ручную работу.

apaderno avatar
флаг us
Я так понимаю, ОП хочет удалить эти заголовки из каждого письма. `hook_mail()` не поможет в этом.
apaderno avatar
флаг us
Даже если OP хотел удалить заголовки Return-Path, Sender и Reply-To из электронного письма, отправленного модулем, написанным OP, или конкретным модулем, в этом ответе не говорится, как этого добиться.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.