神馬事SMTP?百科名片
SMTP(Simple Mail Transfer Protocol)即簡易郵件傳輸通訊協定,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議族,它協助每台電腦在發送或中轉信件時找到下一個目的地。通過SMTP協議所指定的伺服器,就可以把E-mail寄到收信人的伺服器上了,整個過程只要幾分鐘。SMTP伺服器則是遵循SMTP協議的發送郵件伺服器,用來發送或中轉寄出的電子郵件。
SMTP類似於HTTP,在應用程式層是文本形式的。在UNIX編程藝術裡講過,要提倡明文的協議,這樣從肉眼就很容易分析,這樣就不需要編寫對應的視覺編輯器即可實現調試。
但可惜,當使用GMail的時候,通過WireShark分析,除了最初的握手協議外,具體傳輸內容是無法得到的(如)
1.建立TCP三路握手
2.SMTP自己的握手
3.用戶端啟動SSL握手 - 伺服器等待握手 - 開始SSL握手了
4.從這裡開始,所有內容是加密的了。
所以這裡只好開啟smtp的debug模式:smtp.set_debuglevel(1)。
這樣能夠在控制台詳細地列印出互動過程:
所有互動都是用戶端‘SEND:****’開始,伺服器返回'reply:***'結束,是不是很像HTTP.
1.通過串連SMTP.gmail.com:25,然後伺服器返回伺服器相關資訊,並要求開啟SSL:‘STARTTLS’
2.開啟TLS,Gmail要求授權才能繼續操作:AUTH LOGIN PLAIN XOAUTO,當然TLS開啟後的所有內容無法通過WireShark等抓包工具捕獲的,所以不用擔心第三方會截取這部分內容,這就是為什麼網頁也要提倡HTTPS的理由,無法被第三方截取。
3.授權請求 - 返回授權成功哦。
4.授權成功後就可以開始發送內容了:
5.最後記得要退出哦。。
每當我看多周邊人重新寫SMTP處理邏輯的時候,都想告訴他一聲:Python已經有相關庫了,為什麼不用它,而重新造輪子呢?是要學習這個協議的精髓嗎?如果這樣,我還是建議你去讀HTTP吧,現在很多網路應用都依賴於HTTP,深入研究SMTP或者重新造輪子都是不可取的。
如果不會Python怎麼辦?
能讀懂下面的代碼就會了。
import smtplibimport sysimport email.mime.text# my test mailmail_username='harkyes@gmail.com'mail_password='harktest'from_addr = mail_usernameto_addrs=('lihe21327@gmail.com')# HOST & PORTHOST = 'smtp.gmail.com'PORT = 25# Create SMTP Objectsmtp = smtplib.SMTP()print 'connecting ...'# show the debug logsmtp.set_debuglevel(1)# connettry: print smtp.connect(HOST,PORT)except: print 'CONNECT ERROR ****'# gmail uses sslsmtp.starttls()# login with username & passwordtry: print 'loginning ...' smtp.login(mail_username,mail_password)except: print 'LOGIN ERROR ****'# fill content with MIMEText's object msg = email.mime.text.MIMEText('Hi ,I am leehark')msg['From'] = from_addrmsg['To'] = ';'.join(to_addrs)msg['Subject']='hello , today is a special day'print msg.as_string()smtp.sendmail(from_addr,to_addrs,msg.as_string())smtp.quit()