使用python發送和接收郵件

關於電子郵件

大學以前,基本不用郵箱,因此基本感受不到它的存在,也不知道有什麼用;然而大學以後,隨着認識的人愈來愈多,知識愈來愈普遍,郵箱已然成爲很重要的通信工具,大學一些課程做業須要有郵箱發給老師,註冊網站須要郵箱,找工做也須要郵箱;那麼電子郵箱是什麼原理呢?html

發送郵件

SMTP協議python

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來構造郵件的內容,這裏發送的是純文本的內容,我以爲最應該注意的就是這裏郵箱的密碼。另外各個公司的郵件服務器和端口均可能不一樣,使用前能夠先查一下工具

這裏列幾個經常使用的:fetch

郵箱 SMTP服務器 SSL協議端口 非SSL協議端口
163 smtp.163.com 465或者994 25
qq smtp.11.com 465或587 25

接收郵件

POP3和IMAP網站

POP是指郵局協議,目的是讓用戶能夠訪問郵箱服務器中的郵件,容許用戶從服務器上把郵件存儲到本地主機(即本身的計算機)上,同時刪除保存在郵件服務器上的郵件,而POP3服務器則是遵循POP3協議的接收郵件服務器,用來接收電子郵件的。ui

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

使用POP3

python的poplib模塊支持POP3,基本步驟:debug

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

更詳細的內容能夠看官方文檔:

相關文章
相關標籤/搜索