由于种种原因,需要由我这个兼职运维每天发送对账单文件给运营同学,故研究下 Linux 发送邮件,希望对大家有所帮助。

安装

# Centos,安装 mailx
$ yum install -y mailx # 查看帮助
$ mail --h

SSL 证书

配置 SSL 证书,否则会提示 “Error in certificate: Peer’s certificate issuer is not recognized.”。

# 生成证书
$ mkdir ~/.certs
$ echo -n | openssl s_client -connect smtp.mxhichina.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/ali.crt
$ certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/ali.crt
$ certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/ali.crt # 查看证书权限
$ cd ~/.certs && ll
总用量 80
-rw-r--r-- 1 root root 2277 4月 19 10:47 ali.crt
-rw------- 1 root root 65536 4月 19 10:56 cert8.db
-rw------- 1 root root 16384 4月 19 10:56 key3.db
-rw------- 1 root root 16384 4月 19 10:48 secmod.db # 验证,显示如下信息表示 SSL 证书配置生成及安装完成
$ certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i ali.crt
Notice: Trust flag u is set automatically if the private key is present.

生成完成之后,需要在 /etc/mail.rc 配置文件中,修改 nss-config-dir 为上面命令生成的目录 ~/.certs

配置文件

以下以阿里云邮箱配置为例,其他邮箱类似。

# 配置邮箱参数,文件末尾添加以下内容
$ vi /etc/mail.rc
# ssl 校验设置,配置 SSL 证书就可以注释掉
# set ssl-verify=ignore
# 邮箱账户,对方收到邮件时显示的发件人
set from=daodaotest@xxx.com
# smtp 服务器地址,不要忘记添加:smtps
set smtp=smtps://smtp.mxhichina.com:465
# 邮箱账户
set smtp-auth-user=daodaotest@xxx.com
# 邮箱密码,部分邮箱(163)为授权密码而非邮箱密码
set smtp-auth-password=xxxxx
# smtp 认证方式。默认是 login
set smtp-auth=login
# 设置 nss 配置目录,上一步骤 SSL 证书目录
set nss-config-dir=~/.certs/

使用

# 发送邮件
$ echo "邮件内容" | mail -s "邮件标题" daodaotest@163.com # 发送邮件,添加抄送人及附件
echo "邮件内容,请查收" | mail -v -c "daodaotest@163.com,daodaotest@qq.com" -s "邮件标题" -a daodaotest.zip daodaotest@163.com

参数说明:

  • -s <邮件主题>:指定邮件的主题;
  • -c <地址>:指定抄送人,多个收件人之间用逗号分隔;
  • -b <地址>:指定密送人,多个收件人之间用逗号分隔;
  • -a:参数后面跟的文件,将作为附件发送出去;
  • -v:执行时,显示详细的信息。

更多参数说明使用 man mailx 命令查看。

问题

Unexpected EOF on SMTP connection

我个人遇到的问题是设置 smtp 参数时,没有添加 smtps 协议。

# /etc/mail.rc 之前配置
set smtp=smtp.mxhichina.com:465 # /etc/mail.rc 修改后的配置
set smtp=smtps://smtp.mxhichina.com:465

Error in certificate: Peer's certificate issuer has been marked as not trusted by the.

