700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Linux学习--如何通过Shell脚本实现发送邮件通知功能?

Linux学习--如何通过Shell脚本实现发送邮件通知功能?

时间:2023-02-17 09:24:27

相关推荐

Linux学习--如何通过Shell脚本实现发送邮件通知功能?

1、安装和配置sendmail

不需要注册公网域名和MX记录(不需要架设公网邮件服务器),通过Linux系统自带的mail命令即可对公网邮箱发送邮件。不过mail命令是依赖sendmail的,所以我们需要先检查安装和配置sendmail。

一般系统都自带sendmail,但是只能给内网的邮箱发邮件。如果想给公网的邮箱发邮件(比如qq邮箱)就需要配置sendmail.

这里记录sendmail的安装启动配置,各取所需。

尝试使用mail命令发送一封邮件。

root@ubuntu4146:/data/gitlabData/backups# mail -s "Hello from Linux Server by shell" ouyangpeng@The program 'mail' is currently not installed. You can install it by typing:apt-get install mailutils123

发送失败,命令mail没有安装

因此,我们使用apt-get install mailutils命令安装mailutils

root@ubuntu4146:/data/gitlabData/backups# apt-get install mailutils正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包是自动安装的并且现在不需要了:lib32asan0 lib32atomic1 lib32gcc-4.8-dev lib32gcc1 lib32gomp1 lib32itm1lib32quadmath0 lib32stdc++-4.8-dev lib32stdc++6 libbonobo2-commonlibc6-dev-x32 libc6-x32 libgnome2-common libltdl-dev liborbit-2-0 libssl-devlibssl-doc libstdc++-4.8-dev libx32asan0 libx32atomic1 libx32gcc-4.8-devlibx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc++-4.8-devlibx32stdc++6 pkg-php-tools shtoolUse 'apt-get autoremove' to remove them.将会安装下列额外的软件包:guile-2.0-libs libgsasl7 libkyotocabinet16 liblzo2-2 libmailutils4 libntlm0mailutils-common建议安装的软件包:mailutils-mh mailutils-doc下列【新】软件包将被安装:guile-2.0-libs libgsasl7 libkyotocabinet16 liblzo2-2 libmailutils4 libntlm0mailutils mailutils-common升级了 0 个软件包,新安装了 8 个软件包,要卸载 0 个软件包,有 310 个软件包未被升级。需要下载 3,461 kB 的软件包。解压缩后会消耗掉 18.0 MB 的额外空间。您希望继续执行吗? [Y/n] y获取:1 http://cn./ubuntu/ trusty-updates/main liblzo2-2 amd64 2.06-1.2ubuntu1.1 [46.1 kB]获取:2 http://cn./ubuntu/ trusty/universe libkyotocabinet16 amd64 1.2.76-4 [288 kB]获取:3 http://cn./ubuntu/ trusty/universe libntlm0 amd64 1.4-1 [15.3 kB]获取:4 http://cn./ubuntu/ trusty/main guile-2.0-libs amd64 2.0.9+1-1ubuntu1 [2,127 kB]获取:5 http://cn./ubuntu/ trusty/universe libgsasl7 amd64 1.8.0-2ubuntu2 [117 kB]获取:6 http://cn./ubuntu/ trusty/universe mailutils-common all 1:2.99.98-1.1 [245 kB]获取:7 http://cn./ubuntu/ trusty/universe libmailutils4 amd64 1:2.99.98-1.1 [398 kB]获取:8 http://cn./ubuntu/ trusty/universe mailutils amd64 1:2.99.98-1.1 [225 kB]下载 3,461 kB,耗时 2秒 (1,283 kB/s)Selecting previously unselected package liblzo2-2:amd64.(正在读取数据库 ... 系统当前共安装有 172915 个文件和目录。)Preparing to unpack .../liblzo2-2_2.06-1.2ubuntu1.1_amd64.deb ...Unpacking liblzo2-2:amd64 (2.06-1.2ubuntu1.1) ...Selecting previously unselected package libkyotocabinet16:amd64.Preparing to unpack .../libkyotocabinet16_1.2.76-4_amd64.deb ...Unpacking libkyotocabinet16:amd64 (1.2.76-4) ...Selecting previously unselected package libntlm0:amd64.Preparing to unpack .../libntlm0_1.4-1_amd64.deb ...Unpacking libntlm0:amd64 (1.4-1) ...Selecting previously unselected package guile-2.0-libs.Preparing to unpack .../guile-2.0-libs_2.0.9+1-1ubuntu1_amd64.deb ...Unpacking guile-2.0-libs (2.0.9+1-1ubuntu1) ...Selecting previously unselected package libgsasl7.Preparing to unpack .../libgsasl7_1.8.0-2ubuntu2_amd64.deb ...Unpacking libgsasl7 (1.8.0-2ubuntu2) ...Selecting previously unselected package mailutils-common.Preparing to unpack .../mailutils-common_1%3a2.99.98-1.1_all.deb ...Unpacking mailutils-common (1:2.99.98-1.1) ...Selecting previously unselected package libmailutils4.Preparing to unpack .../libmailutils4_1%3a2.99.98-1.1_amd64.deb ...Unpacking libmailutils4 (1:2.99.98-1.1) ...Selecting previously unselected package mailutils.Preparing to unpack .../mailutils_1%3a2.99.98-1.1_amd64.deb ...Unpacking mailutils (1:2.99.98-1.1) ...Processing triggers for man-db (2.6.7.1-1ubuntu1) ...正在设置 liblzo2-2:amd64 (2.06-1.2ubuntu1.1) ...正在设置 libkyotocabinet16:amd64 (1.2.76-4) ...正在设置 libntlm0:amd64 (1.4-1) ...正在设置 guile-2.0-libs (2.0.9+1-1ubuntu1) ...正在设置 libgsasl7 (1.8.0-2ubuntu2) ...正在设置 mailutils-common (1:2.99.98-1.1) ...正在设置 libmailutils4 (1:2.99.98-1.1) ...正在设置 mailutils (1:2.99.98-1.1) ...update-alternatives: using /usr/bin/frm.mailutils to provide /usr/bin/frm (frm) in 自动模式update-alternatives: using /usr/bin/from.mailutils to provide /usr/bin/from (from) in 自动模式update-alternatives: using /usr/bin/messages.mailutils to provide /usr/bin/messages (messages) in 自动模式update-alternatives: using /usr/bin/movemail.mailutils to provide /usr/bin/movemail (movemail) in 自动模式update-alternatives: using /usr/bin/readmsg.mailutils to provide /usr/bin/readmsg (readmsg) in 自动模式update-alternatives: using /usr/bin/dotlock.mailutils to provide /usr/bin/dotlock (dotlock) in 自动模式update-alternatives: using /usr/bin/mail.mailutils to provide /usr/bin/mailx (mailx) in 自动模式Processing triggers for libc-bin (2.19-0ubuntu6.6) ...root@ubuntu4146:/data/gitlabData/backups#12345678910111213141516171819222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

