使用python發送和接收郵件


關於電子郵件

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

發送郵件

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM