前记
- linux下sendmail服务经常会被邮箱认为是垃圾邮件,基本上都不会被邮件服务器接受,我曾经使用过阿里云的邮箱测试过,邮件发过去直接被拒收了,去收信记录查询,显示“发信频率超过限制”.....所以这里介绍一种新的方法发邮件,使用腾讯的smtp服务器发送邮件
- 还有一点:我自己尝试配置mailx出现了很多问题,google好久才有答案,所以想在这里发这篇文章来帮助那些后面的人,少走一些弯路。
- 这里需要两个邮箱,一个作为自己服务器发送邮件用(简称邮箱1),一个作为测试发送邮件是否发送成功使用(简称邮箱2)
centos7下mailx默认已经安装,我们只需要配置,就可使用
yum install mailx #没有mailx可以使用这个安装
yum install postfix
配置文件/etc/mail.rc
<pre>
set bsdcompat
set smtp-use-starttls #启用ssl加密
set ssl-verify=ignore
set nss-config-dir=/etc/ssl/certs #ssl的加密证书
set smtp=smtp.qq.com #smtp服务器地址
set smtp-auth-user=********* #登录邮箱帐号,不用加@qq.com或者@aliyun.com,等,如此类推
set smtp-auth-password=********* #smtp服务器的授权密码
set smtp-auth=login #需要登录认证
set from=**********@qq.com #发件人
</pre>
- 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邮箱)
- smtp的地址可百度,比如说阿里云的就是smtp.aliyun.com,端口如果有启用ssl加密的设置的话可以不写,如果不启用ssl加密,要写,比如说smtp.aliyun.com非加密就是smtp.aliyun.com:25。
- smtp服务器的授权码需要登录自己的邮箱(即邮箱1)进行设置那里获得,并非邮箱密码!
- 简单谈一下ssl加密,如果没有ssl加密,所有的一切邮件数据几乎都是明文发送的,包括发送给smtp服务器的授权码,有点危险,就是为了自己的邮箱帐号的安全,也最好启用ssl加密
弄好之后可以尝试发送邮件了
发送邮件有两种方式
第一种
<pre><code>mailx test@test.com</code></pre>
无主题邮件
第二种
<pre><code>mailx -s "title" test@test.com</code></pre>
带主题邮件
- 第一种和第二种都需要这样操作:然后回车第一行输入抄送(可空),再回车输入第二行内容(可空),再回车输入第三行接着ctrl+d发送邮件
- 可以加-v 选项来查看执行过程信息,注意:-v要写在-s之前,否者会提示语法错误,其实就是-s 后必须接title,就像这样(smtp-server: 501 Bad address syntax)
第三种
<pre><code>echo "test" | mailx -s "title" test@test.com</code></pre>
利用echo输出的内容作为邮件内容发送,直接就可以发送。
第四种
<pre><code>mailx -s "title" < test.txt test@test.com</code></pre>
或
<pre><code>mailx -s "title" test@test.com < test.txt</code></pre>
利用文件作为内容发送
第五种
<pre><code>echo "test" | mailx -a "filename" -s "title" test@test.com</code></pre>
发送附件
问题
Error initializing NSS: Unknown error -8015.
这个错误一开始弄得我很头疼,百度,google都无法搜出解决方案,结果来一个sudo就解决了问题,汗...,就像这样
<pre><code>sudo mailx -s "title" test@test.com < test.txt</code></pre>
后来终于明白了,这个问题是因为没办法读取证书文件导致的,因为复制文件的时候需要访问/etc/ssl/certs,需要root权限,所以复制过来的文件的拥有者也是root,而且这几个证书db文件的权限是-rw-------,复制过来拥有者变成root,普通用户连读的权限都没有,所以解决办法有几个
- 加sudo运行
- 给普通用户加上读权限(chmod +r ...)
- 改变证书拥有者(chown 普通用户名:普通用户名 ....)
附加:一个监控用户登录的脚本,并登陆者的ip、登录方式,登录用户名发送到test@test.com
<pre><code>
#!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
`</pre></code>