第一部分: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 su1216Cc: Subject: testthis 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-380Delivery-date: Wed, 20 Nov 16:24:32 +0800Received: from su1216 by su1216-OptiPlex-380 with local (Exim 4.71)(envelope-from <su1216@su1216-optiplex-380>)id 1Vj35L-0005Bj-WFfor su1216@su1216-OptiPlex-380; Wed, 20 Nov 16:24:32 +0800Date: Wed, 20 Nov 16:24:32 +0800Message-Id: <E1Vj35L-0005Bj-WF@su1216-OptiPlex-380>To: <su1216@su1216-OptiPlex-380>Subject: testX-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如何处理目标邮件地址来确定如何转发这些消息以及转发到哪里。
文件默认位置为/etc/mail/sendemail.cf
sendemail.cf由规则组构成
规则可以有在配置文件中定义的帮助程序:
类:定义一些共用的短语来帮助规则组织是哦波额特定类型的消息
宏:设定一些值来简化在配置文件中输入长字符串
选项:设置参数来控制sendemal程序的运行
配置文件由一系列的类、宏、选项和规则组构成。每个功能都在配置文件中以单个文本行的形式定义。
配置文件中的每行都以定义该行命令的单个字母开头。以空格或制表符开头的行是前一命令行的延续。以井号开头的行是注释
sendemail配置文件命令
Postfix
Postfix由Wietse Venema开发,为Unix类型的服务器提供一个备用MTA
Postfix使用一个一直做为后台进程运行的主程序,主程序会使用其他帮助程序,这些帮助程序会根据他们的功能按需启动。
Postfix帮助程序
处理消息时,Postfix使用不同的消息队列来管理E-mail消息。每个消息队列都包含一些处于Postfix系统中不同消息状态的消息。
Postfix消息队列
如果Postfix系统在任何时间要被关闭,消息会仍然保存在最后一次放置它们的队列中。在Postfix重启后,它会自动开始处理来自这些队列的消息。
Postfix配置文件
Postfix使用3个独立的配置文件来允许你设定用来指导Postfix如何处理消息的参数。与一些MTA不同,它可以在Postfix运行时修改配置信息,然后运行一个命令来让Postfix加载新的配置而不用完全停掉邮件服务器
这3个文件通常位于/etc/postfix
Postfix配置文件
在配置文件中每个Postfix参数和它的值都在单独一行中,格式如下:
parameter = value
如果需要指定一个前端主机,可以使用relayhost参数,例如:
relayhost =
也可以在这里指定一个ip地址,但是必须使用方括号括起来
使用Mailx发送消息
Mailx程序发送消息的命令格式为:
mail [-eIinv] [-a header] [-baddr] [-c addr] [-s subj] to-addr
Mailx 命令行参数
下面是发送邮件的一个例子,当然我们也可以把正文保存到文本中:
$ mailNo 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-380Delivery-date: Thu, 05 Dec 16:47:06 +0800Received: from su1216 by su1216-OptiPlex-380 with local (Exim 4.71)(envelope-from <su1216@su1216-optiplex-380>)id 1VoUaQ-0005tl-Dlfor su1216@su1216-OptiPlex-380; Thu, 05 Dec 16:47:06 +0800Date: Thu, 05 Dec 16:47:06 +0800Message-Id: <E1VoUaQ-0005tl-Dl@su1216-OptiPlex-380>Subject: Test messageTo: <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命令行参数
使用Mutt
基本命令 格式:
mutt -sSubject-afile--recipients
这里的收件人列表用空格分割
这里的file必须填写绝对路径,或是基于运行mutt命令的当前工作目录的相对路径。添加多个文件可以在-a后面添加多个file用空格分开
echo "email content: test!" | mutt -s "A mail from su1216" -- su1216
转贴请保留以下链接
本人blog地址
/
/su1216/