Настройка отправки почты на сайте 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

openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25  

Вырезаем все, что расположено между строками “BEGIN CERTIFICATE” и “END CERTIFICATE”, включая и эти строки со всеми дефисами и записываем все это в файл /etc/postfix/yandex.crt.

3. Настройка postfix

В качестве локального MTA принято решение использовать postfix, т.к. штатный sendmail настраивать очень неудобно. Некоторые коллеги предпочитают использовать SSMTP или sendemail, т.к. его проще настроить, но мне этот вариант не подошел.

Установка необходимых пакетов:

sudo apt update
sudo apt install postfix mailutils libsasl2-2 sasl2-bin libsasl2-modules

При запросе типа использования 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

Данная запись означает, что всю почту домена roror.ru надо отправлять из почтового ящика noreply@roror.ru

  • sasl_passwd
[smtp.yandex.ru]:465 noreply@roror.ru:password_for_mailbox

Здесь все просто - сначала идет доменное имя и порт SMPT-сервера (релея), а после пробела - имя нашего рабочего почтового ящика, и, через разделитель “двоеточие” - пароль к этому ящику.

  • sender_relay
@roror.ru [smtp.yandex.ru]:465
noreply@roror.ru [smtp.yandex.ru]:465

В этом файле мы задаем почтовые шаблоны (конкретный ящик или почтовый домен) и SMTP-релей, через который будем отправлять их почту.

  • smtp_generic
    root noreply@roror.ru
    www-data noreply@roror.ru
    some_user noreply@roror.ru
    some_user@roror.ru noreply@roror.ru
    www-data@roror.ru noreply@roror.ru
    root@roror.ru noreply@roror.ru
    

Здесь определяем соответствие внутреннего логина или почтового ящика и адреса электронной почты с которого будет отправляться его почта.

После создания и заполнения этих 4-х файлов - сделаем хэш.

for setfile in canonical sasl_passwd sender_relay smtp_generic; do postmap /etc/postfix/$setfile; done

В папке /etc/postfix появятся еще четыре файла с расширением *.db.

После любых изменений этих файлов, не забывайте делать hash командой postmap.

postmap /etc/postfix/canonical

После перезапуска сервиса 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 надо сделать правильную запись:

sendmail_path = /usr/sbin/sendmail -t -i

Больше там ничего настраивать не надо.

5. Настройка локальных почтовых алиасов

В файле /etc/aliases надо прописать соответствие локальных логинов и логина, на который будет приходить почта данного пользователя. Это делается для удобства отладки - не надо проверять почту для каждого пользователя.

root: some_user
postmaster: some_user
www-data: sil
#www-data: sil@roror.ru

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