關於電子郵件
大學之前,基本不用郵箱,所以基本感覺不到它的存在,也不知道有什麼用;然而大學之後,隨著認識的人越來越多,知識越來越廣泛,郵箱已然成為很重要的通訊工具,大學一些課程作業需要有郵箱發給老師,註冊網站需要郵箱,找工作也需要郵箱;那麼電子郵箱是什麼原理呢?
傳送郵件
SMTP協議
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議簇,它幫助每臺計算機在傳送或中轉信件時找到下一個目的地。通過SMTP協議所指定的伺服器,就可以把E-mail寄到收信人的伺服器上了,只要幾分鐘。
python中的SMTP模組
使用SMTP的基本步驟
- 連線伺服器
- 登入
- 傳送服務請求
- 退出
import smtplib
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
def send_email(from_addr, to_addr, subject, password):
msg = MIMEText("郵件正文",'html','utf-8')
msg['From'] = u'<%s>' % from_addr
msg['To'] = u'<%s>' % to_addr
msg['Subject'] = subject
smtp = smtplib.SMTP_SSL('smtp.163.com', 465)
smtp.set_debuglevel(1)
smtp.ehlo("smtp.163.com")
smtp.login(from_addr, password)
smtp.sendmail(from_addr, [to_addr], msg.as_string())
if __name__ == "__main__":
# 這裡的密碼是開啟smtp服務時輸入的客戶端登入授權碼,並不是郵箱密碼
# 現在很多郵箱都需要先開啟smtp才能這樣傳送郵件
send_email(u"from_addr",u"to_addr",u"主題",u"password")
上面演示了用smtplib來傳送郵件,並且使用了SSL加密,這樣相對安全,使用了email來構造郵件的內容,這裡傳送的是純文字的內容,我覺得最應該注意的就是這裡郵箱的密碼。另外各個公司的郵件伺服器和埠都可能不同,使用前可以先查一下
這裡列幾個常用的:
郵箱 | SMTP伺服器 | SSL協議埠 | 非SSL協議埠 |
---|---|---|---|
163 | smtp.163.com | 465或者994 | 25 |
smtp.11.com | 465或587 | 25 |
接收郵件
POP3和IMAP
POP是指郵局協議,目的是讓使用者可以訪問郵箱伺服器中的郵件,允許使用者從伺服器上把郵件儲存到本地主機(即自己的計算機)上,同時刪除儲存在郵件伺服器上的郵件,而POP3伺服器則是遵循POP3協議的接收郵件伺服器,用來接收電子郵件的。
後來又出現了IMAP協議(Interactive Mail Access Protocol),即互動式郵件訪問協議,與POP3的不同在於:開啟了IMAP後,在電子郵件客戶端收取的郵件仍然保留在伺服器上,同時在客戶端上的操作都會反饋到伺服器上,如:刪除郵件,標記已讀等,伺服器上的郵件也會做相應的動作。
使用POP3
python的poplib模組支援POP3,基本步驟:
- 連線到伺服器
- 登入
- 發出服務請求
- 退出
poplib的常用方法:
方法 | 描述 |
---|---|
POP3(server) | 例項化POP3物件,server是pop伺服器地址 |
user(username) | 傳送使用者名稱到伺服器,等待伺服器返回資訊 |
pass_(password) | 密碼 |
stat() | 返回郵箱的狀態,返回2元祖(訊息的數量,訊息的總位元組) |
list([msgnum]) | stat()的擴充套件,返回一個3元祖(返回資訊, 訊息列表, 訊息的大小),如果指定msgnum,就只返回指定訊息的資料 |
retr(msgnum) | 獲取詳細msgnum,設定為已讀,返回3元組(返回資訊, 訊息msgnum的所以內容, 訊息的位元組數),如果指定msgnum,就只返回指定訊息的資料 |
dele(msgnum) | 將指定訊息標記為刪除 |
quit() | 登出,儲存修改,解鎖郵箱,結束連線,退出 |
例子
from poplib import POP3
p = POP3('pop.163.com')
p.user('xxxxxxx@163.com')
p.pass_('xxxxxxxx')
p.stat()
...
p.quit()
使用IMAP
python中的imaplib包支援IMAP4
常用方法:
方法 | 描述 |
---|---|
IMAP4(server) | 與IMAP伺服器建立連線 |
login(user, pass) | 使用者密碼登入 |
list() | 檢視所有的資料夾(IMAP可以支援建立資料夾) |
select() | 選擇資料夾預設是"INBOX" |
search() | 三個引數,第一的是CHARSET,通常為None(ASCII),第二個引數不知到是幹什麼官方沒解釋 |
例子
import getpass, imaplib
M = imaplib.IMAP4()
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
typ, data = M.fetch(num, '(RFC822)')
print 'Message %s\n%s\n' % (num, data[0][1])
M.close()
M.logout()
更詳細的內容可以看官方文件: