Настройка отправки писем через серверное приложение SmartPlayer
Описание
Серверное приложение SmartPlayer имеет ряд функциональностей, где происходит оповещение конечного пользователя через почтовый сервер, например:
- Изменение статуса устройства (онлайн, оффлайн и т.п.)
- Оповещение о проблемных товарных позициях по товару
- Оповещение о неуспешном снятие бэкапа сервера и другие.
Ключевые моменты
Серверное приложение SmartPlayer не имеет встроенного почтового сервера, так как это отдельная большая разработка на которой специализируются отдельный ИТ компании. Серверное приложении имеет только клиента, который может отправлять сообщения используя почтовый сервер.
Почтовые сервера могут быть установлены как в локальной сети, так и в публичной (называем их облачными).
К локальным из самых популярных можно отнести Microsoft Exchange. Локальным его делает то, что он установлен внутри закрытого контура локальной сети. В больших корпорациях в 99% так и есть.
К облачным почтовым серверам можно отнести SendPulse именно его использует SmartPlayer в облачных решениях для отправки писем.
Настройки для облачного почтового сервера, можно получить у @Андрей Никонов . А для локального почтового сервера, настройки необходимо получать у местного системного администратора заказчика, чтобы их получить нужно задать правильные вопросы которые описаны в следующем разделе.
Основные вопросы и ответы для местного системного администратора
Есть ли локальный почтовый сервер у заказчика в внутренней сети ?
- Если на этот вопрос ответ нет, то остальные не имеют смысла
Какой использовать host для подключения к почтовому серверу ?
- Ответ на этот вопрос будет означать значение параметра: host в конфигурации
Какой использовать порт для подключения к почтовому серверу ?
- Ответ на этот вопрос будет означать значение параметра: port в конфигурации
Требуется ли авторизация на почтовом сервере для отправки писем ?
- Ответ на этот вопрос будет означать значение параметра-объекта : auth в конфигурации
От какого e-mail отправлять письма ?
- По умолчанию используется почта noreply@smartplayer.org, но почтовый сервер может фильтровать такие письма и требовать чтобы отправка писем выполнялась от реально существующего аккаунта на почтовом сервере. Ответ на этот вопрос будет означать значение параметра : defaultSenderEmail в конфигурации
Принимает ли сервер незашифрованные запросы ?
- Ответ на этот вопрос будет означать значение параметров безопасности таки как : secure, ignoreTLS, rejectUnauthorized в конфигурации
После того как получены ответы на вопросы, можно приступать к настройки конфигурации серверного приложения для отправки писем.
Общая информация по настройке клиента серверного приложения, который используется для отправки писем
С версии сервера 2.85.0 добавлена отправка email уведомлений ошибок о товарах. Отправителем письма указывается modules.priceList.methods.checkAllPriceList.NO_REPLY_EMAIL в файле local.json - по умолчанию noreply@smartplayer.org
До версии сервера 2.87.1 существовал один режим отправки email уведомлений ошибок о товарах: email сообщение отправляется на SMTP сервер, хост которого получается по MX записи доменного имени получателя сообщения. Это приводило к проблемам отправки писем в локальной сети, т.к. зачастую по MX записям письма отправить не удавалось + используемый модуль не поддерживает
С версии сервера 2.87.1 существует два режима отправки email уведомлений, которые задаются в файле local.json:
- direct - значение по-умолчанию - email сообщение отправляется на SMTP сервер, хост которого получается по MX записи доменного имени получателя сообщения.
- through SMTP server - email сообщение отправляется на SMTP сервер, параметры подключения к которому указываются в настройке smtpServerConnectionParams.
Клиент имеет дополнительные опции, которые описаны в документации модуля https://nodemailer.com/smtp/ может быть полезно, при уникальной настройки, но 90% случаев будет достаточно примеров, которые будут описаны ниже.
Настройка отправки писем с серверного приложения для всех функциональностей где используется отправка писем
Название параметра | Описание параметра |
---|---|
host | Адрес почтового сервера, который получен от администратора локального/облачного почтового сервера. |
port | Порт почтового сервера, который получен от администратора локального/облачного почтового сервера. |
auth |
Объект который содержит данные для авторизации на почтовом сервере. Его стоит заполнять если почтовый сервер требует авторизации. |
"rejectUnauthorized": false | Описание из официальной документации:
rejectUnauthorized <boolean> If not false a server automatically reject clients with invalid certificates. |
secure | Описание из официальной документации:
secure – if true the connection will use TLS when connecting to server. If false (the default) then TLS is used if server supports the STARTTLS extension. In most cases set this value to true if you are connecting to port 465. For port 587 or 25 keep it false |
ignoreTLS | Описание из официальной документации:
ignoreTLS – if this is true and secure is false then TLS is not used even if the server supports STARTTLS extension |
defaultSenderEmail | От кого (какого e-mail) отправлять письма |
Примеры
Пример с авторизацией и типом отправки “through SMTP server“ local.js:
module.exports = { services: { sendMessage: { TRANSPORTS: [ { transportId: 'localSMTPEmailTransport', type: 'email', params: { mode: 'through SMTP server', smtpServerConnectionParams: { "host": "mail.example.com", "port": 465, "auth": { "user": "username", "pass": "password" }, "secure": false, "tls": { "rejectUnauthorized": false }, "ignoreTLS": true }, retriesCount: 2, defaultSenderEmail: 'noreply@smartplayer.org', concurrency: 10, toStoreFields: null, toExcludeFields: ['attachments'] } } ], DEFAULT_EMAIL_TRANSPORT_ID: 'localSMTPEmailTransport' } } }
Пример без авторизации и типом отправки “through SMTP server“ local.js:
module.exports = { services: { sendMessage: { TRANSPORTS: [ { transportId: 'localSMTPEmailTransport', type: 'email', params: { mode: 'through SMTP server', smtpServerConnectionParams: { "host": "mail.example.com", "port": 465, "secure": false, "tls": { "rejectUnauthorized": false }, "ignoreTLS": true }, retriesCount: 2, defaultSenderEmail: 'noreply@smartplayer.org', concurrency: 10, toStoreFields: null, toExcludeFields: ['attachments'] } } ], DEFAULT_EMAIL_TRANSPORT_ID: 'localSMTPEmailTransport' } } }
В некоторых случаях может потребоваться прямая отправка “direct“, тогда конфиг будет выглядеть так без авторизации.
module.exports = { services: { sendMessage: { TRANSPORTS: [ { transportId: 'directEmailTransport', type: 'email', params: { mode: 'direct', retriesCount: 2, defaultSenderEmail: 'noreply@smartplayer.org', concurrency: 10, toStoreFields: null, toExcludeFields: ['attachments'] } } ], DEFAULT_EMAIL_TRANSPORT_ID: 'directEmailTransport' } } }
Пример отправки от имени личного аккаунта на gmail
Для отправки писем от имени своего аккаунта на gmail (это моджет потребоваться для тестирования), можно в настройках серверного приложения services.sendMessage.TRANSPORTS указать:
module.exports = { services: { sendMessage: { TRANSPORTS: [ { transportId: 'gmailSMTPEmailTransport', type: 'email', params: { mode: 'through SMTP server', smtpServerConnectionParams: { "host": "smtp.gmail.com", "port": 465, "auth": { "user": "f.nasybulin@smartplayer.org", "pass": "password" }, "secure": false, "tls": { "rejectUnauthorized": false }, "ignoreTLS": true }, retriesCount: 2, defaultSenderEmail: 'noreply@smartplayer.org', concurrency: 10, toStoreFields: null, toExcludeFields: ['attachments'] } } ], DEFAULT_EMAIL_TRANSPORT_ID: 'gmailSMTPEmailTransport' } } }
И включить отправку писем со всех сторонних приложений в настройках своего аккаунта Google
Настройка отправки писем с серверного приложения для валидации товарных позиций (в основном использовалось для проекта "Окей", но не ограничивается им)
Есть возможность выбрать через какой транспорт отправлять письма для определенных модулей, а не использовать DEFAULT_EMAIL_TRANSPORT_ID как в предыдущих примера. Тут показан пример для настроек параметров под модули, которые отвечают за справочник товары.
Пример local.js:
Для этого нужно указать несколько транспортов (описать параметры подключения) и указать какой именно использовать в данном модуле. Например письма при возникновении ошибок в сведения о товарах отправлять через gmailSMTPEmailTransport, а все остальные через directEmailTransport:
{ "modules": { "priceList":{ "methods": { "checkAllPriceLists": { "EMAIL_TRANSPORT_ID": "gmailSMTPEmailTransport" } } } }, services: { sendMessage: { TRANSPORTS: [ { transportId: 'gmailSMTPEmailTransport', type: 'email', params: { mode: 'through SMTP server', smtpServerConnectionParams: { "host": "smtp.gmail.com", "port": 465, "auth": { "user": "f.nasybulin@smartplayer.org", "pass": "password" }, "secure": false, "tls": { "rejectUnauthorized": false }, "ignoreTLS": true }, retriesCount: 2, defaultSenderEmail: 'noreply@smartplayer.org', concurrency: 10, toStoreFields: null, toExcludeFields: ['attachments'] } }, { transportId: 'directEmailTransport', type: 'email', params: { mode: 'direct', retriesCount: 2, defaultSenderEmail: 'noreply@smartplayer.org', concurrency: 10, toStoreFields: null, toExcludeFields: ['attachments'] } } ], DEFAULT_EMAIL_TRANSPORT_ID: 'directEmailTransport' } } }
Установка конфигурации серверного приложения на целевой сервер
- К этому моменту у нас есть файл local.js который содержит в себе настройки для клиента отправки писем со стороны серверного приложения
- Загрузите этот файл любым удобным способом на сервер:
- Скопируйте этот файл в папку серверного приложения с именем config, по умолчанию это для docker сборки будет путь “/home/smartplayer/smartplayer/backend/app/config“. defaults.js конфиг не удаляйте, требуемые параметры будут перезаписаны из local.js
- Перезапустить серверное приложение
docker exec -it smartplayer_backend_1 sh -c "pm2 restart all"