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