پرش به محتوا

ارسال ایمیل هشدار سرور با Postfix از طریق SMTP احرازشده

Postfix را فقط برای ارسال تنظیم کنید تا هشدارهای سرور (cron، dnf-automatic، smartd) از طریق سرور ایمیل سازمان با TLS و نام کاربری ارسال شوند.

Rocky Linux 10سطح: متوسطبرای: Rocky Linux 10، AlmaLinux 10، CentOS Stream 10، Rocky Linux 9، AlmaLinux 9به‌روزرسانی: ۱۷ آبان ۱۴۰۵

سرورها پیام‌های مهمی تولید می‌کنند: خطای cron، خرابی دیسک، شکست بکاپ. بدون ارسال ایمیل، این پیام‌ها در /var/spool/mail/root می‌مانند و کسی آن‌ها را نمی‌خواند.

۱. نصب

bash
sudo dnf install -y postfix cyrus-sasl-plain s-nail
sudo systemctl enable --now postfix

۲. فقط ارسال، فقط محلی

bash
sudo postconf -e 'inet_interfaces = loopback-only'
sudo postconf -e 'mydestination ='
sudo postconf -e 'myhostname = web01.corp.sahor.ir'
sudo postconf -e 'relayhost = [mail.sahor.ir]:587'
sudo postconf -e 'smtp_tls_security_level = encrypt'
sudo postconf -e 'smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt'
sudo postconf -e 'smtp_sasl_auth_enable = yes'
sudo postconf -e 'smtp_sasl_security_options = noanonymous'

inet_interfaces = loopback-only یعنی سرور از شبکه ایمیل دریافت نمی‌کند و relay باز نمی‌شود.

۳. نام کاربری و رمز

نوع پایگاه داده‌ی جدول‌های Postfix در نسخه‌های مختلف فرق دارد: hash در نسخه‌ی ۹ و lmdb در نسخه‌ی ۱۰، چون Berkeley DB حذف شده است. آن را از خود Postfix بپرسید:

bash
DBT=$(postconf -h default_database_type); echo "$DBT"
echo '[mail.sahor.ir]:587 alerts@sahor.ir:Mail-Password' | sudo tee /etc/postfix/sasl_passwd >/dev/null
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap "$DBT:/etc/postfix/sasl_passwd"
sudo postconf -e "smtp_sasl_password_maps = $DBT:/etc/postfix/sasl_passwd"

۴. فرستنده و گیرنده‌ی پیام‌های root

بیشتر سرورهای ایمیل فقط اجازه می‌دهند با آدرس همان حساب ارسال کنید:

bash
echo '/.+/ alerts@sahor.ir' | sudo tee /etc/postfix/sender_canonical >/dev/null
sudo postconf -e 'sender_canonical_maps = regexp:/etc/postfix/sender_canonical'
echo 'root: ops@sahor.ir' | sudo tee -a /etc/aliases && sudo newaliases
sudo postfix check && sudo systemctl restart postfix

۵. آزمایش

bash
echo "test from $(hostname)" | mail -s "Postfix relay test" root
sudo journalctl -u postfix -n 20 --no-pager
mailq

خط status=sent (250 ...) در لاگ یعنی ارسال موفق بوده است. خطای SASL authentication failed یعنی نام کاربری یا رمز اشتباه است. خطای TLS is required یعنی سرور مقصد روی این پورت TLS ندارد.

۶. SELinux

ارسال به پورت 587 در سیاست پیش‌فرض مجاز است. اگر سرور ایمیل روی پورت غیر استاندارد است:

bash
sudo semanage port -l | grep smtp_port_t
sudo semanage port -a -t smtp_port_t -p tcp 2525