Настройка отправки почты на сайте Opencart
Введение
Все настройки необходимо сделать таким образом, чтобы Opencart мог отправлять почту с локально настроенного SMTP-сервера посредством функции php mail. Сервер размещен в LXC-контейнере на VPS сервере одного из хостинг провайдеров.
В процессе настройки необходимо выполнить следующие основные этапы:
- добавление служебного почтового ящика на connect.yandex.ru
- получение и установка SSL-сертификата smtp.yandex.ru
- установка и настройка локального SMTP-сервера
- настройка php.ini на использование локального SMTP-сервера
- настройка локальных почтовых алиасов
- настройка почты в административной части сайта Opencart 2.x
1. Добавление пользователя в ППД Yandex.ru
Определяемся, от имени какого пользователя будем слать почту домена и добавляем его через административную панель ПДД Яндекса https://connect.yandex.ru
В моем случае: noreply@roror.ru
Записываем пароль к этому ящику - он нам вскоре пригодится.
Обязательно входим в первый раз через https://mail.yandex.ru под этим логином и завершаем регистрацию.
2. Установка SSL-сертификата smtp.yandex.ru
Получаем сертификат почтового сервера Yandex
Вырезаем все, что расположено между строками “BEGIN CERTIFICATE” и “END CERTIFICATE”, включая и эти строки со всеми дефисами и записываем все это в файл /etc/postfix/yandex.crt.
3. Настройка postfix
В качестве локального MTA принято решение использовать postfix, т.к. штатный sendmail настраивать очень неудобно.
Некоторые коллеги предпочитают использовать SSMTP
или sendemail
, т.к. его проще настроить, но мне этот вариант не подошел.
Установка необходимых пакетов:
При запросе типа использования postfix выбираем “Интернет-сайт”.
Конфигурируем postfix.
Изменения в основном файле настроек /etc/postfix/main.cf:
# включаем SMTP аутентификацию для SMTP - демона
smtp_sasl_auth_enable = yes
# указываем Postfix путь для файла, в котором хранятся пароль и логин для авторизации на SMTP сервере
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# определяем, что для отправки почты необходимо использовать авторизацию.
smtp_sasl_security_options = noanonymous
# использование библиотеки Cyrus SASL для аутентификации
smtp_sasl_type = cyrus
# предлагаемый SMTP клиентом механизм SASL аутентификации
# посылать запрос на авторизацию в открытом виде (нешифрованные логин и пароль)
smtp_sasl_mechanism_filter = login
# определяем, что аутентификация будет зависеть от адреса отправителя
smtp_sender_dependent_authentication = yes
# параметр, который предписывает изменение глобальной настройки relayhost. Т.е. мы будем сопоставлять релей с доменом отправителя.
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
# через какой аккаунт (почтовый ящик) отправлять почту с определенного домена - таблица соответствия
sender_canonical_maps = hash:/etc/postfix/canonical
# определим правила, по которым будем подменять адрес отправителя письма
smtp_generic_maps = hash:/etc/postfix/smtp_generic
# включаем использование TLS-протокола (yandex.mail его применяет)
smtp_use_tls = yes
# имя хоста (виртуалки) - надо именно localhost!
myhostname = localhost
# домен, который использует на вэбсайт
mydomain = roror.ru
# при отправлении письма от пользователя www-data, email адрес отправителя будет www-data@roror.ru
# этот адрес будет заменен по соответствиям, прописанным в smtp_generic_maps
myorigin = $mydomain
# доверенные сети, в которыз не нужна авторизация
mynetworks = 127.0.0.0/8
# Протокол, адрес и порт Яндекс почты
relayhost = [smtp.yandex.ru]:465
Полностью рабочий файл main.cf приведен в Приложении 1.
Теперь осталось создать все внешние списки-соответствия, которые мы использовали в main.cf
, а именно: canonical, sasl_passwd, sender_relay, smtp_generic
.
Все они расположены в каталоге /etc/postfix
- canonical
Данная запись означает, что всю почту домена roror.ru надо отправлять из почтового ящика noreply@roror.ru
- sasl_passwd
Здесь все просто - сначала идет доменное имя и порт SMPT-сервера (релея), а после пробела - имя нашего рабочего почтового ящика, и, через разделитель “двоеточие” - пароль к этому ящику.
- sender_relay
В этом файле мы задаем почтовые шаблоны (конкретный ящик или почтовый домен) и SMTP-релей, через который будем отправлять их почту.
- smtp_generic
Здесь определяем соответствие внутреннего логина или почтового ящика и адреса электронной почты с которого будет отправляться его почта.
После создания и заполнения этих 4-х файлов - сделаем хэш.
for setfile in canonical sasl_passwd sender_relay smtp_generic; do postmap /etc/postfix/$setfile; done
В папке /etc/postfix появятся еще четыре файла с расширением *.db
.
После любых изменений этих файлов, не забывайте делать hash командой postmap.
После перезапуска сервиса postfix - запускаем тестовое письмо и смотрим лог.
service postfix restart
echo 'I find correct settings postfix as relay to SMTP Yandex.ru!' | mail -s 'Test of Yandex relay' some_user@mail.ru
clear; tail -n 10 /var/log/mail.log
Если в логе status=sent - значит все хорошо. В противном случае (deffered) надо все проверять и добиваться корректного ответа.
Вот пример успешного лога:
> Nov 24 11:41:47 roror postfix/pickup[5938]: 7A9AB70BC1: uid=1001 from=<some_user@roror.ru>
> Nov 24 11:41:47 roror postfix/cleanup[6075]: 7A9AB70BC1: message-id=<20191124084147.7A9AB70BC1@oc.roror.ru>
> Nov 24 11:41:47 roror postfix/qmgr[5939]: 7A9AB70BC1: from=<some_user@roror.ru>, size=388, nrcpt=1 (queue active)
> Nov 24 11:41:47 roror postfix/smtp[6077]: Untrusted TLS connection established to smtp.yandex.ru[77.88.21.158]:465: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
> Nov 24 11:41:48 roror postfix/smtp[6077]: 7A9AB70BC1: to=<test1@gmail.com>, relay=smtp.yandex.ru[77.88.21.158]:465, delay=0.86, delays=0.05/0.03/0.19/0.59, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued on vla1-a59883171b53.qloud-c.yandex.net as 1574584908-arz6bbCofh-flViX2i4)
> Nov 24 11:41:48 roror postfix/qmgr[5939]: 7A9AB70BC1: removed
На этом предварительная настройка Postfix в качестве релея для SMTP Яндекса завершена. В таком варианте почту уже успешно уходит через утилиту mail. Но, чтобы все заработало из php функции mail, надо сделать настройку php.ini.
4. Настройка php.ini на использование MTA
В секции [mail function] файла /etc/php/<php-version>/apache2/php.ini
надо сделать правильную запись:
Больше там ничего настраивать не надо.
5. Настройка локальных почтовых алиасов
В файле /etc/aliases надо прописать соответствие локальных логинов и логина, на который будет приходить почта данного пользователя. Это делается для удобства отладки - не надо проверять почту для каждого пользователя.
6. Настройка Opencart
Из всех полей надо заполнить только два:
- Почтовый протокол: Mail
- Дополнительные адреса оповещения
После того, как почта заработает, советую изменить стандартную каптчу openstack - т.к. она очень легкая.
Правим файл: /var/www/htdocs/<site_sample.ru>/catalog/controller/tool/captha/php
Список изменений:
diff .captcha_170304.php captcha.php
4c4
< $this->session->data['captcha'] = substr(sha1(mt_rand()), 17, 6);
---
> $this->session->data['captcha'] = substr(sha1(mt_rand()), 15, 5);
6c6
< $image = imagecreatetruecolor(150, 35);
---
> $image = imagecreatetruecolor(148, 34);
11a12
> $grey = imagecolorallocate($image, 51, 51, 51);
15a17
> $yellow = imagecolorallocatealpha($image, 0, 204, 204, 0);
19,21c21,26
< imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $red);
< imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $green);
< imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $blue);
---
> imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 45)), 30, 30, $red);
> imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 28)), 43, 30, $green);
> imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 37)), 30, 30, $blue);
> imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 42)), 51, 30, $yellow);
> imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 23)), 30, 30, $green);
> imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 51)), 22, 30, $blue);
28c33,34
< imagestring($image, 10, intval(($width - (strlen($this->session->data['captcha']) * 9)) / 2), intval(($height - 15) / 2), $this->session->data['captcha'], $black);
---
> imagestring($image, 12, intval(($width - (strlen($this->session->data['captcha']) * 5)) / 3), intval(($height - 9) / 2), $this->session->data['captcha'], $grey);
>
36c42
< }
\ No newline at end of file
---
> }
6. Полезные статьи:
1) Postfix: настройка отправки почты в Asterisk самая толковая статья из всех, что нашел.
2) Отправка почты средствами PHP 3) Как работает Sendmail?
7. Приложения
7.1 /etc/postfix/main.cf
mydomain = roror.ru
myorigin = $mydomain
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
myhostname = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
relayhost = [smtp.yandex.ru]:465
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_type = cyrus
smtp_sasl_mechanism_filter = login
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/postfix/yandex.crt
smtp_sasl_security_options = noanonymous
smtp_tls_wrappermode = yes
smtp_tls_security_level = encrypt
smtp_sender_dependent_authentication = yes
smtp_generic_maps = hash:/etc/postfix/smtp_generic
smtp_tls_loglevel = 1
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
7.3 Файлы, которые затронуты в процессе настройки:
- /etc/hostname
- /etc/mailcap
- /etc/sasldb2
- /etc/php/7.2/apache2/php.ini
- /etc/postfix/main.cf
- /etc/postfix/yandex.crt
- /etc/postfix/smtp_generic
- /etc/postfix/sender_relay
- /etc/postfix/sasl_passwd
- /etc/postfix/canonical
- /etc/aliases
- /etc/mailname
- /etc/apache2/sites-available/roror.ru.conf
- /var/www/htdocs/roror.ru/system/library/mail.php
Опубликовано: 13.12.2024