Наверх

Отправка письма на 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


40 комментариев

  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
                        Не знаю, так глубоко я не копал
                      2. Сергей 02 июня 2018, 15:22 # 0
                        Возможно, подскажете, как прикрутить ReCaptcha от Google к этому скрипту?
                        1. Илья Уткин 04 июня 2018, 09:21 # 0
                          Никак — это серверный скрипт, у него нет интерфейса, он никак не взаимодействует с пользователем.
                        2. Любовь 18 декабря 2018, 11:11 # 0
                          Подскажите, пожалуйста, правильно ли я понимаю?
                          Чтобы отправить письмо через SMTP, нужно, чтобы в системных настройках MODX стояли соответствующие настройки. Я так сделала, письма с помощью Formit отправляются, а из самописной рассылки — нет.
                          И второй вопрос: как сформировать письмо с подписью DKIM? В DNS она прописана, письма с сервера отправляются с подписью, но в самописном компоненте, где мы сами формируем письмо этой подписи нет.
                          1. Alex 22 апреля 2019, 11:53 # 0
                            Илья, доброе время суток!
                            Только на Вашем сайте, нашел описание на русском, сервиса отправки писем MODX!
                            Помогите внедрить изображения Товаров в тело письма в miniShop2.

                            В функции sendEmail
                            $mail->embedImage($imagepath, $cid);
                            В шаблоне tpl.msEmail:
                            {'!sendEmailImagePath' | snippet}
                            <img src="cid:{$product.id}">
                            Как в функцию embedImage через сниппет sendEmailImagePath
                            $imagepath = ??? ;
                            $cid = ???;
                            передать
                            {$site_url}{$product.thumb} //Путь к изображению.
                            {$product.id} // Идентификатор
                            Спасибо
                            1. Илья Уткин 22 апреля 2019, 12:05 # 0
                              Привет. Ну я с такой задачей не сталкивался. Попробуйте написать вопрос на сайте modx.pro — вдруг, кто-то уже такую задачу решал, тогда подскажут.
                              1. Alex 22 апреля 2019, 12:21 # 0
                                Написал ужЕ, пару дней только просмотры, ни одного ответа…
                                Нашел единственный пост по теме, только автор не указал — как решил задачку.
                                Решение — по аналогии с function attach (несколькими постами выше)
                                Помогите аргументы в функцию передать.
                                Спасибо

                                PS Для «чистого» PHP — есть решение, не могу под MODX+miniShop2 адаптировать.
                            2. Alex 29 апреля 2019, 12:36 # 0
                              Илья, доброе время суток!
                              Вы разобрались с сервисом MODX modMail.
                              Чтобы внедрить изображения в тело письма (не аттачем) нужно указать
                              Content-Type: multipart/related; boundary="myboundary-1234"
                              Как это сделать?
                              Спасибо
                              1. Александр 03 сентября 2019, 09:26 # 0
                                Илья, добрый день.
                                У нас появилась задача отравить письмо данным методом, но отложить отправку на 3 часа. Может Вам приходилось сталкиваться с отложенной отправкой в ModX?
                                1. Илья Уткин 03 сентября 2019, 10:19 # 0
                                  Здравствуйте. Да, это возможно. Напишите мне на почту ilyautkin@mail.ru, обсудим стоимость работы и сроки.
                                2. Сергей 01 ноября 2019, 15:48 # 0
                                  Почему-то если постапвить два Email адреса через запятую получается ошибка «An error occurred while trying to send the email: Пожалуйста, введите хотя бы один адрес e-mail получателя.»
                                  1. Илья Уткин 01 ноября 2019, 15:50 # 0
                                    Вот, чуть выше задавали вопрос об этом: ilyaut.ru/reposts/sending-mail-through-modmail/#comment-1849
                                  2. Сергей 01 ноября 2019, 15:54 # 0
                                    Да, спасибо, работает. Блин делал так еще час назад, то ли кэш не очистил, почему-то не сработало, вот бывает жеш. После этого уже кучу перепробовал, всякие addAddress и т.п. Спасибо.
                                    1. Геннадий Геннадьевич Едиг 22 октября 2021, 10:15 # 0
                                      Использую на сайте комментарии Вконтакте. Есть вот такое вот решение не для MODX
                                      https://19dx.ru/2016/02/dobavlyaem-uvedomleniya-vidzhetu-kommentariev-vk/
                                      Из него понятен путь. Но тот вариант что описан не работает и куда рыть не понятно.
                                      Описанное здесь на водит на мысль что есть другое решение и возможно более правильное. Беда в том что я совсем не программист. А найти решение очень хочется.
                                      1. Виталий 26 мая 2022, 11:31 # 0
                                        День добрый!
                                        Очень надеюсь, что этот блог живой, и автор хоть изредка, но наведывается сюда, несмотря на то, что ссылки под статьей уже битые :(

                                        Вопрос:

                                        Как с помощью modMail, точнее, modPHPMailer, прописать заголовки типа:

                                        Precedence: bulk
                                        и
                                        List-Unsubscribe: <mailto:list@x.ru>?

                                        Или хотя бы подскажите, куда копать?
                                        1. Илья Уткин 02 июня 2022, 13:58 # 0
                                          Вот у этого класса есть метод для добавления любых заголовков: core/model/modx/mail/modphpmailer.class.php#L191
                                          1. Виталий 03 июня 2022, 16:49(Комментарий был изменён) # 0
                                            Спасибо!
                                            Долго тупил, как его использовать, в результате понял, что что-то типа:
                                            $modx->mail->Header("Нужный заголовок");

                                        Авторизация

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


                                        Шаблоны MODX

                                        1 2 Дальше »

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