CentOS 自动发邮件
应用场景
我们组有十几个人,安排了值日倒垃圾的表,但是总是有人会忘记,然后产品经理就将这个东西与个人绩效挂钩,少一次扣一分,这里用我的服务器把值日表里内容对应的人每天定时给他发邮件提醒。
配置 mail
查看 mail 是否已安装
[root@host ~]# mail
-bash: mail: command not found
[root@host ~]# witch mail
-bash: witch: command not found
[root@host ~]# which mail
/usr/bin/which: no mail in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
不存在,安装
[root@host ~]# yum install mail
配置 mail
-
查看 mail 配置
[root@host ~]# mail No mail for root [root@host ~]# which mail /bin/mail
-
没有配置账号
[root@host etc]# vi mail.rc // 把这段加进去 set from=账号 set smtp=邮件服务器地址 set smtp-auth-user=账号 set smtp-auth-password=密码 set smtp-auth=login
我用的是网易邮箱,对外的服务器地址有这些
对了,这个密码需要邮箱的授权码,不是登录密码。
=_= 醉了,我的网易邮箱不能开启 stmp 服务,改用 qq 邮箱,stmp 服务器是 smtp.qq.com。
配置 sendmail
安装 sendmail
yum install -y sendmail
配置 sendmail
sendmail -bd –q12h
- -b:设定 Sendmail 服务运行于后台。
- -d:指定 Sendmail 以 Daemon(守护进程)方式运行。
- -q:设定当 Sendmail 无法成功发送邮件时,就将邮件保存在队列里,并指定保存时间。上面的 12h 表示保留 12 小时。
此外,要检测 Sendmail 服务器是否正常运行,可以使用命令行:
/etc/rc.d/init.d/sendmail status
配置 Senmail 的 SMTP 认证
vi /etc/mail/sendmail.mc
esc, 查找/TRUST_AUTH_MECH
,去掉这两行
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
网络访问权限
esc,查找/DAEMON_OPTIONS
,改为任意网段可访问
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
生成配置文件
[root#host ~]#m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
m4:/etc/mail/sendmail.mc:10: cannot open `/usr/share/sendmail-cf/m4/cf.m4': No such file or directory
需要安装 sendmail-cf
yum install sendmail-cf
重启 sendmail
/etc/init.d/sendmail restart
测试邮件发送
[root@host ~]# echo '文本内容!' | mail -s "标题" 1460300366@qq.com
smtp-server: 530 Error: A secure connection is requiered(such as ssl).......
忽略 ssl 验证
修改添加参数
vi /etc/mail.rc
// 追加
set smtp-use-starttls
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
再试
[root@host ~]# echo '文本内容!' | mail -s "标题" 1460300366@qq.com
Error in certificate: Peer's certificate issuer is not recognized.
需要证书
mkdir -p /root/.certs/
echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -L -d /root/.certs
vi /etc/mail.rc
set nss-config-dir=/root/.certs
再试
[root@host share]# echo '文本内容!' | mail -s "标题" 1460300366@qq.com
Error in certificate: Peer's certificate issuer is not recognized.
虽然证书报错没有验证,但是我收到了邮件,然后就是内容中文乱码。
证书报错可以这样解决
cd /root/.certs
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
中文乱码这样解决
1)查看支持的字符集是否有 GBK
[root@host ~]# locale -a
2) 安装英文版默认的字符集配置为:
[root@host ~]# cat /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
3) 修改为中文字符集:
[root@host ~]# vi /etc/sysconfig/i18n
LANG="zh_CN.GBK"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"
4) 执行如下命令或者重启即可生效。
[root@host ~]# source /etc/sysconfig/i18n
脚本定时发送
发送邮件的脚本
新建一个脚本
[root@host ~]# touch /root/test.sh
[root@host ~]# chmod u+x /root/test.sh
[root@host ~]# vi /root/test.sh
#!/bin/csh
SENDDATE=`date`
echo "定时测试,每天 7 点" | /bin/mail -s "邮件主题 - $SENDDATE" 1460300366@qq.com
添加定时任务
让脚本定时自动运行,这个例子是每天 7:00 发送邮件
[root@host ~]# echo "00 07 * * * root /root/test.sh" >> /etc/crontab
[root@host ~]# echo >> /etc/crontab
[root@host ~]# service crond reload
明天看下效果,然后就写实际应用脚本。
经检测执行命令前要加个 sh,才能执行脚本,因为我那个开头写错了/bin/csh
,应该是/bin/bash
,否则会报错,不过用 sh 执行就不用管这个问题,并且也不需要确定有没有授权。
[root@host ~]# /root/test.sh
-bash: /root/test.sh: /bin/csh: bad interpreter: 没有那个文件或目录
我用每分钟一次的测试还是不行,发现可能是没有设置生效,重启一下服务
*/1 * * * * root sh /root/test.sh
重启服务
/etc/init.d/crond restart
邀请标记你的阅读体验😉 | →