使用python傳送和接收郵件

gxyz發表於2016-09-26

關於電子郵件

大學之前,基本不用郵箱,所以基本感覺不到它的存在,也不知道有什麼用;然而大學之後,隨著認識的人越來越多,知識越來越廣泛,郵箱已然成為很重要的通訊工具,大學一些課程作業需要有郵箱發給老師,註冊網站需要郵箱,找工作也需要郵箱;那麼電子郵箱是什麼原理呢?

傳送郵件

SMTP協議

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議簇,它幫助每臺計算機在傳送或中轉信件時找到下一個目的地。通過SMTP協議所指定的伺服器,就可以把E-mail寄到收信人的伺服器上了,只要幾分鐘。

python中的SMTP模組

使用SMTP的基本步驟

  1. 連線伺服器
  2. 登入
  3. 傳送服務請求
  4. 退出
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
qq smtp.11.com 465或587 25

接收郵件

POP3和IMAP

POP是指郵局協議,目的是讓使用者可以訪問郵箱伺服器中的郵件,允許使用者從伺服器上把郵件儲存到本地主機(即自己的計算機)上,同時刪除儲存在郵件伺服器上的郵件,而POP3伺服器則是遵循POP3協議的接收郵件伺服器,用來接收電子郵件的。

後來又出現了IMAP協議(Interactive Mail Access Protocol),即互動式郵件訪問協議,與POP3的不同在於:開啟了IMAP後,在電子郵件客戶端收取的郵件仍然保留在伺服器上,同時在客戶端上的操作都會反饋到伺服器上,如:刪除郵件,標記已讀等,伺服器上的郵件也會做相應的動作。

使用POP3

python的poplib模組支援POP3,基本步驟:

  1. 連線到伺服器
  2. 登入
  3. 發出服務請求
  4. 退出

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()

更詳細的內容可以看官方文件:

相關文章