Программно отправить Пользователю сообщение на почту из своего модуля

Главные вкладки

Аватар пользователя rukoved rukoved 8 февраля 2022 в 22:28

Здравствуйте!
Может кто уже делал, что-то подобное - подскажите куда смотреть вопрос..

Есть модуль из которого устанавливается блок с формой вопроса на сайт. После того, как пользователь отвечает, должна происходить отправка сообщения на его почту с некоторой информацией.
Не получается сделать отправку сообщения из кода. Смотрела инструкцию здесь - https://niklan.net/blog/214, но что-то не срабатывает. Ошибка в том, что модуль никак не может увидеть $mail_handler и не передает аргумент - ошибка типа:
ArgumentCountError: Too few arguments to function Drupal\testmodul\Form\TestForm::__construct(), 0 passed in .

Комментарии

Аватар пользователя Andruxa Andruxa 8 февраля 2022 в 23:15

В example.services.yml объявили аргументы для сервиса example.mail_handler?

services:
  example.mail_handler:
    class: Drupal\example\Mail\MailHandler
    arguments: ['@plugin.manager.mail', '@language_manager', '@language.default', '@string_translation']
Аватар пользователя rukoved rukoved 9 февраля 2022 в 0:21

да, конечно, все по инструкции делала, может библиотечку какую то надо еще добавить, чтоб хандлер модуль увидел?

Аватар пользователя Andruxa Andruxa 9 февраля 2022 в 11:15

Погодите-ка, а причем тут конструктор формы?

Too few arguments to function Drupal\testmodul\Form\TestForm::__construct()

$mail_handler должен передаваться в конструктор класса письма:

final class UserLoginMail {
...
  public function __construct(MailHandler $mail_handler, RequestStack $request_stack, ConfigFactoryInterface $config_factory) {
Аватар пользователя rukoved rukoved 9 февраля 2022 в 21:49

Не могу понять принцип построения всей этой структуры... Дело в том, что сообщение должно отправляться из блока (сам блок в модуле через аждакс подключен и выведен на страницу), В блоке, как бы есть своя форма с вопросом и после её отправке должно еще уходить и оповещение на почту. Сам блок и форма рабочие, а вот сообщение, чтобы отправить - не получается вписать туда никак.. может пример есть какой-то, где это можно увидеть, потому, что та инструкция, что я нашла не подходит

Сделала по инструкции:
src/Mail/MailHandler.php
example.services.yml

Но при добавлении в форму:

$subject = new TranslatableMarkup('My first mail!');
$body = [
  '#markup' => '<strong>Hello World!</strong>',
];
$mail_handler->sendMail('example@example.com', $subject, $body);

Выдаёт ошибку, что $mail_handler - не найден или передан 0 аргументов.

Аватар пользователя ivnish ivnish 10 февраля 2022 в 14:04

Можно сделать намного проще. Сначала

<?php
$this
->mailManager->mail($module_name$key$mail'ru'$params);
?>

где mailManager это Drupal\Core\Mail\MailManagerInterface;

и потом

<?php
/**
 * Implements hook_mail().
 */
function custom_mail(string $key, array &$message, array $params): void {
  if (
$key == 'custom_mail') {
    
$message['subject'] = $params['subject'];
    
$message['body'][] = $params['message'];
  }
}
?>