Trimite email prin Mailgun pe Rocky Linux 9 / CentOS 9

Pentru trimiterea de email-uri se poate folosi un serviciu extern. Tutorialul arată ce și cum să instalezi/configurezi Rocky Linux 9 / CentOS 9 pentru a trimite email-urile prin Mailgun.

Condiții prealabile

Asigură-te că ai configurat înainte Mailgun și ai la îndemână host, utilizator, parolă. De asemenea trebuie să configurezi firewall-ul să permită traficul OUTGOING pe portul 2525/TCP.

Instalare și configurare Postfix

Instalarea este simplă:

# dnf install postfix cyrus-sasl-plain cyrus-sasl-md5

Apoi configurăm serviciului proaspăt instalat:

# vim /etc/postfix/main.cf

În acest fișier, căutăm, decomentăm dacă este nevoie, și setăm conform instrucțiunilor:
– myhostname
– mydomain
– myorigin

Mai departe urmează secțiunea relayhost unde setăm astfel:

relayhost = [smtp.eu.mailgun.org]:2525

La finalul fișierului modificăm sau adăugam următoarele configurări:

smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

Salvăm fișierul și-l închidem. La smtp_sasl_password_maps am specificat un fișier, prin urmare trebuie să-l creăm:

# cat > /etc/postfix/sasl_passwd << EOF

Apoi scriem astfel:

> [smtp.eu.mailgun.org]:2525 MAILGUN_USER:MAILGUN_PASS
> EOF

Folosim apoi postmap pentru a genera un fișier .db, apoi ștergem fișierul care conține parola în clar și setăm permisiunile fișierului .db:

# postmap /etc/postfix/sasl_passwd
# rm /etc/postfix/sasl_passwd
# chmod 600 /etc/postfix/sasl_passwd.db

În final pornim postfix și am terminat

# systemctl start postfix
# systemctl enable postfix

Cam atât a fost. Totul trebuie să funcționeze excelent.

Testarea

Putem face și un test, dar pentru asta avem nevoie de s-nail (care înlocuiește mailx de la versiunile mai vechi)

# dnf install s-nail

Apoi dăm comanda pentru a fi trimis un email

# echo 'Test passed.' | mail -s 'Test-Email' adresa_email@example.com

Dacă vrei să vezi și în loguri, folosește comanda:

# tail -n 5 /var/log/maillog

dkim-filter: smfi_opensocket() failed

dkimÎncă un post într-o limbă străină (de data asta despre DKIM) pentru cei care nu au nicio treabă cu calculatoarele, însă, aşa cum am scris în postul iniţial, aici găsiţi problemele care mi-au dat de cap şi cum le-am rezolvat. Unele ajută o categorie de oameni, altele altă categorie şi tot aşa. Oricum, probabil că nu vor mai fi în următoarea perioadă posturi despre servere deoarece mă apropii de finalizat reconfigurarea unui server şi îmi mut focusul. Dar să trecem la subiect.

DKIM-milter semnează e-mail-urile care urmează a fi trimise de acel server. Se setează în Postfix ca mailurile să treacă mai întâi pe la semnarea DKIM. N-o să intru în detalii despre acest lucru pentru că nu acesta este subiectul (mai discutăm în comentarii dacă este cazul).

Eroarea era la încercarea de a porni dkim-milter şi era cât se poate de aiurea:

/etc/init.d/dkim-milter start
Starting DomainKeys Identified Mail Milter (dkim-filter): dkim-filter: smfi_opensocket() failed
                       [FAILED]

În momentul în care apărea această eroare, în /var/log/maillog scria:

Jun 10 21:16:48 nutrienti dkim-filter[6758]: Sendmail DKIM Filter: Unable to bind to port inet:8891@localhost: Cannot assign requested address
Jun 10 21:16:48 nutrienti dkim-filter[6758]: Sendmail DKIM Filter: Unable to create listening socket on conn inet:8891@localhost
Jun 10 21:16:48 nutrienti dkim-filter[6758]: smfi_opensocket() failed

Eu nu mă aştept ca pentru toată lumea să existe aceeaşi rezolvare, însă pentru cei care au serverul configurat similar, e posibil să dea de problema aceasta.

Practic dkim-milter încerca să asculte pe 8891@localhost conform setărilor din /etc/sysconfig/dkim-milter .
Problema a fost că localhost este setat ca IPv6 şi el încerca să se conecteze la 8891@::1 . Singurul lucru pe care l-am făcut a fost să schimb 8891@localhost cu 8891@127.0.0.1 .

Pentru a putea folosi serviciul prin Postfix, trebuie schimbat şi în Postfix acest lucru.

UPDATE 25.02.2015

Eroarea anterioară am primit-o în CentOS 6.X. Trecând la CentOS 7, am avut surpriza să dau din nou de această eroare (norocul meu că mai erau şi alte detalii acolo). Situaţia: dkim-milter pornea prima dată după instalare, însa după reboot, dădea failed. Intrând în investigaţii am constatat că dispărea folderul /var/run/dkim-milter şi singura soluţie găsită a fost să creez un script, care la fiecare reboot să fie lansat şi să creeze folderul înainte să încerce programul să se lanseze.

Scriptul (să-i spunem startdkim.sh):

#!/bin/bash
mkdir /var/run/dkim-milter
chown dkim-milter:dkim-milter /var/run/dkim-milter

Acesta se poate pune oricunde. De exemplu în /root/cron_scripts/startdkim.sh . Se face scriptul executabil:

cd /root/cron_scripts
chmod +x startdkim.sh

Apoi se editează crontab

crontab -e

şi se adaugă în prima linie să pornească la fiecare reboot:

@reboot /root/cron_scripts/startdkim.sh > /dev/null 2>&1

Crontab pe scurt

Semnificaţia parametrilor

*  *  *  *  *   comanda de executat
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───── ziua săptămânii (0 – 6) (0 este Duminică, sau foloseşte numele în eng)
│ │ │ └────────── luna (1 – 12)
│ │ └─────────────── ziua din lună (1 – 31)
│ └──────────────────── ora (0 – 23)
└───────────────────────── minutul (0 – 59)

Se asemeni se poate folosi şi pentru a executa fişierele (şi nu numai) din X în X… ce vrei tu.
De exemplu pentru a rula un fişier din 5 în 5 minute, foloseşte

*/5 * * * * /calea/către/fişier

Dacă mai ai alte remarci de făcut, lasă un comentariu.