sendmail是linux系统中一个免费、轻量级、命令行的SMTP邮件客户端。
一、安装sendmail
yum install -y sendmail
yum install -y sendmail-cf
// 启动saslauthd服务进行SMTP验证
service saslauthd start
二、修改邮件服务配置
vim /etc/mail/sendmail.mc
1、将sendmail.mc文件下面两行配置开启(去掉dnl注释符)
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
2、设置网络访问权限
// 将127.0.0.1改成 0.0.0.0,意为任何主机都可以访问,或者特定的网段,例如192.168.1.0/24
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
三、开启服务
service sendmail start
service saslauthd restart
提示:如果发现sendmail dead but subsys locked,那就执行"service postfix status"查看postfix是否默认开启了,如果开启的话,就关闭postfix,然后再启动或重启sendmail服务即可。
四、安装mailx
yum -y install mailx
五、修改mailx的配置文件mail.rc
vim /etc/mail.rc
修改如下
# 发件人邮箱
set from=186*****67@163.com
# smtp服务器及端口
set smtp=smtps://smtp.163.com:465
# 登录邮箱帐号,不用加@qq.com或者@aliyun.com
set smtp-auth-user=186*****67
# smtp服务器的授权密码
set smtp-auth-password=xxxx
# ssl的加密证书位置
set nss-config-dir=/root/.certs
set smtp-auth=login
set ssl-verify=ignore
提示:ssl的证书的获得可以在ubuntu的操作系统的 ~/.mozilla/firefox/*.default/(我的是在.mozilla/firefox/r42hpmof.default/(ubuntu16.04.1LTS)),拷贝三个文件cert8.db,key3.db,secmod.db到centos7下的/etc/ssl/certs目录下即可,至于传输文件,可以使用winscp(~是普通用户的根目录,如果没有那3个.db文件,可以试试用那个用户使用自带的火狐浏览器登录一次qq邮箱)
下载163证书
mkdir -p /root/.certs/
# 向163请求证书
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 -L -d /root/.certs
提示:注意证书访问权限
六、测试发送邮件功能
// 成功后,邮件会发送到598936602@qq.com的【垃圾箱】一栏中
echo "hello word" | mail -s "mail title" 59*****02@qq.com
下面再提供几种发邮件格式
// 1、发送无主题邮件
mailx test@test.com
// 2、带主题邮件
mailx -s "title" test@test.com
提示:以上第一种和第二种都需要这样操作:然后回车第一行输入抄送(可空),再回车输入第二行内容(可空),再回车输入第三行接着ctrl+d发送邮件
// 3、利用文件作为内容发送
mailx -s "title" < test.txt test@test.com
// 4、利用文件作为内容发送(同上)
mailx -s "title" test@test.com < test.txt
// 5、发送附件
echo "test" | mailx -a "filename" -s "title" test@test.com
测试发送功能时,可能会出现以下问题:
1、报错:Error in certificate: Peer's certificate issuer is not recognized.
cd /root/.certs/
ll
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt
2、报错:Unexpected EOF on SMTP connection
"/root/dead.letter" 11/308
. . . message not sent
// 第五步mail.rc的配置中,一定要有set smtp=`smtps://`smtp.163.com:465,中的stemps://信息
附加:一个监控用户登录的脚本,并登陆者的ip、登录方式,登录用户名发送到test@test.com
#!bin/bash loginCO=0 loginCL=who | wc -l#获取已登录用户列表 while true do if [[ "$loginCL" -gt 0 ]];then if [[ "$loginCL" -gt "$loginCO" ]];then #当新获取的用户数比旧用户数要多时 user=$(who | sed -n -e '$p' | awk '{print $1}') #取已登录用户列表的最后一个用户信息 clientNumber=$(who | sed -n -e '$p' | awk '{print $2}') time=$(who | sed -n -e '$p' | awk '{print $3"-"$4" "$5}') ip=$(who | sed -n -e '$p' | awk '{print $6}' | cut -d "(" -f2 | cut -d ")" -f1) echo -e "someone is logging! \nhere are some imformation for it :\n\nUser:$user \nClientNumber: $clientNumber\nTime: $time\nIP:$ip" > /tmp/mail/loginmail mailx -s "logging status" test@test.com < /tmp/mail/loginmail #test@test.com为接受邮件的邮箱 fi fi sleep 3 #等待3秒再次获取已登录用户数,这个时间越短检测成功率越高 loginCO=$loginCL loginCL=\who | wc -l`
done