sendmail是用来发邮件的,很多地方需要用到,例如米扑博客自动发送评论、svn自动发送提交、新用户注册、修改密码等等很多场景必须用到自动发送邮件。

sendmail 特性简介:

1)使用sendmail命令发的邮件队列,默认保存在/var/spool/mqueue目录下

2)邮件消息可能由于很多原因而排入队列,例如远程主机不响应邮件连接的请求,邮件系统会将这些消息排入队列,稍后重试发送,也就是按一定的时间间隔处理队列,而不是立即处理

3)邮件队列内容可以使用 mailq    sendmail -bp 命令查看

 

sendmail 官网http://www.sendmail.org

mailx 官网http://heirloom.sourceforge.net/mailx.html

postfix 官网http://www.postfix.org

 

系统环境

CentOS 7.5  x86_64

Apache/2.4.34

nginx/1.14.0

 

一、准备工作

1、启动 sendmail 服务时,systemctl status sendmail.service 遇到以下错误提示:

Jul 29 17:28:33 mimvp sendmail[1755]: My unqualified host name (mimvp) unknown; sleeping for retry
Jul 29 17:29:33 mimvp sendmail[1755]: unable to qualify my own domain name (mimvp) -- using short name

解决:

问题的原因是 hostname = mimvp 没有指定域名(格式:xxx.com),在 /etc/hosts 文件中指定其域名

127.0.0.1  mimvp mimvp.com

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1   mimvp mimvp.com
::1         mimvp mimvp.com

 

2、概念区别

客户端,邮件用户代理(MUA,Mail User Agent)

发送端,邮件传送代理(MTA,Mail Transport Agent)

中继端,邮件分发代理(MDA,Mail Deliver Agent)

通俗的说MUA就是用户使用的客户端,而MTA则是真正发送邮件的发送进程,MUA编写的邮件最终也交由MTA发送至目标端。

mail 和 mailx 即为负责查看、编写邮件和向MTA发送邮件的MUA,mailx是mail的功能加强版。

sendmail 负责邮件在网络上传输的MTA,将邮件从一个MTA传送至另一个MTA。

mail 编写的邮件,得靠sendmail来投递邮件

 

二、安装 sendmail、mailx

yum -y install sendmail* mailx

# yum -y install sendmail* mailx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package sendmail-cf-8.14.7-5.el7.noarch already installed and latest version
Package sendmail-doc-8.14.7-5.el7.noarch already installed and latest version
Package sendmail-8.14.7-5.el7.x86_64 already installed and latest version
Package sendmail-sysvinit-8.14.7-5.el7.noarch already installed and latest version
Package sendmail-milter-8.14.7-5.el7.x86_64 already installed and latest version
Package sendmail-devel-8.14.7-5.el7.x86_64 already installed and latest version
Package mailx-12.5-19.el7.x86_64 already installed and latest version

 

三、发送测试邮件

0、发送邮件的命令格式

mail -v –s '邮件主题' –c '抄送地址' –b '密送地址' xxx@mimvp.com  < 要发送的邮件内容

这里需要特别说明,命令 mail 实际是 mailx ,二者是软链接,一般用 mail 更简洁

# which mail
/usr/bin/mail
# which mailx
/usr/bin/mailx
# ll /usr/bin/mail
lrwxrwxrwx 1 root root 5 Jul 30 12:01 /usr/bin/mail -> mailx

 

1、发送文件内容

mail -v -s "subject_title" xxx@mimvp.com < /etc/passwd

 

2、通过管道发送内容

echo "hello mimvp.com" | mail -v -s "" xxx@mimvp.com

 

3、交互输入发送内容

mail -v -s "subject_title" xxx@mimvp.com

输入要发送的内容,Ctrl + D 结束输入

# mail -s "subject_title" xxx@mimvp.com
i love mimvp.com
EOT

 

四、配置文件

sendmail是Linux下优秀的邮件系统,在不做任何设定的情况下,sendmail发出邮件的邮箱源地址形如 xxx@localhost.localdomain

这种地址几乎会被所有的邮箱认定为SPAM(垃圾邮件)或直接拒收,因此需要配置发送者的信息如 xxx@mimvp.com

vim /etc/mail.rc

在末尾添加如下内容

set from=xxx@mimvp.com
set smtp=smtp.exmail.qq.com
set smtp-auth-user=xxx@mimvp.com
set smtp-auth-password=mimvp-password
set smtp-auth=login

说明:

from 是发送的邮件地址

smtp 是发生的外部smtp服务器的地址

