Прием и отправка почты из командной строки
Содержание:
Разрешить соединение без STARTTLS
После установки iRedMail, система будет требовать от клиента безопасного соединения по TLS. При необоходимости, можно отключить данную возможность.
Отключение для SMTP
Открываем конфигурационный файл postfix:
/etc/postfix/main.cf
Задаем следующие настройки:
…
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
#smtpd_tls_auth_only = yes
…
* где smtpd_sasl_auth_enable разрешает или запрещает аутентификацию; smtpd_sasl_security_options — дополнительные опции для аутентификации; smtpd_tls_auth_only — разрешает соединение SMTP только по TLS. В данном примере мы разрешаем аутентификацию, запрещаем анонимные соединения и комментируем опцию, которая требует только безопасного соединения.
Перезапускаем postfix:
systemctl restart postfix
Отключение для IMAP/POP3
Открываем конфигурационный файл dovecot:
vi /etc/dovecot/dovecot.conf
Задаем следующие настройки:
ssl = yes
disable_plaintext_auth = no
* где disable_plaintext_auth запрещает аутентификацию без защиты; ssl задает опцию защиты (в данном примере, разрешить, но не требовать).
Перезапускаем dovecot:
systemctl restart dovecot
Step 8: Finish the Installation in Web Browser
Go to to run the web-based setup wizard. First, it will check if all dependencies are installed.
If you see the following error,
Invalid query: Specified key was too long; max key length is 1000 bytes
Then you need to log in to MySQL/MariaDB database server as root from command line,
mysql -u root -p
and change the default collation from to .
MariaDB > alter database postfixadmin collate ='utf8_general_ci';
Exit MySQL/MariaDB console and reload the setup.php page.
Once all requirements are satisfied, you can create a setup password for PostfixAdmin.
After creating the password hash, PostfixAdmin will display a line like below.
$CONF = 'hO03pn9kxIo6ZBokLaiVpSddTRczYD35740aa:rk9luqxtr+s32lwqWIHd650acf3ada94e';
You need to open the file.
Apache
sudo nano /var/www/postfixadmin/config.local.php
Nginx
sudo nano /usr/share/nginx/postfixadmin/config.local.php
Add the above line at the end of the file. After saving the file, you need to enter the setup password again and create the admin account.
After that, you can log into PostfixAdmin at .
Prerequisites
I assume that you have followed part 1 and part 2 of this tutorial series. If you followed mail server tutorials on other websites, I recommend purging your configurations and start over with my tutorial series, so you are not going to be confused by different setup processes.
PostfixAdmin is written in PHP and requires a database (MySQL/MariaDB, PostgreSQL or SQLite). This article will use MariaDB database. You also need to run Apache or Nginx web server. So basically we are going to need a LAMP or LEMP stack.
If you prefer to use Apache web server, then set up a LAMP stack.
How to set up LAMP stack on CentOS 8/RHEL 8
If you prefer to use Nginx web server, then set up a LEMP stack.
How to set up LEMP stack on CentOS 8/RHEL 8
Once the above requirements are met, let’s install and configure PostfixAdmin.
Step 2: Uninstall Postfix 2 / Sendmail / sSMTP
The next thing we have to do is to ensure that there aren’t any other mail sending softwares configured within our server, unless we really want to keep Postfix 3 and one (or more) of them. In case we don’t, we can easily uninstall all of them with the following terminal commands:
Shell
# sudo yum remove postfix
# sudo yum remove ssmtp
# sudo yum remove sendmail
1 |
# sudo yum remove postfix # sudo yum remove ssmtp # sudo yum remove sendmail |
Although performing a
yum remove is a required step for Postfix – assuming we want to install a newer version – we could also choose to
systemctl disable and
systemctl stop sSMTP and/or Sendmail instead of removing them. The only important thing to do here is to ensure that neither of them will be up and running, otherwise they will prevent our soon-to-be-installed Postfix 3 from working properly.
Примеры использования командной строки для email-отправки
1. Отправка письма с вложением
Для разных типов дистрибутива Linux команды могут отличаться.
а) для CentOS / Red Hat:
echo ‘Attachment’ | mail -s ‘Subject attachment message’ -a /var/log/maillog master@dmosk.ru
б) для Ubuntu:
echo ‘Attachment’ | mail -s ‘Subject attachment message’ -a /var/log/maillog -a /var/log/maillog2 master@dmosk.ru
… или:
echo ‘Attachment’ | mail -s ‘Subject attachment message’ -A /var/log/maillog -A /var/log/maillog2 master@dmosk.ru
* где /var/log/maillog и /var/log/maillog2 — файлы, которые будут прикреплены к письму
Обратите внимание, что обе команды отличаются по регистру опции a и A — все зависит от версии и сборки Linux (в каких-то нужно использовать маленькую, в каких-то — большую). Также обратите внимание, что в примере для Ubuntu мы отправим 2 файла — для этого просто добавляем к команде еще одну опцию прикрепления файла
2. Несколько получателей
Для отправки письма нескольким получателям, просто перечисляем их через запятую:
echo «Test text» | mail -s «Test title» master@dmosk.ru,shmaster@dmosk.ru
* в данном примере мы отправил письмо на ящики master@dmosk.ru и shmaster@dmosk.ru.
3. Отправка с копией
Отправить копию на адрес master2@dmosk.ru:
echo «Test copy» | mail -s «Test copy title» master@dmosk.ru -c master2@dmosk.ru
Отправить скрытую копию на адрес master3@dmosk.ru:
echo «Test hidden copy» | mail -s «Test hidden copy title» master@dmosk.ru -b master3@dmosk.ru
4. Указать отправителя
В CentOS / Red Hat:
echo «Test text» | mail -s «Test title» -r postmaster@dmosk.ru master@dmosk.ru
В Debian / Ubuntu:
echo «Test text» | mail -s «Test title» master@dmosk.ru -aFrom:postmaster@dmosk.ru
5. Отправка через другой SMTP сервер
echo «Test text» | mail -s «Test title» -S smtp=»smtp.mail.ru:25″ master@dmosk.ru
Однако, если сторонний почтовый сервер работает по шифрованному каналу и требует аутентификацию, необходимо ввести следующее:
echo «Test text» | mail -v -s «Test title» -S smtp=»smtp.dmosk.ru:587″ -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user=»master@dmosk.ru» -S smtp-auth-password=»password» -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from=postmaster@dmosk.ru master@dmosk.ru
* где smtp.dmosk.ru — сервер smtp; 587 — порт для подключения к серверу отправки; smtp-use-starttls указывает на использование шифрования через TLS; smtp-auth=login задает аутентификацию с использованием логина и пароля; smtp-auth-user и smtp-auth-password — соответственно логин и пароль; ssl-verify=ignore отключает проверку подлинности сертификата безопасности; nss-config-dir указывает на каталог с базами nss; from задает поле FROM
Step 2: Setting Up Permissions
PostfixAdmin requires a directory, and the web server needs read and write access to this directory. We also need to change the SELinux context to make it writable. So run the following commands.
Apache
sudo mkdir /var/www/postfixadmin/templates_c sudo setfacl -R -m u:apache:rwx /var/www/postfixadmin/templates_c/ sudo chcon -t httpd_sys_rw_content_t /var/www/postfixadmin/templates_c/ -R
Nginx
sudo mkdir /usr/share/nginx/postfixadmin/templates_c sudo setfacl -R -m u:nginx:rwx /usr/share/nginx/postfixadmin/templates_c/ sudo chcon -t httpd_sys_rw_content_t /usr/share/nginx/postfixadmin/templates_c/ -R
By default, SELinux forbids Apache/Nginx to make network requests to other servers, but later Apache/Nginx needs to request TLS certificate status from Let’s Encrypt CA server for OCSP stapling, so we need to tell SELinux to allow Apache/Nginx with the following command.
sudo setsebool -P httpd_can_network_connect 1
If you use Nginx, then you also need to run the following command to give the nginx user read and write permissions to 3 directories.
sudo setfacl -R -m u:nginx:rwx /var/lib/php/opcache/ /var/lib/php/session/ /var/lib/php/wsdlcache/
Restart Apache/Nginx.
sudo systemctl restart httpd sudo systemctl restart nginx
Hosting
Note: PostfixAdmin needs to be run as its own user and group (i.e. ). It’s using , and for configurations, template caches and (potentially) sockets (respectively)!
Apache
This article or section needs expansion.
php-fpm
Include the following configuration in your Apache HTTP Server configuration (i.e. ) and restart the web server:
/etc/httpd/conf/postfixadmin.conf
Alias /postfixadmin "/usr/share/webapps/postfixadmin/public" <Directory "/usr/share/webapps/postfixadmin/public"> DirectoryIndex index.html index.php <FilesMatch \.php$> SetHandler "proxy:unix:/run/postfixadmin/postfixadmin.sock|fcgi://localhost/" </FilesMatch> AllowOverride All Options FollowSymlinks Require all granted SetEnv PHP_ADMIN_VALUE "open_basedir = /tmp/:/usr/share/webapps/postfixadmin:/etc/webapps/postfixadmin/:/var/cache/postfixadmin/templates_c" </Directory>
Create a pool for postfixadmin and restart php-fpm.service:
/etc/php/php-fpm.d/postfixadmin.conf
user = postfixadmin group = postfixadmin listen = /run/postfixadmin/postfixadmin.sock listen.owner = http listen.group = http pm = ondemand pm.max_children = 4
Note: If using php7.4, change the settings to the following:
/etc/php/php-fpm.d/postfixadmin.conf
user = postfixadmin group = postfixadmin listen = /run/postfixadmin/postfixadmin.sock listen.acl_users = http listen.acl_groups = http pm = ondemand pm.max_children = 4
Then override the default tmpfiles rule creating the directory :
cp /usr/lib/tmpfiles.d/postfixadmin.conf /etc/tmpfiles.d/
And append the following rule to it :
/etc/tmpfiles.d/postfixadmin.conf
... a+ %t/postfixadmin - - - - group:root:rwx
Then reboot.
To only allow localhost access to postfixadmin (for heightened security), add this to the previous directive:
Order Deny,Allow Deny from all Allow from 127.0.0.1
Nginx
Nginx can proxy application servers such as and uWSGI, that run a dynamic web application.
The following examples describe a folder based setup over a non-default port (for simplicity).
Note: For server entry management in nginx have a look at .
Note: Postfixadmin ships a configuration for uWSGI.
php-fpm
/etc/php/php-fpm.d/postfixadmin.conf
user = postfixadmin group = postfixadmin listen = /run/postfixadmin/postfixadmin.sock listen.owner = http listen.group = http pm = ondemand pm.max_children = 4
Note: If using php7.4, change the settings to the following:
/etc/php/php-fpm.d/postfixadmin.conf
user = postfixadmin group = postfixadmin listen = /run/postfixadmin/postfixadmin.sock listen.acl_users = http listen.acl_groups = http pm = ondemand pm.max_children = 4
Then override the default tmpfiles rule creating the directory :
cp /usr/lib/tmpfiles.d/postfixadmin.conf /etc/tmpfiles.d/
And append the following rule to it :
/etc/tmpfiles.d/postfixadmin.conf
... a+ %t/postfixadmin - - - - group:root:rwx
Then reboot.
You will need to at least activate the and extensions in . Make sure you also add to open_basedir in your php.ini. Restart php-fpm for all these to take effect.
Add the following configuration for nginx and restart it.
/etc/nginx/sites-available/postfixadmin.conf
server { listen 8081; server_name postfixadmin; root /usr/share/webapps/postfixadmin/public/; index index.php; charset utf-8; access_log /var/log/nginx/postfixadmin-access.log; error_log /var/log/nginx/postfixadmin-error.log; location / { try_files $uri $uri/ index.php; } location ~* \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; include fastcgi_params; fastcgi_pass unix:/run/postfixadmin/postfixadmin.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; } }
uWSGI
Install , create a per-application socket for uWSGI (see for reference) and the unit.
Add the following configuration for nginx and restart nginx.
/etc/nginx/sites-available/postfixadmin.conf
server { listen 8081; server_name postfixadmin; root /usr/share/webapps/postfixadmin/public/; index index.php; charset utf-8; access_log /var/log/nginx/postfixadmin-access.log; error_log /var/log/nginx/postfixadmin-error.log; location / { try_files $uri $uri/ index.php; } # pass all .php or .php/path urls to uWSGI location ~ ^(.+\.php)(.*)$ { include uwsgi_params; uwsgi_modifier1 14; uwsgi_pass unix:/run/postfixadmin/postfixadmin.sock; } }
Настройка системы
Настраиваем планировщик cron для синхронизации времени:
crontab -e
И добавляем следующую строку:
0 0 * * * /sbin/ntpdate ru.pool.ntp.org
* в данном примере команда будет выполняться каждый день в 00:00.
* путь к исполняемому скрипту ntpdate может быть другой. Если при запуске /sbin/ntpdate система выдаст ошибку No such file or directory, запустите which ntpdate, чтобы узнать правильный путь к скрипту.
Задаем часовой пояс и выполняем синхронизацию времени:
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
ntpdate ru.pool.ntp.org
* если система выдаст ошибку, установите утилиту командой yum install ntpdate или yum install ntp.
Задаем имя сервера:
vi /etc/hostname
mailer.dmosk.ru
* необходимо задать полное доменное имя (FQDN), по возможности, в том домене, с которого будем отправлять сообщения. В данном примере имя сервера — mailer, домен — dmosk.ru.
Сразу применяем настройку имени хоста:
hostname mailer.dmosk.ru
Настраиваем брандмауэр:
firewall-cmd —permanent —add-port=25/tcp
firewall-cmd —reload
* в данном случае мы открыли 25 SMTP-порт для отправки электронных писем.