2、使用shell脚本发送Email

首先执行命令mail --help查找mail命令的用法

root@ubuntu4146:/data/gitlabData/backups# mail --helpUsage: mail [OPTION...] [address...]or: mail [OPTION...] -f [OPTION...] [file]or: mail [OPTION...] --file [OPTION...] [file]or: mail [OPTION...] --file=file [OPTION...]GNU mail -- process mail messages.If -f or --file is given, mail operates on the mailbox named by the firstargument, or the user's mbox, if no argument given.-a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILEattach FILE--content-type=TYPE set content type for subsequent --attach options -e, --existreturn true if mail exists--encoding=NAME set encoding for subsequent --attach options -E, --exec=COMMAND execute COMMAND -F, --bynamesave messages according to sender -H, --headers write a header summary and exit -i, --ignoreignore interrupts -n, --norc do not read the system mailrc file -N, --nosumdo not display initial header summary -p, --print, --read print all mail to standard output -q, --quit cause interrupts to terminate program -r, --return-address=ADDRESS use address as the return address when sending mail-s, --subject=SUBJ send a message with the given SUBJECT -t, --to precede message by a list of addresses -u, --user=USER operate on USER's mailboxCommon options--config-file=FILE, --rcfile=FILE load this configuration file--config-helpshow configuration file summary--config-lint, --rcfile-lint check configuration file syntax and exit--config-verbose, --rcfile-verbose verbosely log parsing of the configuration files--no-site-config, --no-site-rcfile do not load site configuration file--no-user-config, --no-user-rcfile do not load user configuration file--set=PARAM=VALUEset configuration parameter--show-config-options show compilation optionsGlobal debugging settings--debug-level=LEVEL set Mailutils debugging level--debug-line-infoshow source info with debugging messages-?, --help give this help list--usagegive a short usage message -V, --version print program versionMandatory or optional arguments to long options are also mandatory or optionalfor any corresponding short options.Report bugs to <bug-mailutils@>.root@ubuntu4146:/data/gitlabData/backups#1234567891011121314151617181922232425262728293031323334353637383940414243444546474849505152535455565758