smtp-auth-user 是外部smtp服务器认证的用户名,一般与from发件人邮件地址相同

smtp-auth-password 是外部smtp服务器认证的用户密码,163邮箱需要授权码

smtp-auth 是邮件认证的方式,一般为登录认证

特别提醒:以上配置默认采用 smtp 端口号25发送邮件,但阿里云、腾讯云等都禁止了端口号25,因此需配置ssl 465端口,详见米扑博客Centos7 配置 sendmail、postfix 端口号25、465

解释说明:默认在centos7上/etc/mail.rc 配置文件里没有上述配置项,需要自己添加,那可能会问你写这个干嘛用?问的好,其实呢!我们不写上述配置就可以直接使用sendmail,但是对于一些比较特殊邮箱使用的协议不一样,而我们这默认用的是SMTP协议;例如QQ邮箱默认协议不一样,所以会直接丢到垃圾桶不会给我们提示收件信息,而我们做这一步的主要作用是,指定一下邮箱具体使用(xxx@mimvp.com,而不是xxx@localhost.localdomain,如:邮箱账户、邮箱使用协议、账户名和密码等等。这样呢,当邮箱收到邮件后会提示你有未查看的邮件,不会像之前一样不提示直接丢到垃圾桶,总之一句话,要想用起来减少问题更好用,尽量添加以上这些指定信息!

 

sendmail 配置 SMTP 认证(可选,推荐跳过

1)CentOS 默认安装了 saslauthd ,若没有安装可自行安装

yum -y install saslauthd

 

2)开启 saslauthd 服务

# systemctl start saslauthd 
# systemctl enable saslauthd

 

3)修改配置文件

vim /etc/mail/sendmail.mc

修改配置项,将下面两行的dnl去掉

dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

在sendmail文件中,dnl表示该行为注释行,是无效的,因此通过去除行首的dnl字符串可以开启相应的设置行。

 

4)设置 sendmail 服务的网络访问权限

vim /etc/mail/sendmail.mc

修改配置项,将127.0.0.1改为0.0.0.0,意思是任何主机都可以访问Sendmail服务,若只是本机发送邮件则不用修改。

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

如果仅让某一个网段能够访问到Sendmail服务,将127.0.0.1改为形如192.168.1.0/24的一个特定网段地址。

 

5)生成 sendmail 配置文件

Sendmail的配置文件由m4来生成,m4工具在sendmail-cf包中。

如果系统无法识别m4命令,说明sendmail-cf软件包没有安装。

生成Sendmail的配置文件:

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

 

6)sendmail 邮件域名配置

配置sendmail使用合法的域名分两步,修改sendmail的配置文件和添加域名MX记录。

a)修改sendmail的配置文件

sendmail可以直接使用 “-r account@domain.com” 参数来以任意源地址发送邮件,但目前主流的邮箱都会将源地址和反向解析IP进行比较,如果解析不到或是解析的IP不匹配,轻则将邮件直接归为SPAM,严重的就直接拒绝接收。

b)添加域名MX记录

MX记录(Mail Exchanger Record)主要是接收邮件时使用,即当投递一封新邮件时,会查询收件人域名的MX记录,然后通过MX记录得到的IP地址进行投递。同时邮件厂商在接收邮件的时候也会将源地址和MX记录进行比较,作为垃圾邮件的判断标准之一。

第一步:添加域名

(1) 将域名加入到local-host-names文件

vim /etc/mail/local-host-names

添加如下内容

# local-host-names - include all aliases for your machine here.
mimvp.com

(2) 修改submit.cf文件

vim /etc/mail/submit.cf

找到行 #Dj$w.Foo.COM,修改为

# my official domain name
# ... define this only if sendmail cannot automatically determine your domain
#Dj$w.Foo.COM

Djmimvp.com

 

7)本机ip与mimvp.com域名映射

vim /etc/hosts

添加如下内容

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1  mimvp mimvp.com

 

保存后,重启 sendmail 服务

systemctl restart sendmail.service

问题与解决

1、163和qq企业邮箱开启smtp服务时必须设置授权码,在/etc/mail.rc  smtp-auth-password设置成授权码,不然会出错,详见米扑博客:POP3、SMTP、IMAP 的作用和联系

      smtp-server: 535 Error: authentication failed

2、163和qq企业邮箱不开启smtp服务,也会出错,开启smtp方法详见米扑博客:POP3、SMTP、IMAP 的作用和联系

       smtp-server: 550 User has no permission

3、发送提示错误

Failed to restart sendmail.service: Unit sendmail.service failed to load: No such file or directory.

