Linux服务器mail程序本身就是调用sendmail来进行邮件发送的,sendmail服务器提供对外的邮件发送功能。CentOS默认不能发送邮件,需要发送邮件的童鞋可以安装一个sendmail程序。
一、搭建sendmail
[root@ProxyServer ~]# yum -y install sendmail
[root@ProxyServer ~]# /etc/init.d/sendmail start
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
[root@ProxyServer ~]# chkconfig sendmail on
[root@ProxyServer ~]# man mail
......
mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops] [-A account]
[-S variable[=value]] to-addr . . .
mailx [-BDdeEHiInNRv~] [-T name] [-A account] [-S variable[=value]] -f [name]
mailx [-BDdeEinNRv~] [-A account] [-S variable[=value]] [-u user]
......
centos7 是 systemctl start sendmail 不用 /etc/init.d/sendmail start
centos7 不需要 chkconfig sendmail on 这是开机启动的意思
man mail 是查看帮助文档的意思
我自己电脑测试了一下:发现 mail命令和mailx命令,都是安装了mailx才有的。所以还应该安装 yum install mailx
1、通过命令行发送邮件
cooldeMacBook-Pro:~ cool$ mail -s "这里写邮件标题" [email protected]
这里写邮件正文
信息
随便写
EOT
cooldeMacBook-Pro:~ cool$
第一行是输入的命令,-s表示邮件的主题,后面的[email protected]则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,可以输入任何文字,比如上面的三行。当邮件正文输入完成后,需要按CTRL+D结束输入。
这样本地电脑可以发送成功到指定邮箱。目标收件箱显示:邮件来自:
“cool@cooldeMacBook-Pro.local
经过测试:-s 后面的 邮件主题 可以不加 双引号,也没有问题,结果和原来一样,寄件人显示 "cool
mail -s test [email protected]
【寄件人”cool 是电脑用户名,寄件地址 cooldeMacBook-Pro.local 是主机的hostname】
cooldeMacBook-Pro:~ cool$ echo $HOSTNAME
cooldeMacBook-Pro.local
同理,centos 上操作和mac系统中一样。
因为线上服务器中我设置的hostname 是cool 【不是xxx.yyy类型】所以163邮箱服务器拒收了,系统退信。原因是邮件地址名 不规范。但是之前没有找到原因,所以在sendmail基础上索性就配置smtp 服务,用来代发送邮件。
2、使用管道进行邮件发送
cooldeMacBook-Pro:~ cool$ echo "hello,echo pip"|mail -s "subject pip" [email protected]
使用管道直接敲入这行命令即可完成邮件的发送,其中echo后的是邮件正文。
3、使用文件进行邮件发送
bikedeMacBook-Pro:~ cool$ mail -s "用文件来填写正文" [email protected] </Users/bike/Desktop/testfile.txt
4、邮件发送附件
很多情况下,我们也需要使用邮件来发送附件,在linux下使用mail命令发送附件也很简单,不过首先需要安装uuencode软件包,这个程序是对二进制文件进行编码使其适合通过邮件进行发送,直接使用centos的yum源可能找不到uuencode命令的包sharutils,我这里使用了网易Yum源。
[root@ProxyServer yum.repos.d]# yum -y install sharutils
[root@ProxyServer yum.repos.d]# uuencode CentOS6-Base-163.repo 163_yum_repo |mail -s "附件" [email protected] < /etc/passwd
[root@ProxyServer yum.repos.d]#
CentOS6-Base-163.repo 文件作为邮件的附件发送出去了。uuencode有两个参数,第一个是要发送的文件CentOS6-Base-163.repo,第二个是显示的文件名称163_yum_repo。
二、发送失败和查看邮件退信
如果提示mail: command not found
[root@ProxyServer ~]# mail -s "password" [email protected] < /etc/passwd
-bash: mail: command not found
那么就是没有安装mail命令,此时需要安装mail命令
[root@ProxyServer ~]# yum install mailx -y
[root@ProxyServer ~]# rpm -qa|grep mail
libreport-plugin-mailx-2.0.9-19.el6.x86_64
mailx-12.4-7.el6.x86_64
procmail-3.22-25.1.el6.x86_64
mailcap-2.1.31-2.el6.noarch
sendmail-8.14.4-8.el6.x86_64
[root@ProxyServer ~]#
总结来说:mailx 是 sendmail 和 Postfix mail 的基础,mail 命令 和 mailx 命令都依赖于 mailx。
输入 mail 或 mailx 命令,可以查看 /var/spool/mail/用户名文件夹(比如root) 下的所有的邮件。【注意安装sendmail软件时,不会再用户根目录下生成一个mbox文件夹】mail -f mbox 命令 用来 显示当前终端 目录下mbox文件夹中的邮件。mail -f 命令默认缺省路径是:(用户根目录比如/Users/cool)/mbox 。所以只安装了sendmail软件的执行 mail -f 命令,会发现找不到目标文件夹。
mac系统下用的是Postfix mail【也就是说安装时会生成一个用户根目录下的mbox文件夹】,mail -f mbox 命令 用来 显示当前终端 目录下mbox文件夹中的邮件。mail -f 命令默认缺省路径是:(用户根目录比如/Users/cool)/mbox 但是奇怪的是 mac下mail 命令显示没有邮件,但是 /Users/cool/mbox 下有邮件。
输入 数字+回车,选择邮件列表中的某个邮件。
输入 空格,翻页查看邮件内容
输入 q +回车 退出邮箱
邮件的查看
mail //出现& 在后台输入命令
Enter键 //查看当前邮件
+ //下一封邮件 — //上一封邮件
d 数字 //删除它几号信件
s 文件名 //将信件保存为文件
r //回信 q //退出
看下文,邮件退信的原因是:550 MI:IMF
•550 MI:IMF 发信人电子邮件地址不合规范。
请参考http://www.rfc-editor.org/关于电子邮件规范的定义;
参考帮助网站:
http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
退信全文:
[root@superguy ~]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 12 messages 3 unread
1 Mail Delivery Subsys Sat Sep 29 07:27 73/2143 "Returned mail: see tr"
2 Mail Delivery Subsys Sat Sep 29 07:27 76/2692 "Returned mail: see tr"
3 Mail Delivery Subsys Sat Sep 29 07:27 76/2693 "Returned mail: see tr"
4 Mail Delivery Subsys Sat Sep 29 07:27 72/2537 "Returned mail: see tr"
5 Mail Delivery Subsys Sat Sep 29 07:27 71/2637 "Returned mail: see tr"
6 Mail Delivery Subsys Sat Sep 29 07:27 71/2637 "Returned mail: see tr"
>U 7 Mail Delivery Subsys Sat Sep 29 07:27 70/2554 "Returned mail: see tr"
U 8 Mail Delivery Subsys Sat Sep 29 07:27 71/2636 "Returned mail: see tr"
U 9 Mail Delivery Subsys Sat Sep 29 07:27 71/2636 "Returned mail: see tr"
10 Mail Delivery Subsys Sat Sep 29 07:28 72/2633 "Returned mail: see tr"
11 Mail Delivery Subsys Sat Sep 29 08:16 103/4273 "Returned mail: see tr"
12 Mail Delivery Subsys Sat Sep 29 14:01 103/4259 "Returned mail: see tr"
& 7
Message 7:
From MAILER-DAEMON@superguy Sat Sep 29 07:27:45 2018
Return-Path: <MAILER-DAEMON@superguy>
Date: Sat, 29 Sep 2018 07:27:45 GMT
From: Mail Delivery Subsystem <MAILER-DAEMON@superguy>
To: <root@superguy>
Content-Type: multipart/report; report-type=delivery-status;
boundary="w8T7Rjim011448.1538206065/superguy"
Subject: Returned mail: see transcript for details
Auto-Submitted: auto-generated (failure)
Status: RO
Part 1:
The original message was received at Sat, 29 Sep 2018 07:27:40 GMT
from localhost [127.0.0.1]
----- The following addresses had permanent fatal errors -----
<[email protected]>
(reason: 550 MI:IMF 163 mx14,QMCowAB3utduKa9bdw4FGw--.17130S3 1538206064 htt
p://mail.163.com/help/help_spam_16.htm?ip=118.118.118.118&hostid=mx14&time=153820
6064)
----- Transcript of session follows -----
... while talking to 163mx01.mxmail.netease.com.:
>>> MAIL From:<root@superguy> SIZE=617
<<< 550 MI:IMF 163 mx14,QMCowAB3utduKa9bdw4FGw--.17130S3 1538206064 http://mail.
163.com/help/help_spam_16.htm?ip=118.118.118.118&hostid=mx14&time=1538206064
554 5.0.0 Service unavailable
Part 2:
Content-Type: message/delivery-status
Part 3:
Content-Type: message/rfc822
From root@superguy Sat Sep 29 07:27:40 2018
Return-Path: <root@superguy>
From: root <root@superguy>
Date: Sat, 29 Sep 2018 07:22:57 +0000
To: [email protected]
Subject: test
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
hello test
&
解决163邮箱退信办法,修改hostname,因为邮件地址是根据hostname来的,hostname应该改为 xxx.yyy
三、smtp邮件配置
其实这里用到的是mailx软件,mailx软件是在安装sendmail软件时,有可能已经自动下载了,有可能还没下载。
bin/mail会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动Sendmail服务,而通过修改配置文件/etc/mail.rc(/etc/nail.rc)可以使用外部SMTP服务器,可以达到不使用sendmail而用外部的smtp服务器发送邮件的目的。
不用管posix mail 和 sendmail ,只要配置好smtp后,就可以直接用mail 命令行发邮件了。发件人就是下面配置好的user。
[root@ProxyServer ~]# vim /etc/mail.rc #文末添加以下
set [email protected]
set smtp=smtp.51cto.com
set [email protected]
set smtp-auth-password=51cto
set smtp-auth=login
[root@ProxyServer ~]# source /etc/mail.rc
[root@ProxyServer ~]# mail -s "51cto" 15001*****@139.com < /etc/passwd
from:发送的邮件地址(真实地址,我测试时候直接写justin发送邮件失败),对方显示的发件人
smtp:发生的外部smtp服务器的地址
smtp-auth-user:外部smtp服务器认证的用户名
smtp-auth-password:外部smtp服务器认证的用户密码(我测试过用邮箱登录密码OK)
smtp-auth:邮件认证的方式
四、邮箱命令行介绍
-b<地址>:指定密件副本的收信人地址;
-c<地址>:指定副本的收信人地址;
-f<邮件文件>:读取指定邮件文件中的邮件;
-i:不显示终端发出的信息;
-I:使用互动模式;
-n:程序使用时,不使用mail.rc文件中的设置;
-N:阅读邮件时,不显示邮件的标题;
-s<邮件主题>:指定邮件的主题;
-u<用户帐号>:读取指定用户的邮件;
-v:执行时,显示详细的信息。
1、使用sendmail -bp 或者 mailq 可以查看到邮件发送队列,里边会列出有几个邮件等待发送。
mailq 查看队列(Postfix mail 会报错因为服务没有开启,需要 sudo postfix status ,sudo postfix start )
[root@CHINFO3 mqueue]# mailq
/var/spool/mqueue (5 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
tB36BqUi005128 1716 Thu Dec 3 14:11 <infa@chinfo3>
(Deferred: mx.263.net.: No route to host)
<[email protected]>
tB21TicN013397 415 Wed Dec 2 09:29 <infa@chinfo3>
(Deferred: mx.263.net.: No route to host)
<[email protected]>
......
[root@CHINFO3 mqueue]# sendmail -bp
/var/spool/mqueue (5 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
tB36BqUi005128* 1716 Thu Dec 3 14:11 <infa@chinfo3>
(Deferred: mx.263.net.: No route to host)
<[email protected]>
tB21TicN013397 415 Wed Dec 2 09:29 <infa@chinfo3>
(Deferred: mx.263.net.: No route to host)
<[email protected]>
......
[root@CHINFO3 mqueue]#
邮件队列的文件都保存在 /var/spool/mqueue/ 文件夹内,查看此文件夹时,可以看到邮件队列内的邮件:【命令行 pwd 是输出当前目录】
[root@CHINFO3 mqueue]# pwd
/var/spool/mqueue
[root@CHINFO3 mqueue]# ls
dftB111d4Q031164 dftB213omV012806 dftB36BqUi005128 qftB117J4b006323 qftB21TicN013397
dftB117J4b006323 dftB21TicN013397 qftB111d4Q031164 qftB213omV012806 qftB36BqUi005128
[root@CHINFO3 mqueue]#
如果需要删除队列,直接清空该文件夹即可:【当前在这个 /var/spool/mqueue目录】
[root@CHINFO3 mqueue]# pwd
/var/spool/mqueue
[root@CHINFO3 mqueue]# ls
dftB111d4Q031164 dftB213omV012806 dftB36BqUi005128 qftB117J4b006323 qftB21TicN013397
dftB117J4b006323 dftB21TicN013397 qftB111d4Q031164 qftB213omV012806 qftB36BqUi005128
[root@CHINFO3 mqueue]# rm -f *
[root@CHINFO3 mqueue]# ls
[root@CHINFO3 mqueue]# mailq
/var/spool/mqueue is empty
Total requests: 0
[root@CHINFO3 mqueue]#
2、tail /var/log/maillog 查看日志 或者如下
[root@CHINFO3 ~]# cd /var/log/
[root@CHINFO3 log]# cat mail
mail/ maillog maillog.1 maillog.2 maillog.3 maillog.4
[root@CHINFO3 log]# cat mail
五、SendMail服务启动慢总结
在 CentOS release 6.6 上启动sendmail服务时发现服务启动过程非常慢,基本上要耗费3分多钟。有点纳闷:什么原因导致sendmail启动这么慢?搜索了这方面的一些资料,结合自己的理解,把它梳理一遍。权当笔记。
[root@MySQL-T01 bin]# service sendmail stop
Shutting down sm-client: [ OK ]
Shutting down sendmail: [ OK ]
[root@MySQL-T01 bin]# date
Wed Aug 5 09:11:00 UTC 2015
[root@MySQL-T01 bin]# service sendmail start
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
[root@MySQL-T01 bin]# date
Wed Aug 5 09:14:53 UTC 2015
如上所示,sendmail服务的启动整整需要花费3分多钟。因为Starting sendmail、Starting sm-client这两步check需要查询你设置的主机名的A记录或反向域名记录,由于全球9台DNS根系统都在美国,这个时候会去查询本机主机名对应的dns A记录。查询可能会非常的慢.
通常的域名解析是指A记录解析,即主机记录解析,就是指把域名解析到虚拟主机的过程;又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。
让sendmial绕过查询远程主机,这里给出一种最简单的方法,给主机设置一个别名。
/etc/hosts原始配置
[root@MySQL-T01 bin]# more /etc/hosts
10.20.251.45 MySQL-T01 localhost
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
/etc/hosts修改配置
[root@MySQL-T01 bin]# vi /etc/hosts
10.20.251.45 MySQL-T01 localhost
127.0.0.1 localhost localhost.localdomain MySQL-T01
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
修改完成后,关闭sendmail服务,启动sendmail服务非常快,只要一两秒的样子。
[root@MySQL-T01 bin]# service sendmail stop
Shutting down sm-client: [ OK ]
Shutting down sendmail: [ OK ]
[root@MySQL-T01 bin]# service sendmail start
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
[root@MySQL-T01 bin]#
六、使用mailx465端口发送邮件
前面提到的邮件发送都是 25端口 发送的,在一些云服务器中为了防止邮件滥发,往往都对25端口做了限制,所以此时就使用到加密的465端口了,本篇文章以qq邮箱为例来配置mailx,通过465端口发送邮件。
1、关闭其它的邮件工具
下面是两种邮件服务器:
service sendmail stop
chkconfig sendmail off
service postfix stop
chkconfig postfix off
2、安装mailx
现在安装sendmail已经自动安装mailx了。
yum install mailx
3、在邮箱网站中开启smtp功能
开启后会得到一个授权码,这个授权码可以代替邮箱密码(自行去邮箱开启),如果用邮箱密码也没有问题。
4、请求数字证书
(这里用的163邮箱,所以向163请求证书)
mkdir -p /root/.certs/
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/163.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/ -i ~/.certs/163.crt
certutil -L -d /root/.certs
最后会在 /root/.certs/ 文件夹下面:生成4个文件:
### 我用163服务器 做测试通过了,证书文件夹下面有如下4个 文件
163.crt cert8.db key3.db secmod.db
5、配置/etc/mail.rc
set [email protected] #之前设置好的邮箱地址
set smtp=smtps://smtp.163.com:465 #邮件服务器
set [email protected] #之前设置好的邮箱地址
set smtp-auth-password=xxxx #授权码
set smtp-auth=login #默认login即可
set ssl-verify=ignore #ssl认证方式
set nss-config-dir=/root/.certs #证书所在目录
smtp-auth-password:外部smtp服务器认证的用户密码(我测试过用邮箱登录密码也OK)【在前面提到的第三步在网站邮箱中开启smtp,就可以获取授权码】
6、重新加载配置
source /etc/mail.rc
7、发送邮件测试
echo "邮件正文" | mail -s "邮件主题" [email protected]
七、删除mail邮件
方法一:使用mail命令,然后在 & 提示符下使用 d 命令(Delete),批量删除邮件,例如删除1~53邮件:
# mail
& d 1-53
方法二:删除全部系统邮件
# > /var/spool/mail/root or cat /dev/null > /var/spool/mail/root
或者
# echo "d *" |mail -N
参考:
http://blog.51cto.com/ityunwei2017/1713425
https://www.cnblogs.com/kerrycode/p/4717498.html
Centos使用mailx465端口发送邮件
补充:MUA、MDA、MTA
http://blog.51cto.com/20101218/701794
https://www.cnblogs.com/horizonli/p/5591438.html