Продовження налаштування нового сервера для RTFM. Наступний крок – налаштувати можливість відправки пошти з EC2, бо тут можуть бути і важливі листи юзера root, і сам RTFM відправляє листи.
Думав робити з AWS Simple Email Service – чисто для того, аби згадати як з ним працювати, але – не такий вже він і Simple, бо верифікація домену затягнулась.
Тому забив, і зробив зі старим другом – Postfix, який відправляє пошту через налаштований relay – звичайний ящик в Gmail.
OMG… Останній раз про Postfix писав в червні 2013.
В принципі – все аналогічно тому, як описано в пості FreeBSD: налаштування DragonFly Mail Agent для пошти root:
- Postfix у нас грає роль MTA (Mail Transfer Agent) – приймає листи від клієнтів і передає до SMTP Relay host
- Relay: Gmail SMTP – аутентифікуємось з логіном-паролем, які задамо в Postfix, і через Gmail відправляємо листи
Приклад на Amazon Linux версії AL2023, але те саме рішення можна для будь-якої системи.
Встановлюємо Postfix:
[root@ip-10-0-1-79 ~]# dnf install postfix cyrus-sasl-plain mailx
cyrus-sasl-plain вже має бути в системі, але про всяк випадок вказуємо і його, а mailx – зручний MUA (Mail User Agent), для тестів або для використання в скриптах.
Запускаємо:
[root@ip-10-0-1-79 ~]# systemctl enable --now postfix Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /usr/lib/systemd/system/postfix.service.
Для аутентифікації в Gmail краще створити окремий пароль – процес описував в Створення Google Mail App Passwords.
Налаштовуємо аутентифікацію Postfix в Gmail – файл /etc/postfix/sasl_passwd, формат:
[smtp.gmail.com]:587 [email protected]:apppassword
З postmap генеруємо sasl_passwd.db, бо Postfix не використовує файл /etc/postfix/sasl_passwd напряму:
[root@ip-10-0-1-79 ~]# postmap /etc/postfix/sasl_passwd [root@ip-10-0-1-79 ~]# chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
І в самому Postfix /etc/postfix/main.cf додаємо:
relayhost: куди передаємо пошту для відправки, в нашому випадку Gmail SMTPsmtp_sasl_auth_enable: вмикаємо SMTP аутентифікацію (логін/пароль) з Simple Authentication and Security Layer (SASL)smtp_sasl_password_maps: шлях до файлу з credentials до Gmailsmtp_sasl_security_options = noanonymous: забороняємо анонімну аутентифікаціюsmtp_tls_security_level = encrypt: обов’язковий TLSsmtp_tls_CAfile: CA сертифікати для перевірки Gmail SMTPinet_protocols = ipv4: якщо не налаштовували IPv6 для VPC – то дозволяємо тільки IPv4
Робимо з postconf, бо деякі параметри вже є в конфігу – postconf замінить існуючі, а не додасть дублі:
[root@ip-10-0-1-79 ~]# postconf -e "relayhost = [smtp.gmail.com]:587" [root@ip-10-0-1-79 ~]# postconf -e "smtp_sasl_auth_enable = yes" [root@ip-10-0-1-79 ~]# postconf -e "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" [root@ip-10-0-1-79 ~]# postconf -e "smtp_sasl_security_options = noanonymous" [root@ip-10-0-1-79 ~]# postconf -e "smtp_tls_security_level = encrypt" [root@ip-10-0-1-79 ~]# postconf -e "smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt"
Рестартимо, перевіряємо логи:
[root@ip-10-0-1-79 ~]# systemctl restart postfix [root@ip-10-0-1-79 ~]# journalctl -f -u postfix.service
Змінюємо адресу юзера root – редагуємо /etc/aliases:
... # Basic system aliases -- these MUST be present. mailer-daemon: postmaster postmaster: root # add mailbox for the root user root: [email protected] ...
Оновлюємо базу:
[root@ip-10-0-1-79 ~]# newaliases
І перевіряємо відправку – в одній консолі запускаємо journalctl -f -u postfix.service, в іншій з mailx відправляємо листа до root:
[root@ip-10-0-1-79 ~]# echo "test body" | mailx -s "test postfix" root
Бачимо відправку в логах:
[...] postfix/qmgr[176329]: BB15174EFD: from=<[email protected]>, size=714, nrcpt=1 (queue active) [...] postfix/smtp[176331]: BB15174EFD: to=<[email protected]>, orig_to=<root>, relay=smtp.gmail.com[172.253.116.109]:587, delay=333, delays=332/0.03/0.32/0.59, dsn=2.0.0, status=sent [...] postfix/qmgr[176329]: BB15174EFD: removed
І маємо листа в своєму ящику:
Готово.
Коли вже дописував, то нагуглив документацію AWS Integrating Amazon SES with Postfix – аналогічно до того, що ми робили вище, тільки з використанням SMTP AWS SES.
![]()
