歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 《Linux命令行與shell腳本編程大全》 第二十五章 學習筆記

《Linux命令行與shell腳本編程大全》 第二十五章 學習筆記

日期:2017/3/1 13:51:50   编辑: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發往遠程主機的消息,遠程主機會連接郵件服務器來獲取他們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在終端上顯示遞送的細節

下面是發送郵件的一個例子,當然我們也可以把正文保存到文本中:

$ 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地址

http://su1216.iteye.com/

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

Copyright © Linux教程網 All Rights Reserved