2.1 无邮件正文

mail -s "主题" 收件地址1

例如我们执行:

root@ubuntu4146:/data/gitlabData/backups# mail -s "Email Subject : Hello from Linux Server by shell" ouyangpeng@: Null message body; hope that's okroot@ubuntu4146:/data/gitlabData/backups#12345

提示你输入Cc地址,即邮件抄送地址,没有抄送地址则直接回车就完成了邮件的发送。

接着会让你输入邮件正文,当邮件正文输入完成后,需要按CTRL+D结束输入。此时我们不填写邮件正文,直接按CTRL+D结束输入。它会提示我们Null message body; hope that’s ok

此时查看OA邮件,可以收到刚才发送过来的无正文的邮件。

2.2 有邮件正文

2.2.1 echo “邮件正文” | mail -s 邮件主题 收件地址

执行管道命令,来填写邮件正文,例如我们执行命令:

root@ubuntu4146:/# echo "Email Content:This is the content of mail. Welcome to ouyangpeng's blog : /ouyang_peng/" | mail -s "Email Subject : Hello from Linux Server by shell" ouyangpeng@oaserver.root@ubuntu4146:/#123

这时,我们收到的OA邮件内容如下:

2.2.2 mail -s “主题” 收件地址< 文件(邮件正文)

例如我们执行如下命令,则将/data/gitlabData/backups/log/-08-18.log 文件内容当做邮件正文发送了。

root@ubuntu4146:/# mail -s "Email Subject : Hello from Linux Server by shell" ouyangpeng@oaserver. < /data/gitlabData/backups/log/-08-18.log1

这时,我们收到的OA邮件内容如下:

2.2.3 cat 邮件正文.txt | mail -s 邮件主题 收件地址

例如我们执行如下命令,则将/data/gitlabData/backups/log/-08-17.log 文件内容当做邮件正文发送了。

root@ubuntu4146:/# cat /data/gitlabData/backups/log/-08-17.log | mail -s "Email Subject : Hello from Linux Server by shell" ouyangpeng@oaserver.12

这时,我们收到的OA邮件内容如下:

2.3 邮件附件

2.3.1 mail -s “主题” 收件地址 -A 附件

root@ubuntu4146:/# mail -s "Email Subject : Hello from Linux Server by shell" ouyangpeng@oaserver. -A /data/gitlabData/backups/log/-08-18.log Cc: This email attach a file.root@ubuntu4146:/#12345

提示你输入Cc地址,即邮件抄送地址,没有抄送地址则直接回车就完成了邮件的发送。

接着会让你输入邮件正文 “This email attach a file.”,当邮件正文输入完成后,需要按CTRL+D结束输入。

这时,我们收到的OA邮件内容如下:

2.3.2 mail -s “主题” 收件地址 -a 附件 < 文件(邮件正文.txt)

root@ubuntu4146:/# mail -s "Email Subject : Hello from Linux Server by shell" ouyangpeng@oaserver. -A /data/gitlabData/backups/auto_backup.sh < /data/gitlabData/backups/log/-08-18.log1

执行如上命令,/data/gitlabData/backups/auto_backup.sh 会当做附件发送,/data/gitlabData/backups/log/-08-18.log 的内容会当做正文发送

这时,我们收到的OA邮件内容如下:

3、发送给多个人

