第一部分:Linux命令行
《Linux命令行与shell脚本编程大全》 第一章:初识Linux shell
《Linux命令行与shell脚本编程大全》 第二章:走进shell
《Linux命令行与shell脚本编程大全》 第三章:基本的bash shell命令
《Linux命令行与shell脚本编程大全》 第四章:更多的bash shell命令
《Linux命令行与shell脚本编程大全》 第五章:使用Linux环境变量
《Linux命令行与shell脚本编程大全》 第六章:理解Linux文件权限
《Linux命令行与shell脚本编程大全》 第七章:管理文件系统
《Linux命令行与shell脚本编程大全》 第八章:安装软件程序
《Linux命令行与shell脚本编程大全》 第九章:使用编辑器
第二部分:shell脚本编程基础
《Linux命令行与shell脚本编程大全》 第十章:构建基本脚本
《Linux命令行与shell脚本编程大全》 第十一章:使用结构化命令
《Linux命令行与shell脚本编程大全》 第十二章:更多的结构化命令
《Linux命令行与shell脚本编程大全》 第十三章:处理用户输入
《Linux命令行与shell脚本编程大全》 第十四章:呈现数据
《Linux命令行与shell脚本编程大全》 第十五章:控制脚本
第三部分:高级shell编程
《Linux命令行与shell脚本编程大全》 第十六章:创建函数
《Linux命令行与shell脚本编程大全》 第十七章:图形化桌面上的脚本编程
《Linux命令行与shell脚本编程大全》 第十八章:初识sed和gawk
《Linux命令行与shell脚本编程大全》 第十九章:正则表达式
《Linux命令行与shell脚本编程大全》 第二十章:sed进阶
《Linux命令行与shell脚本编程大全》 第二十一章:gawk进阶
《Linux命令行与shell脚本编程大全》 第二十二章:使用其他shell
第四部分:高级shell脚本编程主题
《Linux命令行与shell脚本编程大全》 第二十三章:使用数据库
《Linux命令行与shell脚本编程大全》 第二十四章:使用Web
《Linux命令行与shell脚本编程大全》 第二十五章:使用E-mail
《Linux命令行与shell脚本编程大全》 第二十六章:编写脚本实用工具
《Linux命令行与shell脚本编程大全》 第二十七章:shell脚本编程进阶
第二十五章:使用E-mail
Linux E-mail基础
Linux中的E-mail
在Linux环境中,E-mail过程通常分为3个功能:
邮件传送代理(Mail Transfer Agent,MTA)
邮件投递代理(Mail Delivery Agent,MDA)
邮件用户代理(Mail User Agent,MUA)
有些E-mail软件合并了MDA和MTA,有些合并了MDA和MUA
邮件传送代理
MTA负责处理系统中邮件的收发
对于每个发出的邮件消息,MTA必须确定收件人地址
如果目的地是本地系统,MTA会将它直接发送到本地邮箱或将消息传给本地MDA来投递
如果目的地主机是远程邮件服务器,MTA必须和远程主机上的MTA建立一个通信连接来传递
MTA常用两种方法来将邮件递送到远程主机上:
直接递送(direct delivery)
代理递送(proxy delivery)
如果Linux系统直接连接到了互联网,通常它可以直接将 发往远程主机收件人的消息直接投递到远程主机上,
MTA用域名系统(Domain Name System,DNS)解析IP,然后用简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)建立网络连接
如果Linux没有直接连接到互联网,或者它不想和其他远程主机直接通信,它通常会使用一个 前端主机(smart host)。
前端主机是一个代理服务器,它会接收来自Linux系统的邮件消息,然后尝试直接将他们投递到目标收件人
流氓服务器可以通过前端主机转发商业邮件(Unsolicited Commercial Email,UCE)消息来发送垃圾邮件,还可以隐藏身份。“现在”大多数前端主机在向其他主机转发消息前都会要求某种形式的认证。
对于收到的邮件,MTA必须能够接受来自远程邮件服务器的连接请求,接受发往本地用户的消息。这个过程最常用的协议依然是SMTP
邮件投递代理
MDA只关注将邮件投递到本地用户
Linux中有3种常用的不同类型用户邮箱:
/var/spool/mail或/var/mail文件
$HOME/mail文件
Maildir风格的邮箱目录
Maildir是相对较新的功能,一些高级的MTA、MDA和MUA应用支持。邮箱是一个目录,每条消息是该目录中的一个单独的文件,而不用每个消息做为邮箱文件的一部分
几乎所有的MDA和MUA都能使用/var/spool/mail邮箱文件
邮件用户代理
MUA不接收消息,只显示已经在邮箱中的消息。
许多MUA可以发送邮件(要么利用SMTP的前端主机功能,要么自动将消息递送到本地MTA)
一些流行的MUA程序:
Mailx
Mailx只能读取/var/mail格式或者$HOME/mail格式的消息
Mailx也可以发送邮件
$ mail su1216 Cc: Subject: test this is a test. $ mail "/var/mail/su1216": 1 message 1 new >N 1 su1216 三 11月 20 16: 15/640 test ? Return-path: <su1216@su1216-optiplex-380> Envelope-to: su1216@su1216-OptiPlex-380 Delivery-date: Wed, 20 Nov 2013 16:24:32 +0800 Received: from su1216 by su1216-OptiPlex-380 with local (Exim 4.71) (envelope-from <su1216@su1216-optiplex-380>) id 1Vj35L-0005Bj-WF for su1216@su1216-OptiPlex-380; Wed, 20 Nov 2013 16:24:32 +0800 Date: Wed, 20 Nov 2013 16:24:32 +0800 Message-Id: <E1Vj35L-0005Bj-WF@su1216-OptiPlex-380> To: <su1216@su1216-OptiPlex-380> Subject: test X-Mailer: mail (GNU Mailutils 2.1) From: su1216 <su1216@su1216-optiplex-380> this is a test.
完成email之后,使用ctrl+d结束邮件即可
Mutt(利用了ncurses库)
图形化E-mail客户端
KDE窗口环境中的KMail
GNOME窗口环境中的Evolution
上面两个在shell脚本编程中用处不大
建立服务器
sendemail
sendemail通常运行在后台模式,监听来自远程邮件服务器的SMTP连接并转发来自本地用户的邮件
sendemail配置文件
文件 | 描述 |
sendemail.cf | 控制sendemail程序行为的文本文件 |
sendemail.cw | 含有sendemail程序接收消息用的域名列表的文本文件 |
sendemail.ct | 含有可以控制sendemail运行的受信任用户列表的文本文件 |
aliases | 含有可以将邮件重定向到另一个 用户、文件或程序的有效本地邮件地址列表 |
newaliases | 从文本文件创建新aliases数据库文件的可执行程序 |
mailq | 检查邮件队列并打印任何消息的可执行程序 |
mqueue | 用来存储待投递消息的目录 |
mailertable | 用来指定特定域的路由路径的文本文件 |
domaintable | 用来将旧域名映射到新域名的文本文件 |
virtustable | 用来将用户和域映射到备用地址的文本文件 |
relay-domains | 用来列出可以通过sendemail程序转发消息的特定主机的文本文件 |
access | 列出了特定域的文本文件,来自这些域的消息被允许或禁止 |
sendemail.cf文件
这个配置文件告诉sendemail如何处理目标邮件地址来确定如何转发这些消息以及转发到哪里。
文件默认位置为/etc/mail/sendemail.cf
sendemail.cf由规则组构成
规则可以有在配置文件中定义的帮助程序:
类:定义一些共用的短语来帮助规则组织是哦波额特定类型的消息
宏:设定一些值来简化在配置文件中输入长字符串
选项:设置参数来控制sendemal程序的运行
配置文件由一系列的类、宏、选项和规则组构成。每个功能都在配置文件中以单个文本行的形式定义。
配置文件中的每行都以定义该行命令的单个字母开头。以空格或制表符开头的行是前一命令行的延续。以井号开头的行是注释
sendemail配置文件命令
配置命令 | 描述 |
C | 定义文本的类 |
D | 定义宏 |
F | 定义含有文本的类的文件 |
H | 定义头字段和命令 |
K | 定义含有要查找的文本的数据库 |
M | 定义邮件传送代理 |
O | 定义sendmail选项 |
P | 定义sendmail的优先级 |
R | 定义解析地址的规则组 |
S | 定义规则组的集 |
Postfix
Postfix由Wietse Venema开发,为Unix类型的服务器提供一个备用MTA
Postfix使用一个一直做为后台进程运行的主程序,主程序会使用其他帮助程序,这些帮助程序会根据他们的功能按需启动。
Postfix帮助程序
程序 | 描述 |
bounce | 为退回的消息在退回消息队列发一条日志,并将退回的消息发送回发送者 |
cleanup | 处理收到的邮件头并将消息放到收件队列中 |
error | 处理来自qmgr的消息递送请求,强制消息退回 |
flush | 处理等待被远程邮件服务器提取的消息 |
local | 投递发往本地用户的消息 |
pickup | 等待maildrop队列中的消息,并将他们发送到清理程序以开始处理 |
pipe | 将来自队列管理器程序的消息转发到外部程序 |
postdrop | 当普通用户对此队列没有写权限时,将接收的消息移动到maildrop队列 |
qmgr | 处理接收队列中的消息,确定他们应该递送到哪里以及何时递送,在递送时启动程序 |
sendmail | 为程序提供一个同sendmail兼容的接口来将消息发送到maildrop队列 |
showq | 报告Postfix邮件队列的状态 |
smtp | 使用SMTP协议将消息转发到外部邮件主机 |
smtpd | 使用SMTP协议接收来自外部邮件主机的消息 |
trival-rewrite | 接收来自清理程序的消息,为qmgr程序保证头地址符合标准格式,被qmgr程序用来解析远程主机地址 |
处理消息时,Postfix使用不同的消息队列来管理E-mail消息。每个消息队列都包含一些处于Postfix系统中不同消息状态的消息。
Postfix消息队列
队列 | 描述 |
maildrop | 接收自本地用户的待处理的新消息 |
incoming | 接收自远程主机的待处理的新消息以及来自本地用户的处理过的消息 |
active | 准备好被Postfix递送的消息 |
deferred | 首次递送失败,等待第二次递送的消息 |
flush | 发往远程主机的消息,远程主机会连接邮件服务器来获取他们 |
保存的已递送消息,供本地用户阅读 |
如果Postfix系统在任何时间要被关闭,消息会仍然保存在最后一次放置它们的队列中。在Postfix重启后,它会自动开始处理来自这些队列的消息。
Postfix配置文件
Postfix使用3个独立的配置文件来允许你设定用来指导Postfix如何处理消息的参数。与一些MTA不同,它可以在Postfix运行时修改配置信息,然后运行一个命令来让Postfix加载新的配置而不用完全停掉邮件服务器
这3个文件通常位于/etc/postfix
Postfix配置文件
文件 | 描述 |
install.cf | 含有安装Postfix时使用的安装参数信息 |
main.cf | 含有Postfix程序在处理消息时使用的参数 |
master.cf | 含有Postfix主程序在运行核心程序时使用的参数 |
在配置文件中每个Postfix参数和它的值都在单独一行中,格式如下:
parameter = value
如果需要指定一个前端主机,可以使用relayhost参数,例如:
relayhost = myisp.com
也可以在这里指定一个ip地址,但是必须使用方括号括起来
使用Mailx发送消息
Mailx程序发送消息的命令格式为:
mail [-eIinv] [-a header] [-baddr] [-c addr] [-s subj] to-addr
Mailx 命令行参数
参数 | 描述 |
-a | 指定额外的SMTP头中的行 |
-b | 给消息增加一个BCC收件人 |
-c | 给消息增加一个CC收件人 |
-e | 如果消息为空,不要发送消息 |
-i | 忽略TTY中断信号 |
-I | 强制Mailx以交互模式运行 |
-n | 不要读取/etc/mail.rc起始文件 |
-s | 指定一个标题行 |
-v | 在终端上显示递送的细节 |
下面是发送邮件的一个例子,当然我们也可以把正文保存到文本中:
$ mail No mail for su1216 $ echo "test" | mail -s "Test message" su1216 $ mail "/var/mail/su1216": 1 message 1 new >N 1 su1216 四 12月 5 16: 15/637 Test message ? Return-path: <su1216@su1216-optiplex-380> Envelope-to: su1216@su1216-OptiPlex-380 Delivery-date: Thu, 05 Dec 2013 16:47:06 +0800 Received: from su1216 by su1216-OptiPlex-380 with local (Exim 4.71) (envelope-from <su1216@su1216-optiplex-380>) id 1VoUaQ-0005tl-Dl for su1216@su1216-OptiPlex-380; Thu, 05 Dec 2013 16:47:06 +0800 Date: Thu, 05 Dec 2013 16:47:06 +0800 Message-Id: <E1VoUaQ-0005tl-Dl@su1216-OptiPlex-380> Subject: Test message To: <su1216@su1216-OptiPlex-380> X-Mailer: mail (GNU Mailutils 2.1) From: su1216 <su1216@su1216-optiplex-380> test ?
Mutt程序
1995年由Michael Elkins开发
Mutt可以在E-mail消息中将文件作为附件发送Mailx只能作为正文发送
Mutt命令行
Mutt命令行参数
参数 | 描述 |
-A alias | 将指定别名的展开版本传给STDOUT |
-a file | 用MIME协议将指定的文件附加到消息上 |
-b address | 指定一个BCC(Blind Carbon Copy,秘密抄送)收件人 |
-c address | 指定一个CC(Carbon Copy,抄送)收件人 |
-D | 将所有配置选项值打印到STDOUT |
-e command | 指定在处理完初始化文件后运行的配置命令 |
-f mailbox | 指定要加载的邮箱文件 |
-F muttrc | 指定要读取的初始化文件,而不是$HOME/.muttrc |
-h | 显示帮助文本 |
-H draft | 指定一个含有标题和正文的草稿文件来发送消息 |
-i include | 指定一个文件来包含在消息的正文中 |
-m type | 指定默认邮箱类型 |
-n | 忽略系统配置文件 |
-p | 恢复一个过期的消息 |
-Q query | 查询一个配置变量值。查询会在所有配置文件都被解析以及任何在命令行上指定的命令都被执行后执行 |
-R | 以只读模式打开邮箱 |
-s subject | 指定消息的标题 |
-v | 显示Mutt版本号和编译时定义 |
-x | 模拟Mailx编辑模式 |
-y | 以由邮箱指令指定的所有邮箱列表启动 |
-z | 和-f一起使用时,如果邮箱内没消息就不启动 |
-Z | 打开邮箱命令指定的含有新邮件的第一个邮箱 |
使用Mutt
基本命令 格式:
mutt -s Subject -a file -- recipients
这里的收件人列表用空格分割
这里的file必须填写绝对路径,或是基于运行mutt命令的当前工作目录的相对路径。添加多个文件可以在-a后面添加多个file用空格分开
echo "email content: test!" | mutt -s "A mail from su1216" -- su1216
转贴请保留以下链接
本人blog地址