2005-04-09(sendmail小結)
一、郵件模型
MUA (message user agent)
--從MTA取的信,或者通過POP,IMAP把信發到MTA上
MTA (message transfer agent)
--監視MUA的請求 ,找出對方的MTA,把信傳到對方MTA服務器,或者把信收到郵件隊列
MDA (message deliver agent)
---把信最終投遞到具體的用戶
通常情況下 一封 郵件通過MUA把信傳到MTA服務器 或者從MTA服務器把信取到本機 通過MTA傳送給對方的MTA服務器的服務隊列,通過MDA發給指定用戶,
二、基礎
1。smtp協議(simple mail transfer protocol)
明文傳輸
基于tcp服務的應用層
使用端口:25
基礎使用方法:
telnet adf141.allyes.com 25
helo station1
mail from :abc@citiz.net
rcpt to :youlyy@163.com
data
it's test!
.
quit
2.sendmail 是使用smtp協議的郵件提交工具,承擔mta和MDA的作用
后臺進程:sendmail
腳本:/etc/init.d/sendmail
需要包:sendmail,(sendmail-doc,m4,)第三張 sendmail-cf(第二張)(rhel在第三張中)
imap(在第二盤中)
3。logs記錄在/var/log/mailog中
4。MDA把郵件根據用戶名收到/var/spool/mail下,等用戶閱讀完信后,未被刪除的郵件會自動轉存到用戶主目錄下的mbox文件中。
5.開啟調試模式
sendmail -d0 </del/null( 如果返回的主機名是localhost,檢查主機名)
6。以檢驗模式發信
echo "abc" |mail -v -s test root@allyes.com
三、配置sendmail之sendmail.mc
1. 通常用m4生成 sendmail的配置文件sendmail.cf
默認做法是:
m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf
做前 備份
每次修改配置需要重新啟動服務。
2。關于sendmail.cf
DNL 是注釋作用
3。
常用語句
默認情況sendmail只監聽本地連接
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
實驗時應該把他 禁掉否則無法收信
可以用netstat -lanp 監聽所有,netstat -lnt監聽 tcp端口
m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf 指定sendmail.cf位置
define(`ALIAS_FILE', `/etc/aliases')dnl 定義aliases位置
FEATURE(`blacklist_recipients')dnl允許使用黑名單 查禁收件人
然后用戶才可以用aclearcase/" target="_blank" >ccess文件 設定黑名單
FEATURE(`accept_unresolvable_domains')dnl
接受無法解析的域來的郵件
FEATURE(`promiscuous_relay')dnl
開啟轉發,默認是不允許的。
define(`confMAX_MESSAGE_SIZE',`15000000')dnl
限制最大發送字節
define(confMAX_HOP,30)
設置轉發的地址不超過 30個
四、配置sendmail之access
寫法:
*舉例* *設定值(注意:不是一一對應,只是解釋)* *含義*
IP 61.152.241.137 OK 接收,即使被其他 拒絕
IP(子網) 61和61.152和61.152.241都可以 relay 允許relay
域名 allyes.com reject 拒絕并顯示錯誤
email地址 youyou@allyes.com discard 安靜的接收后取消
本地用戶名 youyou@ xyz some other text 501是錯誤代碼,后 面的文字是自定義 錯誤信息
(如"501 no e-mail from this domain")
編輯完成/etc/mail/access后 需要在 /etc/mail目錄下 make access.db
reject 時logs會抱 DSN: Service unavailable 服務器logs會抱 deny
而discard則 客戶機上不報錯 服務器會顯示discard
五、配置sendmail之alias
在 /etc/aliases 這個檔案中,您會發現沒有“#”注解的每一行,開始都是一個名稱,然後跟著一個“:”符號,然後在其右邊又有其它的名稱。其工作原理是:當 sendmail 收到一個本地郵件的時候,會檢查這個 /etc/aliase 檔案,如果發現“:”左邊的名字跟接收者名稱吻合,就會將郵件轉遞給“:”右邊的名稱。在右邊的名稱,可以多過一個;也可以是另一個郵件地址;也可以指向一個檔案或程式。當郵件轉給右邊之後,又重新找一遍這個 /etc/alias 里面的設定,直到再找不到左邊名稱為止。例如下面這個例子:
MAILER-DAEMON: postmaster
postmaster: root
daemon: root
root: netman, kenny
kenny: "| sendmail kenny@other.mail.net"
sales: sales-list
sales-list: ":include:/etc/sales.list"
這樣,凡是傳給 MAILER-DAEMON 的就會轉給 postmaster ,然後再轉給 root,另外 daemon 也會轉給 root,而 root 呢,又分別轉給 netman 和 kenny,最後 natman 再也找不到名稱了,直接送到 netman 的信箱去;而 kenny 呢?則通過 sendmail 轉到 kenny@other.mail.net 那個地址去。另外,我們只需建立一個 /etc/sales.list 這樣的檔案,在里面寫上所有 sales 的名稱,可以全部為一行,用‘,’和一個空白鍵分隔;這樣,所有 salse 都會收到寄給 sales 的郵件了。
六、配置sendmail之virtusertable
如同Apache一樣,sendmail也允許使用虛擬主機功能,這是通過FEATURE(virtusertable)功能實現的,而虛擬主機的文件缺省是/etc/mail/virtusertable。這個文件的形式類似于aliases文件,即:左地址 右地址 ,中間用Tab鍵分開。還需要注意的是,虛擬域(左地址的域名),應該屬于本機接收之列。
joe@yourdomain.com jschmoe (1)
bogus@yourdomain.com error:nouser No such user here (2)
@testdomain.com test@mydomain.com (3)
@yourdomain.com %1@othercompany.com (4)
(1) 這樣一行意味著本來應該發送給 joe@yourdomain.com 的郵件現在要發送給本機的 用戶 jschmoe。
(2) 發向 bogus@yourdomain.com 的郵件,返回錯誤信息。
(3) 意味著所有發往 xxx@testdomain 的郵件都會被發送到 test@mydomain.com。
(4) 代表參數轉義,例如 user1@yourdomain.com 的郵件被發送到user1@othercompany.com。
aliases 文件同樣可以將本地用戶,映射到其它地址,那么和 virtusertable 的優先級如何?[1]
1. 當接收者郵件地址的域部分在 /etc/mail/local-host-names 中又在/etc/mail/virtusertable中時,優先檢查virtusertable文件,應用該文件中的定義規則.
2. 要應用virtusertable規則,則接收者郵件地址的域部分必須在 /etc/mail/local-host-names 文件中存在
3. 若接收者郵件地址的域部分在 /etc/mail/local-host-names 文件中但不在 virtusertable 文件中有相應的定義則先只應用 aliases 中的定義去擴展別名,一旦擴展出的別名接收者郵件的域部分在 virtusertable 中有定義行時則決不再別名下去,馬上運行virtusertable中的定義規則。
七、配置sendmail之 /etc/sendmail.cw
(注意:假如您將 sendmail 升級到 8.10 版本以後,sendmail.cw 已經改用 local-host-names 了)
(作用:用來設定郵件伺服器別名的檔案
修改 sendmail.cw 讓 sendmail 接收不同 domain 的郵件了)
從您的 Linux 主機幾出去的郵件,其回郵地址格式是這樣的:user@host.your.domain.name 呢?如果您按 Repply 回復到這個地址,應該沒問題的,但您有試過使用 user@your.domain.name 這樣的格式嗎?試試就知道了:如果您沒做任何設定,這樣的地址是寄不到使用者信箱的。
有辦法解決嗎?當然有啦,而且很簡單呢!您只要將 your.domain.name 放進 /etc/sendmail.cw這個檔案就可以了,這是用來設定郵件伺服器別名的檔案。如果您有多個別名(或曰 domain )要這臺主機接收,那麼將它們全部寫進這個檔案,一個名稱占一行。然後,您竟然無需重新啟動 sendmail 或任何服務,設定就已經生效了!
八、sendmail修改配置后需要注意的
A。修改配置 m4 /etc/mail/sendmail.mc>sendmail.cf 需要重新啟動服務
B。修改配置 /etc/access 需要make access.db 重新構建數據庫
C。修改配置 /etc/alias 需要newalias 更新別名
九、接收郵件(pop3和IMAP)
pop3(post office protocol)是明文傳輸
直接telnet端口 pop3是110 imap 是143
命令如下:
telnet 61.152.241.141 110
user aaron_you
pass abc
list
retr 1
dele 1
quit
imap (internet message access protocol)和pop3相比 支持在下載郵件前 先下載郵件頭預覽。
開啟服務方法
修改/etc/xinetd.d/pop3和imap 中yes 改no
2005-04-19 調試出錯logs
這個是系統root的信,
This is a MIME-encapsulated message
--j378wHE8009941.1112864297/localhost.localdomain
The original message was received at Thu, 7 Apr 2005 16:58:17 +0800
from localhost.localdomain [127.0.0.1]
----- The following addresses had permanent fatal errors -----
<aaron@you.com>
----- Transcript of session follows -----
550 5.1.2 <aaron@you.com>... Host unknown (Name server: 192.168.0.253.you.com.: host not found)
在maillogs里
Apr 7 16:54:20 localhost sendmail[9893]: j378ZWkx009800: to=<aaron@you.com>, ctladdr=<root@localhost.localdoma
in> (0/0), delay=00:18:28, xdelay=00:00:00, mailer=esmtp, pri=210324, relay=192.168.0.253.you.com., dsn=5.1.2,
stat=Host unknown (Name server: 192.168.0.253.you.com.: host not found)
hostname沒有修改
以后測試 需要先
sendmail -d0 </dev/dull
實驗:sendmail
1。如果主機名沒有配的話 用telnet時,會報relay deny
所以千萬記得配主機名
2。如果郵件服務器沒有把127.0.0.0這句默認只監聽本機的sendmail.mc注釋掉
那么是沒有其他機器是沒有辦法telnet近來的。
同時對于做測試的 發郵件的客戶機器,如果沒有把這句注釋掉,結果是telnet成功
但是用echo hello |mail -s -v aaa@aaa.com 發信 始終保持在隊列里,無法發出
必須注釋掉,才可以,原因不詳。
3。telnet 25端口 和 用 echo hello |mail -s -v aaa@aaa.com
都可以發信,但是區別在于前者不需要mx記錄,是直接發信。
后者需要解析本域的MX記錄