linux服務之smtp


實現這個協議的軟件太多,有sendmail,postfix等。不像snmp,基本上是net-snmp一統天下,

yum install nc  nc用來取代telnet

這里我們希望讓大家知道網絡協議中的一個經驗:參數越多,死得越快;參數越少,越能持久。參數太多了,根本不利於使用,無法推廣,早晚會被別的協議取代。這也符合科學的基礎原理,簡單。

postfix

[root@84-monitor private]# ps -ef|grep 1251
root      1251     1  0 Jan22 ?        00:01:15 /usr/libexec/postfix/master
postfix   1260  1251  0 Jan22 ?        00:00:30 qmgr -l -t fifo -u
postfix  14995  1251  0 09:20 ?        00:00:00 pickup -l -t fifo -u
postfix  28229  1251  0 09:55 ?        00:00:00 cleanup -z -t unix -u
postfix  28231  1251  0 09:55 ?        00:00:00 local -t unix
[root@84-monitor postfix]# pwd
/var/spool/postfix
[root@84-monitor postfix]# ls -R
.:
active  bounce  corrupt  defer  deferred  flush  hold  incoming  maildrop  pid  private  public  saved  trace

./active:

./bounce:

./corrupt:

./defer:

./deferred:

./flush:

./hold:

./incoming:

./maildrop:
742462B31  DC2AE2B50  E63DD2B51  ECF2F2B52

./pid:
master.pid  unix.bounce  unix.cleanup  unix.local

./private:
anvil  bounce  defer  discard  error  lmtp  local  proxymap  proxywrite  relay  retry  rewrite  scache  smtp  tlsmgr  trace  verify  virtual

./public:
cleanup  flush  pickup  qmgr  showq

./saved:

./trace:
[root@84-monitor postfix]# vi /etc/postfix/master.cf
smtp      inet  n       -       n       -       -       smtpd
#submission inet n       -       n       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       n       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628      inet  n       -       n       -       -       qmqpd
pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       n       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       n       -       -       smtp
        -o smtp_fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
retry     unix  -       -       n       -       -       error

 

mail客戶端

Saved 1 message in mbox 在這里會發現,剛才讀的郵件保存到~/mbox內了

Held 2 messages in /var/spool/mail/root 而用戶root的郵箱內只有2封郵件了

smtp協議
SMTP也是個請求/響應協議,命令和響應都是基於ASCⅡ文本,並以CR和LF符結束。響應包括一個表示返回狀態的三位數字代碼。SMTP在TCP協議25號端口監聽連續請求。
由於這個協議開始是基於純ASCⅡ文本的,在二進制文件上處理得並不好。后來開發了用來編碼二進制文件的標准,如MIME,以使其通過SMTP來傳輸。今天,大多數SMTP服務器都支持8位MIME擴展,它使二進制文件的傳輸變得幾乎和純文本一樣簡單。
垃 圾郵件仍然是個重要的問題。原始的SMTP協議的局限之一在於它沒有為發送方進行認證的功能。因此定義了SMTP-AUTH 擴展。由於SMTP 巨大安裝基礎的網絡效應,廣闊地修改SMTP或者完全替代它被認為是不現實的。Internet Mail 2000 就是這樣一個為替換而做的建議。IRTF 的反垃圾郵件研究小組正在研究一些提供簡單、靈活、輕量級的、可升級的源端認證的建議。最有可能被接受的建議是Sender Policy Framework 協議。

SMTP協議的郵件路由過程
SMTP服務器基於域名服務DNS中計 划收件人的域名來路由電子郵件。SMTP服務器基於DNS中的MX記錄來路由電子郵件,MX記錄注冊了域名和相關的SMTP中繼主機,屬於該域的電子郵件 都應向該主機發送。若SMTP服務器 mail.abc.com收到一封信要發到shuer@sh.abc.com,則執行以下過程:
(1)Sendmail 請求DNS給出主機sh.abc.com的CNAME 記錄,如有,假若CNAME(別名記錄)到shmail.abc.com,則再次請求shmail.abc.com的CNAME記錄,直到沒有為止。
(2)假定被CNAME到shmail.abc.com,然后sendmail請求@abc.com域的DNS給出shmail.abc.com的MX記錄(郵件路由及記錄),shmail MX 5 shmail.abc.com10 shmail2.abc.com。
(3)Sendmail組合請求DNS給出shmail.abc.com的A記錄(主機名(或域名)對應的IP地址記錄),即IP地址,若返回值為1.2.3.4(假設值)。
(4)Sendmail與1.2.3.4連接,傳送這封給shuser@sh.abc.com的信到1.2.3.4 這台服務器的SMTP后台程序。