root@ubuntu4146:/data/gitlabData/backups# mail --helpUsage: mail [OPTION...] [address...]or: mail [OPTION...] -f [OPTION...] [file]or: mail [OPTION...] --file [OPTION...] [file]or: mail [OPTION...] --file=file [OPTION...]GNU mail -- process mail messages.If -f or --file is given, mail operates on the mailbox named by the firstargument, or the user's mbox, if no argument given.-a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILEattach FILE--content-type=TYPE set content type for subsequent --attach options -e, --existreturn true if mail exists--encoding=NAME set encoding for subsequent --attach options -E, --exec=COMMAND execute COMMAND -F, --bynamesave messages according to sender -H, --headers write a header summary and exit -i, --ignoreignore interrupts -n, --norc do not read the system mailrc file -N, --nosumdo not display initial header summary -p, --print, --read print all mail to standard output -q, --quit cause interrupts to terminate program -r, --return-address=ADDRESS use address as the return address when sending mail-s, --subject=SUBJ send a message with the given SUBJECT -t, --to precede message by a list of addresses -u, --user=USER operate on USER's mailboxCommon options--config-file=FILE, --rcfile=FILE load this configuration file--config-helpshow configuration file summary--config-lint, --rcfile-lint check configuration file syntax and exit--config-verbose, --rcfile-verbose verbosely log parsing of the configuration files--no-site-config, --no-site-rcfile do not load site configuration file--no-user-config, --no-user-rcfile do not load user configuration file--set=PARAM=VALUEset configuration parameter--show-config-options show compilation optionsGlobal debugging settings--debug-level=LEVEL set Mailutils debugging level--debug-line-infoshow source info with debugging messages-?, --help give this help list--usagegive a short usage message -V, --version print program versionMandatory or optional arguments to long options are also mandatory or optionalfor any corresponding short options.Report bugs to <bug-mailutils@>.root@ubuntu4146:/data/gitlabData/backups#1234567891011121314151617181922232425262728293031323334353637383940414243444546474849505152535455565758

查看上面的mail帮助文档,使用 -t 选项 指定一个收件人列表。

下面测试发送一封邮件给3个人,如下所示:

root@ubuntu4146:/data/gitlabData/backups# cat /data/gitlabData/backups/log/-08-17.log | mail -s "Email Subject : Hello from Linux Server by shell" -t yizhongwei@oaserver. ouyangpeng@oaserver. huxiaoqiao@oaserver.12

OA邮箱收到邮件可以看到有三个收件人。

上面的命令是Ubuntu系统的mail命令的用法,但是在Center OS系统时,该命令有所不同

首先通过如下命令lsb_release -a查看系统版本

[root@localhost gitlabDataBackup]# lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarchDistributor ID: CentOSDescription: CentOS release 6.8 (Final)Release: 6.8Codename: Final1234567

然后使用命令man help查看mail命令的用法

[root@localhost gitlabDataBackup]# mail --helpmail: illegal option -- -Usage: mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users[root@localhost gitlabDataBackup]#12345

使用man mail命令查看mail的更加具体的用法

MAILX(1)User Commands MAILX(1)NAMEmailx - send and receive Internet mailSYNOPSISmailx [-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]DESCRIPTIONMailx is an intelligent mail processing system, which has a command syntax reminiscent of ed(1) with lines replaced by messages. It is based on Berkeley Mail 8.1,is intended to provide the functionality of the POSIX mailx command, and offers extensions for MIME, IMAP, POP3, SMTP, and S/MIME. Mailx provides enhanced fea-tures for interactive use, such as caching and disconnected operation for IMAP, message threading, scoring, and filtering. It is also usable as a mail batch lan-guage, both for sending and receiving mail.The following options are accepted:-A nameExecutes an account command (see below) for name after the startup files have been read.-a fileAttach the given file to the message.-BMake standard input and standard output line-buffered.-b addressSend blind carbon copies to list. List should be a comma-separated list of names.-c addressSend carbon copies to list of users.-DStart in disconnected mode; see the description for the disconnected variable option.-dEnables debugging messages and disables the actual delivery of messages. Unlike -v, this option is intended for mailx development only.-eJust check if mail is present in the system mailbox. If yes, return an exit status of zero, else, a non-zero value.-EIf an outgoing message does not contain any text in its first or only message part, do not send it but discard it silently, effectively setting the skipemp-tybody variable at program startup. This is useful for sending messages from scripts started by cron(8).-f [file]Read in the contents of the user’s mbox (or the specified file) for processing; when mailx is quit, it writes undeleted messages back to this file. Thestring file is handled as described for the folder command below.-FSave the message to send in a file named after the local part of the first recipient’s address.-HPrint header summaries for all messages and exit.-h hopsInvoke sendmail with the specified hop count. This option has no effect when SMTP is used for sending mail.-iIgnore tty interrupt signals. This is particularly useful when using mailx on noisy phone lines.-IShows the ‘Newsgroup:’ or ‘Article-Id:’ fields in the header summary. Only applicable in combination with -f.-nInhibits reading /etc/mail.rc upon startup. This option should be activated for mailx scripts that are invoked on more than one machine, because the con-tents of that file may differ between them.-NInhibits the initial display of message headers when reading mail or editing a mail folder.-q fileStart the message with the contents of the specified file. May be given in send mode only.-r addressSets the From address. Overrides any from variable specified in environment or startup files. Tilde escapes are disabled. The -r address options arepassed to the mail transfer agent unless SMTP is used. This option exists for compatibility only; it is recommended to set the from variable directlyinstead.-ROpens any folders read-only.-s subjectSpecify subject on command line (only the first argument after the -s flag is used as a subject; be careful to quote subjects containing spaces).-S variable[=value]Sets the internal option variable and, in case of a string option, assigns value to it.-T nameWrites the ‘Message-Id:’ and ‘Article-Id:’ header fields of each message read in the file name. Implies -I. Compressed files are handled as described forthe folder command below.-tThe message to be sent is expected to contain a message header with ‘To:’, ‘Cc:’, or ‘Bcc:’ fields giving its recipients. Recipients specified on the com-mand line are ignored.-u userReads the mailbox of the given user name.-vVerbose mode. The details of delivery are displayed on the user’s terminal.-VPrint mailx’s version and exit.-~Enable tilde escapes even if not in interactive mode.后面还有很多介绍,就不贴代码了1234567891011121314151617181922232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394