解决:

a)查看日志 vim /var/log/maillog

Jul 30 09:10:01 mimvp-sz postfix/sendmail[5601]: fatal: parameter inet_interfaces: no local interface found for ::1

b)发现是 postfix 配置文件有错误,需要修改配置文件

vim /etc/postfix/main.cf

inet_interfaces = localhost  修改为 inet_interfaces = all

3)重启 postfix ,使配置生效

systemctl restart postfix

 

五、管理邮件队列

查看发送邮件队列命令:mailq    sendmail -bp

# mailq
/var/spool/mqueue is empty
                Total requests: 0

查看MSP队列的滞留情况:

mailq -Ac   // 等价于sendmail -bp -Ac

/usr/sbin/sendmail -q -v          # 对MTA队列强制送信
/usr/sbin/sendmail -q -v -Ac    # 对MSP队列强制送信

注:如执行完以上命令后,队列中仍然还有很多邮件,这时需要多次执行以上命令,直到邮件发送完为止。

参数说明:

-q 立即处理队列的内容.
-v 显示进度详细信息
-Ac 读取MSP队列(默认是读取MTA队列)

sendmail 接受到的信件在用户取走之前,将暂时存储在 /var/spool/mail 目录下面,存储的方法非常简单,就是每个有待读邮件的用户一个文件:

# ls -l /var/spool/mail | more
total 19364
-rw-rw---- 1 www mail 7559035 Feb 28 22:04 www
-rw-rw---- 1 yangmipu mail 514 Nov 7 01:32 yangmipu
-rw-rw---- 1 mimvp mail 515 Feb 28 08:35 mimvp

如果一个用户有多封电子邮件,那么这些邮件就被简单地连接在一起构成一个大文件(所以你会看到非常巨大的邮件文件)

查看发送队列的邮件:

ls /var/spool/mqueue/

清空等待发送的队列,先删除,后创建目录:

rm /var/spool/mqueue/*
mkdir /var/spool/mqueue

 

六、查看分析日志

sendmail 日志目录,一般会有两个:

/var/log/maillog       // 记录所有的发送日志

/var/log/maillog-20180729    // 记录所有的错误日志

查看监控实时日志记录:

tail -f /var/log/mail

查看邮件系统状态的命令:mailstats

# mailstats 
Statistics from Sun Jul 29 18:54:01 2018
 M   msgsfr  bytes_from   msgsto    bytes_to  msgsrej msgsdis msgsqur  Mailer
 9        9         13K        0          0K        0       0       0  local
=====================================================================
 T        9         13K        0          0K        0       0       0
 C        9                    0                    0

 

七、sendmail 定时发送

sendmail 设置每30秒处理一下邮件队列,首先邮件默认保存的目录下面是否有邮件,然后有ll命令显示邮件文件,然后在看一下邮件是否定时在发

查看默认定时间隔:

vim /etc/sysconfig/sendmail

# cat /etc/sysconfig/sendmail
SENDMAIL_OPTS="-q1h"

说明:

-q1h 表示默认是1小时发送一次

s
m
h 小时
d
w

设置成每隔1分钟检查发送一次

SENDMAIL_OPTS="-q1m"

保存后,重启 sendmail 服务

systemctl restart sendmail.service

 

八、sendmail 命令

sendmail 命令是一款著名的电子邮件传送代理程序,也就是平常说的电子邮件服务器,它基于标准的简单邮件传输协议(SMTP)

语法:sendmail (选项)

选项:

-bd:以守护进程方式运行指令;
-bD:以前台运行方式运行;
-bi:初始化别名数据库;
-bm:以常规发送电子邮件;
-bp:显示邮件的发送队列;
-C:指定配置文件;
-D:将调试的输出信息保存到日志文件,而不显示在标准输出设备上;
-F:指定邮件发送者全名;
-n:禁止使用邮件别名功能;
-f:指定发件人的名字;
-q:设置处理邮件队列中邮件的时间间隔。

 

 

参考推荐

sendmail 命令的使用参数详解

CentOS7 使用 postfix 发送邮件

Linux shell 发送 email 邮件

Linux shell 发送 email 附件

CentOS 6使用mutt+msmtp发送邮件

POP3、SMTP、IMAP 的作用和联系

Linux用Sendmail架设Mail服务器

CentOS SendMail总结

Python学习入门(5)——发送邮件

Python 七种邮件内容发送方法

Python smtp 群发邮件

8款免费企业邮箱

QQ企业邮箱集成JIRA邮件

CenterOS 搭建 SVN Server

SAE搭建WordPress