《Linux命令行与shell脚本编程大全》 第二十五章 学习笔记

浏览:
字体:
发布时间:2013-12-09 23:23:20
来源:

第二十五章:使用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 2013 16:24:32 +0800Received: 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 +0800Date: Wed, 20 Nov 2013 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程序行为的文本文件
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发往远程主机的消息,远程主机会连接邮件服务器来获取他们
mail保存的已递送消息,供本地用户阅读

如果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在终端上显示递送的细节

下面是发送邮件的一个例子,当然我们也可以把正文保存到文本中:

$ 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 2013 16:47:06 +0800Received: 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 +0800Date: Thu, 05 Dec 2013 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命令行参数

参数描述
-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地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2023 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();