由上面可以发现,Ubuntu的mail命令和Center OS系统的mail命令是不一样的,因此在Center OS 系统想同时发生给多个人的话,不能使用-t选项。

因此在Center OS 上,使用如下命令来进行给多个人发送邮件

[root@localhost gitlabDataBackup]# echo "Test send mail to multiple people" | mail -s "Congratulation! GitLab clean old backupFiles Success Report." -a /root/gitlabDataBackup/log/-08-21.log ouyangpeng@oaserver. -c yizhongwei@oaserver.,huxiaoqiao@oaserver.You have new mail in /var/spool/mail/root[root@localhost gitlabDataBackup]#123

收到的OA邮件如下所示:

4、检查邮件是否发出

检查所传送的电子邮件是否送出,或滞留在邮件服务器中

/usr/lib/sendmail -bp1

若屏幕显示为“Mail queue is empty” 的信息,表示mail 已送出。

若为其他错误信息,表示电子邮件因故尚未送出。

例如下面执行命令之后,就可以看到有些很久之前的邮件没有发送出去。

5、读取邮件

系统收到邮件都会保存在“/var/spool/mail/[linux用户名]”文件中。

在linux中输入mail回车 ,就进入了收件箱,并显示邮件列表。

root@ubuntu4146:/# mail"/var/mail/root": 3 messages 3 new>N 1 Cron Daemon 二 8月 15 10: 147/5848 Cron <root@ubuntu4146> /data/gitlabData/backups/auto_backup.sh -D 1 N 2 Cron Daemon 二 8月 15 10: 147/5848 Cron <root@ubuntu4146> /data/gitlabData/backups/auto_backup.sh -D 1 N 3 Cron Daemon 三 8月 16 06: 18/793 Cron <root@ubuntu4146> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )? Return-Path: <root@ubuntu4146.ubantu4146>X-Original-To: rootDelivered-To: root@ubuntu4146.ubantu4146Received: by ubuntu4146.ubantu4146 (Postfix, from userid 0)id 5A4AC1463CE; Tue, 15 Aug 10:30:37 +0800 (CST)From: root@ubuntu4146.ubantu4146 (Cron Daemon)To: root@ubuntu4146.ubantu4146Subject: Cron <root@ubuntu4146> /data/gitlabData/backups/auto_backup.sh -D 1 Content-Type: text/plain; charset=ANSI_X3.4-1968X-Cron-Env: <SHELL=/bin/sh>X-Cron-Env: <PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin>X-Cron-Env: <HOME=/root>X-Cron-Env: <LOGNAME=root>Message-Id: <0815023037.5A4AC1463CE@ubuntu4146.ubantu4146>Date: Tue, 15 Aug 10:30:37 +0800 (CST)1234567891011121314151617181922

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。