Postfix (An alternative to Sendmail)

Table of Contents

1. Postfix

Postfix 是 Wietse Venema 在 IBM 的 GPL 协议之下开发的 MTA(邮件传输代理)软件,它是 Sendmail 的一个代替品。

一般地,我们常常使用 Postfix 服务程序提供 SMTP 发件服务,使用 Dovecot 服务程序提供 POP3/IMAP 收件服务。

1.1. 安装

安装 Postfix,并重启它:

$ sudo yum install postfix
$ sudo systemctl restart postfix.service

检测一下 Postfix 有没有正常启动(检测 SMTP 的默认端口 25 是否在监听状态):

$ sudo lsof -i :25
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
master  31112 root   13u  IPv4 89436528      0t0  TCP localhost:smtp (LISTEN)
master  31112 root   14u  IPv6 89436529      0t0  TCP localhost:smtp (LISTEN)
$ ps -fwww 31112
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
root     31112     1  0 00:17 ?        Ss     0:00 /usr/libexec/postfix/master -w

1.2. 安装 mail 客户端

在命令行中发送邮件可以使用 mail 命令,如果提示“mail command not found”,则需要先安装它。

如果是 Redhat 系列,则可以这样安装它:

$ sudo yum install mailx

如果是 Debian 系列,则可以这样安装它:

$ sudo apt-get install mailutils

2. Postfix 基本使用

2.1. 发送邮件实例

下面是命令行中使用 mail 发送邮件的实例(默认读取标准输入作为邮件正文):

$ echo "hello world" | mail -v -s "subject1" yourmail@sina.com

执行完上面命令后,会把邮件放到发送队列中。

2.2. 查看发送队列(mailq)

使用 mailq 可以列出当前在 Postfix 发送队列中的全部邮件:

$ mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
AC583E806E*     542     May  8 00:03:01  ec2-user@ip-172.181.3.1.compute.internal
                                         yourmail@sina.com

-- 0 Kbytes in 1 Request.

如果 Postfix 发送队列中没有邮件,则显示:

$ mailq
Mail queue is empty

2.3. 删除发送队列的全部邮件

使用 postsuper -d ALL 可以删除当前等待发送队列的全部邮件,包含发送失败的退信。

2.4. 查看 log

Postfix 邮件的 log 位置是:/var/log/maillog,通过这个文件可以确认邮件发送状态。

2.5. 实例:磁盘空间占用过大时发送邮件

使用 df 可以查看磁盘使用空间情况,如:

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/xvda2      10473452 8961544   1511908  86% /
devtmpfs         3981968       0   3981968   0% /dev
tmpfs            4004172       0   4004172   0% /dev/shm
tmpfs            4004172  435160   3569012  11% /run
tmpfs            4004172       0   4004172   0% /sys/fs/cgroup
tmpfs             800836       0    800836   0% /run/user/1000

下面脚本可以实现磁盘空间占用大于等于 90%时,发送邮件报警:

#!/bin/bash

num=`df | awk '$6=="/" {print int($5)}'`  # 第6个字段为/时,把第5个字段转为整数(丢掉了百分号)
if [[ $num -ge 90 ]]; then
    echo "disk space is ${num}%" | mail -s 'disk space alert (>= 90%)' youremail@sina.com
fi

Author: cig01

Created: <2018-11-10 Sat>

Last updated: <2019-05-09 Thu>

Creator: Emacs 27.1 (Org mode 9.4)