<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        pythonsmtplib模塊發送SSL/TLS安全郵件實例

        來源:懂視網 責編:小采 時間:2020-11-27 14:32:23
        文檔

        pythonsmtplib模塊發送SSL/TLS安全郵件實例

        pythonsmtplib模塊發送SSL/TLS安全郵件實例:python的smtplib提供了一種很方便的途徑發送電子郵件。它對smtp協議進行了簡單的封裝。smtp協議的基本命令包括:HELO 向服務器標識用戶身份MAIL 初始化郵件傳輸 mail from:RCPT 標識單個的郵件接收人;常在MAIL命令后面,可有多個rcpt to:DATA
        推薦度:
        導讀pythonsmtplib模塊發送SSL/TLS安全郵件實例:python的smtplib提供了一種很方便的途徑發送電子郵件。它對smtp協議進行了簡單的封裝。smtp協議的基本命令包括:HELO 向服務器標識用戶身份MAIL 初始化郵件傳輸 mail from:RCPT 標識單個的郵件接收人;常在MAIL命令后面,可有多個rcpt to:DATA

        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, stringimport 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:

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

        第二種有點不一樣:

        1.ehlo
        2.auth login
        3.mail from
        4.rcpt to
        5.data
        6.quit

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

        代碼如下:

        #-*- encoding: gb2312 -*-import os, sys, stringimport smtplibimport 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:


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

        看看第一種怎么辦:

        代碼如下:

        #-*- encoding: gb2312 -*-import os, sys, string, socketimport 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, stringimport smtplibimport 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:

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

        【相關推薦】

        1. 詳細介紹Python使用SMTP發送郵件實例

        2. Python 使用SMTP發送郵件的代碼小結

        3. c#調用qq郵箱smtp發送郵件修改版代碼

        4. Python使用SMTP發送郵件

        5. php smtp發送郵件

        6. Python SMTP郵件模塊詳解

        7. 分享Python實現SMTP發送郵件圖文實例

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        pythonsmtplib模塊發送SSL/TLS安全郵件實例

        pythonsmtplib模塊發送SSL/TLS安全郵件實例:python的smtplib提供了一種很方便的途徑發送電子郵件。它對smtp協議進行了簡單的封裝。smtp協議的基本命令包括:HELO 向服務器標識用戶身份MAIL 初始化郵件傳輸 mail from:RCPT 標識單個的郵件接收人;常在MAIL命令后面,可有多個rcpt to:DATA
        推薦度:
        標簽: 郵件 ssl python
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日韩亚洲人成网站| 亚洲国产精品精华液| 青柠影视在线观看免费高清| 亚洲国产婷婷香蕉久久久久久| 亚洲精品无码专区在线播放| 日韩视频免费一区二区三区| 亚洲精华国产精华精华液好用| 毛片免费在线视频| 亚洲AV无码一区二区大桥未久| 四虎影院免费在线播放| 久久久久久久久无码精品亚洲日韩| 日本二区免费一片黄2019| 亚洲av无码成人影院一区| 亚洲Av无码乱码在线znlu| 精品无码一级毛片免费视频观看| 国产亚洲精品激情都市| 免费看少妇高潮成人片| 亚洲黄色网址大全| 色视频色露露永久免费观看| 西西人体大胆免费视频| 亚洲s色大片在线观看| 一二三四免费观看在线视频中文版 | 免费看国产一级特黄aa大片| 一级成人a免费视频| 国产成人麻豆亚洲综合无码精品 | 亚洲熟妇av午夜无码不卡| 国产精品无码一区二区三区免费| 免费国产黄网站在线看| 亚洲精品私拍国产福利在线| 欧美最猛性xxxxx免费| 精精国产www视频在线观看免费| 亚洲精品高清国产一久久| 黄页网站免费在线观看| 九九综合VA免费看| 亚洲综合色丁香麻豆| 国产青草视频在线观看免费影院| 亚洲免费视频一区二区三区| youjizz亚洲| 狠狠亚洲婷婷综合色香五月排名| 国产成人精品免费视频动漫 | 亚洲日本香蕉视频观看视频|