Наверх

Отправка письма на e-mail через сервис MODX modMail

В разделе «Репосты» расположены чужие статьи, которые мне понравились или показались полезными.

Для меня стало настоящим открытием то, что в MODX есть встроенный сервис для отправки писем на e-mail. Конечно, кто-то знает об этом, и возможно очень давно, но я узнал о такой возможности совсем недавно (уверен, не я один). Ранее для таких целей у меня был заготовлен сниппет, в котором такая же ф-ция была описана, а теперь, похоже, что он мне больше не понадобится.
/*Активируем почтовый сервис MODX*/
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
$modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));

/*Адрес получателя нашего письма*/
$modx->mail->address('to', 'user@example.com');

/*Заголовок сообщения*/
$modx->mail->set(modMail::MAIL_SUBJECT, 'Ваша учётная запись активирована');

/*Подставляем чанк с телом письма (предварительно его нужно создать)*/
$modx->mail->set(modMail::MAIL_BODY, $modx->getChunk('myEmailTemplate'));

/*Отправляем*/
$modx->mail->setHTML(true);
if (!$modx->mail->send()) {
    $modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}
$modx->mail->reset();
Как видите, все предельно просто. Для отправки писем можно создавать любые условия на PHP, получать поля из форм, и даже использовать этот код в плагине для отправки писем через админку. Лайкайте, комментируйте. Спасибо за внимание. Используемые материалы: http://rtfm.modx.com/display/revolution20/modMail Ну и такая маленькая приятная мелочь, как привязка файла. Путь к файлу от корня сайта.
$modx->mail->attach($attachment);
Источник: http://community.modx-cms.ru/blog/documentation/10611.html