SMTP命令是發送於SMTP主機之間的ASCⅡ信息,可能使用到的命令如下表所示。

SMTP協議命令
命令
描述
DATA
開始信息寫作
EXPN<string>
驗證給定的郵箱列表是否存在,擴充郵箱列表,也常被禁用
HELO<domain>
向服務器標識用戶身份,返回郵件服務器身份
HELP<command>
查詢服務器支持什么命令,返回命令中的信息
MAIL FROM<host>
在主機上初始化一個郵件會話
NOOP
無操作,服務器應響應OK
QUIT
終止郵件會話
RCPT TO<user>
標識單個的郵件接收人;常在MAIL命令后面可有多個rcpt to:
RSET
重置會話,當前傳輸被取消
SAML FROM<host>
發送郵件到用戶終端和郵箱
SEND FROM<host>
發送郵件到用戶終端
SOML FROM<host>
發送郵件到用戶終端或郵箱
TURN
接收端和發送端交換角色
VRFY<user>
用於驗證指定的用戶/郵箱是否存在;由於安全方面的原因,服務器常禁止此命令

ehlo是對helo的擴展,即extend helo,可以支持認證,即用戶認證。

HELO是普通SMTP,不帶身份驗證也可以繼續MAIL FROM下去,直到成功發送郵件,也就是可以偽造郵件啦!
EHLO是ESMTP,帶有身份驗證,所以沒法偽造。

從遠程發送到另一個遠程也是可以的

[root@109-com1 log]# nc mail.sohu.com 25
220 zw_71_21 ESMTP ready
ehlo mail.sohu.com            表明自己需要身份驗證
250-zw_71_21
250-AUTH PLAIN LOGIN
250 STARTTLS
auth login                    表明身份驗證開始
334 VXNlcm5hbWU6            經過base64編碼過的Username:
Y3JlYXRleXVhbg==            經過base64編碼過的用戶名
334 UGFzc3dvcmQ6            經過base64編碼過的Password:
MmQ0NTY3ODkt                經過base64編碼過的密碼
235 2.0.0 OK
mail from:createyuan@sohu.com        聲明郵件發送人
250 2.1.0 Ok
rcpt to:createyuan1@163.com        聲明郵件接收人
250 2.1.5 Ok
data                            郵件開始
354 End data with <CR><LF>.<CR><LF>    下面是郵件頭標識,與投遞無關,服務器表明以點結束  在SMTP轉發的郵件中包括信封和內容這兩種東西。
subject:test mailfj                主題
from:createyuan@sohu.com        在郵件頭中聲明郵件來源,僅在outlook與foxmail中顯示,與投遞無關
to:createyuan1@163.com            這兩個from與to無所謂,可以隨便寫

wo shi he da                      空一行,標識郵件頭與內容
sfj
please delete it.    
.                              以點結束
250 2.0.0 Ok: queued as 256062628456
quit
221 2.0.0 Bye
[root@109-com1 log]#

從本地發送郵件到指定郵箱是可以的

[root@109-com1 log]# nc localhost 25
220 109-com1.localdomain ESMTP Postfix
helo localhost
250 109-com1.localdomain
ehlo localhost
250-109-com1.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:root@109-com1.localdomain
250 2.1.0 Ok
rcpt to:createyuan1@163.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
wwwwwwww
wweeeeeeeee
rrrrrrrrrrr
.
250 2.0.0 Ok: queued as 14C5A80612
quit
221 2.0.0 Bye
[root@109-com1 log]#

linux下發郵件

自架郵件服務器麻煩還容易被攔截,可以使用Linux下mail命令連接到第三方郵件服務器商的smtp服務器發送郵件。事先把發信人地址寫入到/etc/mail.rc中才可以用mail去發郵件
#/bin/bash
mailaddr=createyuan1@126.com  發件人地址
smtpserver=smtp.126.com
user=createyuan1
passwd=*******
cat <<EOF >/etc/mail.rc
set from=$mailaddr
set smtp=$smtpserver
set smtp-auth=login
set smtp-auth-user=$user
set smtp-auth-password=$passwd
EOF

發送郵件:3種方式
    mail -v -s "主題" createyuan@sohu.com #Enter鍵后輸入正文  收件人地址
    mail -v -s "主題" createyuan@sohu.com < file #file內容為正文  
    echo "正文"|mail -v -s "主題" createyuan@sohu.com #以重定向輸入為正文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM