Разработка JohnCMS 9.x (обсуждения, новости)

8.24K
.
Simba
Кадило крутится, лавэха мутится
Продолжаем новостную рубрику.
Вам наверное приходилось отправлять e-mail с сайта пользователям или самому себе в случае если, например, пользователь заполнил форму на сайте?
Если нет, ничего страшного, просто рассмотрим подводные камни с которыми обычно приходится сталкиваться)
Письма обычно отправляются php функцией mail(). Если ввести в поисковик запрос "mail php", то в подсказках увидите примерно следующее https://image.prntscr.com/image/wFcXpDqyRqaOn0Cods3_Uw.png
Да, основная проблема в том, что письма часто не доставляются из-за неправильного использования функции или просто по причине бана ip хостинга. Ещё очень часто на бесплатных или даже платных хостингах функция и вовсе запрещена.

Каково же решение проблемы?
Для начала, если функция mail на хостинге работает, то нужно просто её правильно использовать (передавать нужные заголовки и правильный e-mail отправителя).
Если же функция отключена на хостинге или же ip хостинга попал в спам фильтр почтовых служб, то тут как говорится "ваши полномочия всё. окончены" и нужно искать другие варианты.

Другим вариантом является использование SMTP.
Коротко об этом..
1. У вас должен быть почтовый ящик в какой-нибудь почтовой службе.
2. У почтовой службы должна быть возможность работы с SMTP (протоколом обычно есть у всех для работы с почтовыми клиентами на компьютере или телефоне).
3. Ваш сайт должен уметь подключаться к SMTP и отправлять письма.
Таким образом для почтовых служб все выглядит так, как будто вы вручную с компьютера или с телефона отправляете письма. Тут вам уже не нужно заботиться о заголовках, спам фильтрах (почти) и прочих особенностях.

Так вот к чему же всё это?
JohnCMS теперь умеет с этим работать.
Вы можете указать способ отправки писем: sendmail, smtp, или вообще можете складывать письма  в папку на сайте. При смене хостинга вы сможете легко изменить способ отправки, при этом вам не нужно будет переписывать код отправки писем на всем сайте.
Отправка письма теперь выглядит так:
$mail = di(\Johncms\Mail\MailFactory::class);
$mail->setTo('vasya@example.com', 'Василий');
$mail->setSubject('Тема сообщения');
$mail->setBody('Текст сообщения');
$mail->send();
В качестве отправителя будет использован email из настроек сайта (при желании конечно для некоторых писем можно указать и другого отправителя с помощью метода setFrom, но для большинства случаев подойдет стандартный). Протокол, через который будет отправляться письмо и настройки, так же будут браться из конфига.
Дальше для работы с e-mail будут ещё улучшения, но о них позднее)
.
JohnCMS теперь умеет с этим работать.

А под капотом - PHPMailer?
.
Кадило крутится, лавэха мутится
Продолжим.
Наверняка получая e-mail вы сталкивались с тем, что некоторые письма выглядят как обычный текст и хорошо когда почтовый клиент превращает ссылки в ссылки, а не оставляет их текстом, но есть случаи когда не превращает и ссылки приходится копировать из письма вручную.
Такие письма неудобно читать, особенно если они большие. Для разработчиков в них неудобно делать акценты на какую-то информацию, их невозможно сделать в стиле вашего сайта и вообще такие письма банально выглядят некрасиво.

И тут на помощь приходит HTML.
В JohnCMS теперь можно отправлять полноценные письма в html формате. Более того в письмах есть поддержка шаблонов. В письмах как и на всем сайте есть основной шаблон, который является общим практически для всех страниц (header/footer). Сам текст письма - это контентная область, которая в разных письмах может выглядеть по разному.
Базовых шаблонов может быть несколько и каждый шаблон сообщения может использовать любой базовый шаблон.
Всё это позволит вам менять базовый шаблон не меняя все шаблоны писем. Например: вы можете сделать несколько шаблонов на все времена года, зимний, летний, весенний, осенний и менять их когда это необходимо. При этом вам нужно будет поменять всего лишь 1 файл, а шаблоны писем менять не придется вовсе.

Теперь вернёмся к технической части.
Как вы наверное знаете отправка письма с сайта не самая быстрая операция, особенно если отправляется много писем (если не знали, то теперь знаете).
Нельзя заставлять пользователей ждать пока отправится сообщение и загрузится страница. Отправка сообщений должна выполняться не в момент когда пользователь заходит на страницу, а отдельно в фоновом режиме (желательно на cron).
Для решения этой проблемы в JohnCMS теперь есть таблица в которой сохраняются сообщения и потом автоматически отправляются. Благодаря этому пользователь не "зависает" пока отправляется сообщение и так же благодаря этому открываются новые возможности для организации небольших рассылок и прочего.

Пример добавления сообщения в очередь на отправку:
$email = (new \Johncms\Mail\EmailMessage());
$email->create(
    [
        'locale'   => 'ru', // Язык, на котором будет отправлено сообщение
        'template' => 'system::mail/templates/registration', // Шаблон сообщения
        'fields'   => [  // Массив полей, который будет передан в шаблон.
            'email_to'   => 'example@example.com', // Обязательное поле (e-mail получателя). 
            'name_to'    => 'Имя получателя',
            'subject'    => 'Тема сообщения',
            'user_name'  => 'Василий',
            'user_login' => 'user_login',
        ],
    ]
);
Поля email_to, name_to, subject будут использоваться при отправке сообщения, но они так же будут доступны и в шаблоне.

Ну и на этом пока всё)
З.Ы. В прикрепленном файле пример готового письма.
Прикрепленные файлы:
.
Simba
Кадило крутится, лавэха мутится
# ДоХтор (07.06.2020 / 23:20)
А под капотом - PHPMailer?
Не, laminas-mail https://docs.laminas.dev/laminas-mail/
.
Simba, А у этой либы есть преимущества перед Майлером?
.
Simba
Кадило крутится, лавэха мутится
# ДоХтор (07.06.2020 / 23:46)
Simba, А у этой либы есть преимущества перед Майлером?
Я если честно про phpmailer забыл когда изучал эту тему и даже не знаю есть ли там какие-то преимущества. На первый взгляд код в ламинасе получше)
Ну и главное задачу свою выполняет да и ладно ))
.
╭∩╮ (`-`) ╭∩╮
# Simba (07.06.2020 / 23:51)
Я если честно про phpmailer забыл
Ты про него и не вспоминай...
От греха подальше...
---
Погугли на тему, сколько дыр (причем ктитических) там было обнаружено в истории его разработки...
Да, сегодня вроде замеченных дыр нет, но я честно говоря, глядя на историю, даже не рассматриваю данную либу в качестве кандидата на использование в своих разработках.
.
# Simba (07.06.2020 / 23:51)
Ну и главное задачу свою выполняет да и ладно ))
Тоже верно )
.
Ребятам как там в ЗАВТРА живётся?
Прикрепленные файлы:
.
Simba
Кадило крутится, лавэха мутится
# GECKTOR (08.06.2020 / 01:37)
Ребятам как там в ЗАВТРА живётся?
Норм  
Перевод чуть кривой (
Всего: 329