24 комментария

  1. Саша 23 февраля 2015, 18:09 # 0
    Добрый день!

    $modx->mail->attach($attachment);
    А как получить путь к файлу загруженному через форму?
    $attachment =?
    1. Илья Уткин 24 февраля 2015, 08:06 # 0
      Его надо сначала сохранить на сервере: https://php.net/manual/ru/features.file-upload.post-method.php
    2. Саша 24 февраля 2015, 09:16 # 0
      А как узнать куда он сохраняет файл?

      Когда я ставлю стандартный хук — email, то картинка прикрепляется к письму.
      Но мне нужно через свой хук сделать через отправку modPHPMailer

      // прикрепляем файл
      $uploaddir = '/public_html/site/assets/image/';
      $attachment = $uploaddir. basename($_FILES['photo']['name']);
      $uploaddir=?
      Спасибо
      1. Илья Уткин 24 февраля 2015, 09:24 # 0
        Вроде, вот код, который обрабатывает файлы и прикрепляет их в виде вложения в письмо:
        /core/components/formit/model/formit/fihooks.class.php#L439-L448
        Нужно только сделать по аналогии.
      2. Саша 24 февраля 2015, 14:34 # 0
        Спасибо, помогли подтолкнуть меню в нужную сторону.
        В итоге нашел такую функцию в файле core/model/modx/mail/modmail.class.php

        public function attach($file,$name = '',$encoding = 'base64',$type = 'application/octet-stream') {
         parent :: attach($file);
        $this->mailer->AddAttachment($file,$name,$encoding,$type);
        }
        Долго не мог понять как же получить $file.
        По вашей ссылке видно что $file= $v['tmp_name'];
        Итого решение:

        // с формы:
        <input id="upfile" type="file" name="photo" value="[[!+fi.photo]]" />
        // в сниппете
        $file = $_FILES['photo']['tmp_name']; // путь к файлу
        $name = $_FILES['photo']['name']; // имя файла
        // прикрепляем файл
        $modx->mail->attach($file,$name);

        Большое спасибо за Ваше время. Всего хорошего Вам.
        1. Денис 05 июля 2015, 22:44 # 0
          А как прикрепить файл который не заливал пользователь, а заранее подготовлен?
          1. Илья Уткин 06 июля 2015, 07:05 # 0
            Ну, логично, что нужно указать его расположение и имя в переменных $file и $name
        2. Салах 25 апреля 2016, 07:05 # 0
          А как это все использовать? Что это за код, где он, как править и каким образом отправлять? Эта инструкция программиста для программистов, а можете чуть подробнее объяснить, для не такого продвинутого пользователя, как с этим работать?
          1. Илья Уткин 25 апреля 2016, 12:36 # 0
            А это и нужно только для программистов. Для пользователей есть FormIt. Можно погуглить что-то типа «Отправка E-mail с помощью FormIt»
          2. Виталий Барышников 28 апреля 2016, 03:59 # 0
            Приветствую, Илья. По моему запросу в гугле по отправке файлов с сайта, этот пост среди первых.
            В общем, суть такова, что была форма обратной связи обычная (FormIt+AjaxForm) и теперь понадобилось через неё ещё файлы цеплять, с ограничением: только один файл, размером до 5 Мб, doc, xls, pdf.
            Я не силен программированием, поэтому думаю загружать файлы компонентом Uploadify (это поможет с ограничениями).И у меня вопрос, как отправить загруженный файл, а после отправки удалить (они не нужны на сервере)? Есть уже готовые решения для этого? Потому что и на другом сайте хотят примерно такую форму.
            1. Илья Уткин 28 апреля 2016, 10:12 # 0
              Я сам такое еще не реализовывал… но, думаю, можно использовать или AjaxUpload, или FileAttach
            2. Владимир 16 июня 2016, 21:15 # 0
              Я новичок в Modx, поэтому прошу понять правильно. Куда сей код вставить и как использовать?
              У меня почему то со снипетом Formit и AjaxForm, ругаеться на адрес маил в форме. Поставил сниппет QuickEmail
              Mailer error info: Невозможно запустить функцию mail
              Что делать? Может с вашим кодом получиться
              1. Илья Уткин 17 июня 2016, 10:44 # 0
                Этот код вряд ли поможет. Он используется в сниппетах. В FormIt такой код встроен уже.
                Если QuickEmail сообщает, что невозможно запустить функцию mail, значит, надо обращаться в техподдержку хостинга — видимо, эта функция просто-напросто отключена
              2. Роман 16 августа 2016, 13:28 # 0
                Спасибо за пост, полезно, но подскажите как передать в чанк myEmailTemplate
                передать плейсхолдеры email и name?

                в чанке так вызываю [[+email]] и [[+name]] на почту приходят в таком же виде.
                Отправляю через Formit через hook

                1. Илья Уткин 16 августа 2016, 13:36 # 0
                  $modx->mail->set(modMail::MAIL_BODY, $modx->getChunk('myEmailTemplate',
                    array(
                      'email' => 'user@example.com',
                      'name' => 'User Name'
                    )
                  ));
                  1. Роман 16 августа 2016, 19:16 # 0
                    Илья Спасибо большое!
                2. Николай 22 июня 2017, 11:12 # 0
                  Николай, подскажите, как можно добавить несколько почтовых адресов для отправки?
                  1. Илья Уткин 22 июня 2017, 11:32 # 0
                    $modx->mail->address('to', 'mail@site.ru');
                    $modx->mail->address('to', 'second@site.ru');
                    $modx->mail->address('to', 'third@site.ru');
                  2. Denis 14 сентября 2017, 14:13 # 0
                    Если большое количество получателей, скажем 100000 человек, возможно ли использовать это решение в цикле, или нужно на чанки делить?
                    1. Илья Уткин 14 сентября 2017, 14:19 # 0
                      Если сервер ОЧЕНЬ мощный, памяти у него много, ограничений на время выполнения скрипта не стоит, то можно прям в цикле использовать.

                      Но если сервер обычный, то столько писем отправить за раз не получится. Тем более, вряд ли почтовые службы не заметят такой большой рассылки — скорее всего письма начнут удаляться спам-фильтрами. Лучше использовать для рассылок специальные сервисы — люди за это не зря деньги берут.
                      1. Denis 14 сентября 2017, 14:24 # 0
                        Это рассылка подписчикам. С количеством перезакладываюсь на всякий случай. Хостинг обычный. Как быть? Тут как бы коллбэк получается
                        if (!$modx->mail->send()) {
                        $modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
                        }
                        и пока эта проверка не осуществится, следующее письмо не полетит. правильно я понимаю?
                        1. Илья Уткин 14 сентября 2017, 14:26 # 0
                          Полетит. Эта строчка только оставит запись в логе ошибок — о том, что такое-то письмо не было отправлено.
                    2. Denis 14 сентября 2017, 14:30 # 0
                      А на уровне modMail некое подобие очереди не реализовано? там прямая связь с send mail?
                      1. Илья Уткин 14 сентября 2017, 14:35 # 0
                        Не знаю, так глубоко я не копал

                      Авторизация

                      через сервис Loginza:

                      Подписка или RSS

                      Буду присылать новые статьи — никакого спама



                      Шаблоны MODX

                      1 2 Дальше »

                      Объектная
                      модель
                      MODX