日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

smtplib python教程_Python使用poplib模块和smtplib模块收发电子邮件的教程

發布時間:2023/12/20 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 smtplib python教程_Python使用poplib模块和smtplib模块收发电子邮件的教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

poplib模塊接收郵件python的poplib模塊是用來從pop3收取郵件的,也可以說它是處理郵件的第一步。

POP3協議并不復雜,它也是采用的一問一答式的方式,你向服務器發送一個命令,服務器必然會回復一個信息。pop3命令碼如下:

命令 poplib方法  參數    狀態     描述

-----------------------------------------------------------------------------------------------

USER  user   username  認可  用戶名,此命令與下面的pass命令若成功,將導致狀態轉換

PASS  pass_   password  認可  用戶密碼

APOP  apop   Name,Digest 認可  Digest是MD5消息摘要

-----------------------------------------------------------------------------------------------

STAT  stat   None    處理  請求服務器發回關于郵箱的統計資料,如郵件總數和總字節數

UIDL  uidl   [Msg#]   處理  返回郵件的唯一標識符,POP3會話的每個標識符都將是唯一的

LIST  list   [Msg#]   處理  返回郵件數量和每個郵件的大小

RETR  retr   [Msg#]  處理  返回由參數標識的郵件的全部文本

DELE  dele   [Msg#]  處理  服務器將由參數標識的郵件標記為刪除,由quit命令執行

RSET  rset   None   處理  服務器將重置所有標記為刪除的郵件,用于撤消DELE命令

TOP   top    [Msg#]   處理  服務器將返回由參數標識的郵件前n行內容,n必須是正整數

NOOP  noop   None    處理  服務器返回一個肯定的響應

----------------------------------------------------------------------------------------------

QUIT  quit  None    更新

python的poplib也針對這些命令分別提供了對應的方法,上面在第二列里已經標出來。收取郵件的過程一般是:

1. 連接pop3服務器 (poplib.POP3.__init__)

2. 發送用戶名和密碼進行驗證 (poplib.POP3.user poplib.POP3.pass_)

3. 獲取郵箱中信件信息 (poplib.POP3.stat)

4. 收取郵件 (poplib.POP3.retr)

5. 刪除郵件 (poplib.POP3.dele)

6. 退出 (poplib.POP3.quit)

注意的是,上面我在括號里寫的是使用什么方法來完成這個操作,在實際的代碼中不能那樣寫,應該是創建poplib.POP3的對象,然后,調用這個對象的方法。比如:

poplib.POP3.quit

應該理解為

a = poplib.POP3(host)

a.quit()

下面看看實際的代碼:

#-*- encoding: gb2312 -*-

import os, sys, string

import poplib

# pop3服務器地址

host = "pop3.163.com"

# 用戶名

username = "xxxxxx@163.com"

# 密碼

password = "xxxxxxx"

# 創建一個pop3對象,這個時候實際上已經連接上服務器了

pp = poplib.POP3(host)

# 設置調試模式,可以看到與服務器的交互信息

pp.set_debuglevel(1)

# 向服務器發送用戶名

pp.user(username)

# 向服務器發送密碼

pp.pass_(password)

# 獲取服務器上信件信息,返回是一個列表,第一項是一共有多上封郵件,第二項是共有多少字節

ret = pp.stat()

print ret

# 需要取出所有信件的頭部,信件id是從1開始的。

for i in range(1, ret[0]+1):

# 取出信件頭部。注意:top指定的行數是以信件頭為基數的,也就是說當取0行,

# 其實是返回頭部信息,取1行其實是返回頭部信息之外再多1行。

mlist = pp.top(i, 0)

print 'line: ', len(mlist[1])

# 列出服務器上郵件信息,這個會對每一封郵件都輸出id和大小。不象stat輸出的是總的統計信息

ret = pp.list()

print ret

# 取第一封郵件完整信息,在返回值里,是按行存儲在down[1]的列表里的。down[0]是返回的狀態信息

down = pp.retr(1)

print 'lines:', len(down)

# 輸出郵件

for line in down[1]:

print line

# 退出

pp.quit()

在有些地方,有安全郵件這一說,其實是對pop3做了ssl加密。這樣的,poplib一樣可以處理,只不過不是用POP3這個類,而是用POP3_SSL, 他們的方法都一樣。因此支持ssl在上面代碼中,替換創建pop3對象的一行為:

pp = poplib.POP3_SSL(host)

smtplib: 用python發送SSL/TLS安全郵件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, string

import 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: " % from_addr)

# rcpt to, 郵件接收者

svr.docmd("RCPT TO: " % to_addr)

# data命令,開始發送數據

svr.docmd("DATA")

# 發送正文數據

svr.send(msg)

# 比如以 . 作為正文發送結束的標記,用send發送的,所以要用getreply獲取返回信息

svr.send(" . ")

svr.getreply()

# 發送結束,退出

svr.quit()

注意的是,163.com是有反垃圾郵件功能的,想上面的這種投遞郵件的方法不一定能通過反垃圾郵件系統的檢測的。所以一般不推薦個人這樣發送。

第二種有點不一樣:

1.ehlo

2.auth login

3.mail from

4.rcpt to

5.data

6.quit

相對于第一種來說,多了一個認證過程,就是auth login這個過程。

#-*- encoding: gb2312 -*-

import os, sys, string

import smtplib

import base64

# 郵件服務器地址

mailserver = "smtp.163.com"

# 郵件用戶名

username = "xxxxxx@163.com"

# 密碼

password = "xxxxxxx"

# smtp會話過程中的mail from地址

from_addr = "xxxxxx@163.com"

# smtp會話過程中的rcpt to地址

to_addr = "yyyyyy@163.com"

# 信件內容

msg = "my test mail"

svr = smtplib.SMTP(mailserver)

# 設置為調試模式,就是在會話過程中會有輸出信息

svr.set_debuglevel(1)

# ehlo命令,docmd方法包括了獲取對方服務器返回信息

svr.docmd("EHLO server")

# auth login 命令

svr.docmd("AUTH LOGIN")

# 發送用戶名,是base64編碼過的,用send發送的,所以要用getreply獲取返回信息

svr.send(base64.encodestring(username))

svr.getreply()

# 發送密碼

svr.send(base64.encodestring(password))

svr.getreply()

# mail from, 發送郵件發送者

svr.docmd("MAIL FROM: " % from_addr)

# rcpt to, 郵件接收者

svr.docmd("RCPT TO: " % to_addr)

# data命令,開始發送數據

svr.docmd("DATA")

# 發送正文數據

svr.send(msg)

# 比如以 . 作為正文發送結束的標記

svr.send(" . ")

svr.getreply()

# 發送結束,退出

svr.quit()

上面說的是最普通的情況,但是不能忽略的是現在好多企業郵件是支持安全郵件的,就是通過SSL發送的郵件,這個怎么發呢?SMTP對SSL安全郵件的支持有兩種方案,一種老的是專門開啟一個465端口來接收ssl郵件,另一種更新的做法是在標準的25端口的smtp上增加一個starttls的命令來支持。

看看第一種怎么辦:

#-*- encoding: gb2312 -*-

import os, sys, string, socket

import smtplib

class SMTP_SSL (smtplib.SMTP):

def __init__(self, host='', port=465, local_hostname=None, key=None, cert=None):

self.cert = cert

self.key = key

smtplib.SMTP.__init__(self, host, port, local_hostname)

def connect(self, host='localhost', port=465):

if not port and (host.find(':') == host.rfind(':')):

i = host.rfind(':')

if i >= 0:

host, port = host[:i], host[i+1:]

try: port = int(port)

except ValueError:

raise socket.error, "nonnumeric port"

if not port: port = 654

if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)

msg = "getaddrinfo returns an empty list"

self.sock = None

for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):

af, socktype, proto, canonname, sa = res

try:

self.sock = socket.socket(af, socktype, proto)

if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)

self.sock.connect(sa)

# 新增加的創建ssl連接

sslobj = socket.ssl(self.sock, self.key, self.cert)

except socket.error, msg:

if self.debuglevel > 0:

print>>stderr, 'connect fail:', (host, port)

if self.sock:

self.sock.close()

self.sock = None

continue

break

if not self.sock:

raise socket.error, msg

# 設置ssl

self.sock = smtplib.SSLFakeSocket(self.sock, sslobj)

self.file = smtplib.SSLFakeFile(sslobj);

(code, msg) = self.getreply()

if self.debuglevel > 0: print>>stderr, "connect:", msg

return (code, msg)

if __name__ == '__main__':

smtp = SMTP_SSL('192.168.2.10')

smtp.set_debuglevel(1)

smtp.sendmail("zzz@xxx.com", "zhaowei@zhaowei.com", "xxxxxxxxxxxxxxxxx")

smtp.quit()

這里我是從原來的smtplib.SMTP派生出了新的SMTP_SSL類,它專門來處理ssl連接。我這里測試的192.168.2.10是我自己的測試服務器.

第二種是新增加了starttls的命令,這個很簡單,smtplib里就有這個方法,叫smtplib.starttls()。當然,不是所有的郵件系統都支持安全郵件的,這個需要從ehlo的返回值里來確認,如果里面有starttls,才表示支持。相對于發送普通郵件的第二種方法來說,只需要新增加一行代碼就可以了:

#-*- encoding: gb2312 -*-

import os, sys, string

import smtplib

import base64

# 郵件服務器地址

mailserver = "smtp.163.com"

# 郵件用戶名

username = "xxxxxx@163.com"

# 密碼

password = "xxxxxxx"

# smtp會話過程中的mail from地址

from_addr = "xxxxxx@163.com"

# smtp會話過程中的rcpt to地址

to_addr = "yyyyyy@163.com"

# 信件內容

msg = "my test mail"

svr = smtplib.SMTP(mailserver)

# 設置為調試模式,就是在會話過程中會有輸出信息

svr.set_debuglevel(1)

# ehlo命令,docmd方法包括了獲取對方服務器返回信息,如果支持安全郵件,返回值里會有starttls提示

svr.docmd("EHLO server")

svr.starttls() #

# auth login 命令

svr.docmd("AUTH LOGIN")

# 發送用戶名,是base64編碼過的,用send發送的,所以要用getreply獲取返回信息

svr.send(base64.encodestring(username))

svr.getreply()

# 發送密碼

svr.send(base64.encodestring(password))

svr.getreply()

# mail from, 發送郵件發送者

svr.docmd("MAIL FROM: " % from_addr)

# rcpt to, 郵件接收者

svr.docmd("RCPT TO: " % to_addr)

# data命令,開始發送數據

svr.docmd("DATA")

# 發送正文數據

svr.send(msg)

# 比如以 . 作為正文發送結束的標記

svr.send(" . ")

svr.getreply()

# 發送結束,退出

svr.quit()

注意: 以上的代碼為了方便我都沒有判斷返回值,嚴格說來,是應該判斷一下返回的代碼的,在smtp協議中,只有返回代碼是2xx或者3xx才能繼續下一步,返回4xx或5xx的,都是出錯了。

總結

以上是生活随笔為你收集整理的smtplib python教程_Python使用poplib模块和smtplib模块收发电子邮件的教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。