没有配置 SSL 证书,具体配置见[生成 SSL 证书](#生成 SSL 证书)。

使用场景

定时给运营同学发送对账单文件

# 脚本内容
$ cat sendRecFile.sh
#!/bin/bash
# 定时给运营同学发送对账单文件 # 使用方法
usage() {
printf "Usage: sh %s RE_USERS CC_USERS [DAY]" "$0"
printf "\n"
printf "\n\t RE_USERS 收件人,多个收件人之间用逗号分隔"
printf "\n\t CC_USERS 抄送人,多个收件人之间用逗号分隔"
printf "\n\t DAY 发送对账文件日期,默认为:T-1"
} # 判断参数
if [ $# -lt 2 ]; then
usage
exit 1
fi # 收件人
RE_USERS=$1
# 抄送人
CC_USERS=$2
# 对账文件日期
DAY=$3
if [ "X$DAY" == "X" ]; then
DAY=$(date -d yesterday +%Y%m%d)
fi # 对账文件路径
RE_PATH="/data/ftp/PE/RUI/response" # 确定 ‘zip’ 命令位置
ZIPEXE="/usr/bin/zip"
if [ ! -x "${ZIPEXE}" ]; then
ZIPEXE="/usr/bin/zip"
if [ ! -x "${ZIPEXE}" ]; then
printf "Unable to locate 'zip'."
printf "Please report this message along with the location of the command on your system."
exit 1
fi
fi # 确定 ‘mail’ 命令位置
MAILEXE="/usr/bin/mail"
if [ ! -x "${MAILEXE}" ]; then
MAILEXE="/usr/bin/mail"
if [ ! -x "${MAILEXE}" ]; then
printf "Unable to locate 'mail'."
printf "Please report this message along with the location of the command on your system."
exit 1
fi
fi # 打包对账单
if [ -d "${RE_PATH}/${DAY}" ]; then
cp -r "${RE_PATH}/${DAY}" /tmp
cd /tmp || exit
${ZIPEXE} -r "${DAY}.zip" "${DAY}"
else
printf "Cannot find %s." "${RE_PATH}/${DAY}"
exit 1
fi # 发送邮件
printf "您好: \n\n 附件为 %s 对账单文件,请查收。\n" "${DAY}" | ${MAILEXE} -c "${CC_USERS}" -s "[定时自动发送] ${DAY} 对账单文件 " -a "/tmp/${DAY}.zip" "${RE_USERS}" # 发送完成,删除 zip
if [ -f "/tmp/${DAY}.zip" ]; then
rm -rf "/tmp/${DAY}.zip"
fi exit 0 # 使用方法
$ sh sendRecFile.sh
Usage: sh ./sendRecFile.sh RE_USERS CC_USERS [DAY] RE_USERS 收件人,多个收件人之间用逗号分隔
CC_USERS 抄送人,多个收件人之间用逗号分隔
DAY 发送对账文件日期,默认为:T-1 # 定时任务设置
$ crontab -e
0 9 * * * /root/ops-scripts/sendRecFile.sh daodaotest@163.com daodaotest@163.com >>/root/ops-scripts/sendRecFile.log

微信公众号:daodaotest

Linux 下发送邮件的更多相关文章

  1. Linux下发送邮件

    Linux下发送邮件 1.配置 vim /etc/mail.rc 文件尾增加以下内容 set from=ymwugui@linuxidc.com smtp=smtp.sina.com.cn set s ...

  2. linux服务器下发送邮件

    系统管理人员经常会遇到对于设备或者任务的预警与通知,通常情况有发送短信.邮件等方式.发送短信一般来说需要有短信猫(硬件)或者调用libfetion给飞信用户发送.本文介绍几种简单的发送邮件的方式. 本 ...

  3. Linux下使用mail命令发送邮件

    因为需要经常备份网站的数据,所以了解并学习了下linux下如何通过shell来发送邮件,这里以CentOS为例,使用mail命令来进行外部邮件的发送.mail命令的语法如下: Usage: mail ...

  4. linux 下 用phpmailer类smtp发送邮件始终不成功,提示:ERROR: Failed to co

    https://zhidao.baidu.com/question/509191264.html?fr=iks&word=PHPMailerSMTP+connect()+failed& ...

  5. Linux下使用mail发送邮件

    邮件常常是Linux下监控报警手段之一.Linux下的mail命令可以方便,快速的完成发送邮件.下面以CentOS为例 1.安装 [root@vm8028 ~]# mail -bash: mail: ...

  6. linux下使用自带mail发送邮件

    linux下使用自带mail发送邮件 mailx工具说明: linux可以通过安装mailx工具,mailx是一个小型的邮件发送程序,一般可以通过该程序在linux系统上,进行监控linux系统状态并 ...

  7. Linux下Nagios的安装与配置[转]

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  8. linux下sendmail邮件系统安装操作记录

    电子邮件系统的组成:1)邮件用户代理(Mail User Agent , MUA),MUA是一个邮件系统的客户端程序,它提供了阅读,发送和接受电子邮件的用户接口. 最常用的 MUA 有: linux ...

  9. Linux下6种优秀的邮件传输代理

    导读 在互联网上,邮件客户端向邮件服务器发送邮件然后将消息路由到正确的目的地(其他客户),其中邮件服务器使用的一个网络应用程序称为邮件传输代理(MTA). 最好的Linux邮件传输代理(MTAs) 邮 ...

随机推荐

  1. 洛谷3388 tarjan割点

    题目链接:https://www.luogu.com.cn/problem/P3388 tarjan算法果然牛逼,时间复杂度是O(|V|+|E|),所以1e4个结点2e5条边的图完全不在话下orz o ...

  2. hdu1224SPFA求最长路加上打印路径

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1224/ 无负环. 代码如下: #include<bits/stdc++.h> using names ...

  3. 【i春秋 综合渗透训练】渗透测试笔记

    网站是齐博CMS V7.0    1.要求获得管理员密码:   利用齐博CMS V7.0  SQL爆破注入漏洞即可得到管理员用户名密码    https://www.cnblogs.com/vspid ...

  4. 从字节码来分析,i++与++i区别

    ++/-- 是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数 前缀自增(++a):先进行自增运算,再进行表达式运算: 后缀自增(a++):先进行表达式运算, ...

  5. 3.Scikit-Learn实现完整的机器学习项目

    1       完整的机器学习项目 完成项目的步骤: (1)    项目概述 (2)    获取数据 (3)    发现并可视化数据,发现规律. (4)    为机器学习算法准备数据. (5)    ...

  6. 线段树(区间合并)HDU - 1540

    题意:输入n,m,给定n个相互连通的村庄,有m个操作,D x,表示破坏x村庄使其与相邻的两个村庄不相通,R 表示修复上一个被破坏的村庄,与相邻的两个村庄联通.Q x表示与x相连的村庄有多少个. 思路: ...

  7. HDU - 1999 不可摸数,快速求因子和

    题意:定义s[m]为m内的因子的和,给定一个n,判断是否有s[m]==n,若没有,则是不可摸数. 思路:首先要打表求出s[m]的值,标记这些出现过的值. 打表求因子和: for(int i=1;i&l ...

  8. Hadoop 集群的基准测试

    集群搭建完毕之后,需要对集群进行基准测试 第一方面:基本测试 服务启动,是否可用,简单的应用 *hdfs 读写操作 bin/hdfs dfs -mkdir - p /user/chris/tmp/co ...

  9. ajax的封装——jq简化版

    最近在复习ajax的知识,练习了下ajax的封装,此处做下笔记 废话不多说,直接代码 //发请求 //此处的url为请求地址,type为请求方式,success为请求成功的回调函数 myaxios({ ...

  10. Spring - 事务管理概述

      什么是事务管理? 第一个问题:什么是事务? 事务一般是相对数据库而言的,对于数据库一次操作就属于一个事务, 一次操作可以是几句 SQL 语句,也可以是若干行 JDBC 的 Java 语句.事务既然 ...