python的smtplib提供了一種很方便的途徑發送電子郵件。它對smtp協議進行了簡單的封裝。
smtp協議的基本命令包括:
HELO 向服務器標識用戶身份
MAIL 初始化郵件傳輸 mail from:
RCPT 標識單個的郵件接收人;常在MAIL命令后面,可有多個rcpt to:
DATA 在單個或多個RCPT命令后,表示所有的郵件接收人已標識,并初始化數據傳輸,以.結束
VRFY 用于驗證指定的用戶/郵箱是否存在;由于安全方面的原因,服務器常禁止此命令
EXPN 驗證給定的郵箱列表是否存在,擴充郵箱列表,也常被禁用
HELP 查詢服務器支持什么命令
NOOP 無操作,服務器應響應OK
QUIT 結束會話
RSET 重置會話,當前傳輸被取消
MAIL FROM 指定發送者地址
RCPT TO 指明的接收者地址
一般smtp會話有兩種方式,一種是郵件直接投遞,就是說,比如你要發郵件給zzz@163.com,那就直接連接163.com的郵件服務器,把信投給zzz@163.com; 另一種是驗證過后的發信,它的過程是,比如你要發郵件給zzz@163.com,你不是直接投到163.com,而是通過自己在sina.com的另一個郵箱來發。這樣就要先連接sina.com的smtp服務器,然后認證,之后在把要發到163.com的信件投到sina.com上,sina.com會幫你把信投遞到163.com。
第一種方式的命令流程基本是這樣:
1. helo
2. mail from
3. rcpt to
4. data
5. quit
但是第一種發送方式一般有限制的,就是rcpt to指定的這個郵件接收者必須在這個服務器上存在,否則是不會接收的。 先看看代碼:
#-*- encoding: gb2312 -*-import os, sys, stringimport smtplib# 郵件服務器地址mailserver = "smtp.163.com"# smtp會話過程中的mail from地址from_addr = "asfgysg@zxsdf.com"# smtp會話過程中的rcpt to地址to_addr = "zhaoweikid@163.com"# 信件內容msg = "test mail"svr = smtplib.SMTP(mailserver)# 設置為調試模式,就是在會話過程中會有輸出信息svr.set_debuglevel(1)# helo命令,docmd方法包括了獲取對方服務器返回信息svr.docmd("HELO server")# mail from, 發送郵件發送者svr.docmd("MAIL FROM: <%s>" % from_addr)# rcpt to, 郵件接收者svr.docmd("RCPT TO: <%s>" % to_addr)# data命令,開始發送數據svr.docmd("DATA")# 發送正文數據svr.send(msg)# 比如以 . 作為正文發送結束的標記,用send發送的,所以要用getreply獲取返回信息svr.send(" . ")svr.getreply()# 發送結束,退出svr.quit()
新聞熱點
疑難解答