Đếm mail được postfix gởi đi

Mail server cài đặt trên RPi thường phải dùng IP động, IP loại này phần lớn nằm trong blacklists khiến cho email gởi đi có thể bị từ chối.

Cách giải quyết thông thường là dùng relay host. Mail server của chúng ta gởi nhờ email qua trung gian các mail server uy tín khác. Các SMTP relay này phần lớn là chỉ miễn phí 200-300 email một ngày, riêng Gmail miễn phí 500 email một ngày với điều kiện không gởi trong một lần.

Với doanh nghiệp nhỏ 15-20 nhân viên, có thể dùng 1-2 tài khoản Gmail để gởi mail là đủ. Vấn đề là làm sao đếm số email được gởi qua một tài khoản đã đủ định mức để chuyển sang dùng tài khoản khác.

1. Đếm số email được gởi đi

Postfix không cung cấp phương cách nào cho phép chúng ta theo dõi việc gởi email, chúng ta phải gián tiếp xem xét file ghi chép của postfix /var/log/mail.log

Câu lệnh sau đây đếm số email gởi đi của postfix, chỉ đếm số email gởi đi qua SMTP relay

grep -Pc '(?<=postfix/smtp).*(?= status=sent )' /var/log/mail.log

Tuy nhiên file log này được hệ thống tự động lưu trữ và mở file trắng mới, khiến việc đếm email như trên trở nên không có ý nghĩa.

Các file cấu hình của logrotate ghi trong thư mục /etc/logrotate.d trong đó mail.log được liệt kê trong file rsysloq. Tuy nhiên nếu chúng ta xóa dòng mail.log để tự quản lý việc lưu trữ thì Postfix dừng việc ghi chép vào file log, chúng ta không có thông tin để làm việc.

Có thể tránh cho logrotate tự động lưu trữ mà không can thiệp vào file cấu hình của logrotate bằng cách đổi tên file log của Postfix

sudo postfix stop
sudo postconf maillog_file=/var/log/postfix.log
sudo postfix start

Bây giờ tên file log là postfix.log và khi nào chúng ta đếm được số mail gởi đi đủ định mức (thí dụ 500) thì lưu trữ và mở file trống bằng câu lệnh

postfix logrotate

2. Chuyển sang dùng tài khoản khác

Có thể thay đổi tài khoản của SMTP relay (account Gmail) bằng cách sửa file cấu hình của Postfix, nhưng để có tác dụng thì phải restart Postfix

systemctl postfix restart

Một cách khác là dùng database. Giả sử các tài khoản smtp được ghi trong bảng relayhost

Chúng ta thay đổi account hoạt động bằng cách đặt active=1. Điều đó thực hiện qua một stored function

DELIMITER ;;

CREATE FUNCTION `mailquota`() RETURNS int(11)
  DETERMINISTIC
BEGIN
  select ifnull(min(id), (select min(id) from relayhost where active >= 0)) into @n 
    from relayhost
    where active >= 0 and id > (select id from relayhost where active=1);
  update relayhost set active=if(active=1,0,if(id=@n,1,active));
  RETURN (select quota FROM dbName.relayhost WHERE id=@n);
END;;

DELIMITER ;

3. Script theo dõi số email gởi đi và thay đổi account nếu cần

#!/bin/bash
# Change smtp server when mailing quota is used up
# relayhost.quota, version 20220626
# LNT <lnt@ly-le.info>

QTA=/dev/shm/smtp.qta
LOG=/var/log/postfix.log
[ -e "$QTA" ] && QUOTA=$(<$QTA) || QUOTA=0
cnt=$(grep -Pc '(?<=postfix/smtp).*(?= status=sent )' $LOG &> /dev/null)
if [[ ! -n "$cnt" ]]; then
  mysql -N -h localhost -e "select dbName.mailquota()" > $QTA
elif [ $cnt -ge $QUOTA ]; then
  mysql -N -h localhost -e "select dbName.mailquota()" > $QTA
  postfix logrotate
fi
chmod +x /path/to/relayhost.quota

Đặt chạy tự động qua crontab

*/3 * * * * /path/to/relayhost.quota

hoặc

cat >/etc/cron.d/chkquota <<EOF
*/3 * * * * root /path/to/relayhost.quota &> /dev/null
EOF

Comments Off on Đếm mail được postfix gởi đi

Filed under Software

Comments are closed.