簡介
本篇總結了 QQ (SSL)郵箱和 163(非SSL) 郵箱發送郵件,專治各種不行,總之看完這篇以后麻麻再也不用擔心我的郵件收不到了。以下代碼兼容 python2 和 python3,運行無異常,放心大膽使用。
常用郵件協議
發送郵件:SMTP
收取郵件:POP3、IMAP
常用郵件配置項
配置項 | 說明 |
mail.xxx.ssl.enable | 是否支持 SSL 連接 |
mail.xxx.host | 郵件服務器主機名 |
mail.xxx.port | 郵件服務器端口號 |
mail.xxx.auth | 是否進行身份認證 |
說明:xxx 表示協議名稱,例如:smtp、pop3 等。
默認端口號
SMTP | POP3 | IMAP | |
普通方式(非SSL) | 25 | 110 | 143 |
SSL 方式 | 465 | 995 | 993 |
163郵箱(非SSL)
1、先導入 smtplib 庫用來發送郵件,導入 MIMEText 庫用來做純文本的郵件模板
2、先准備幾個跟發郵件相關的參數,每個郵箱的發件服務器都不一樣,以 163為例,百度搜到發件服務器為:smtp.163.com
3、接下來就是寫郵件的主題和正文內容,正文這里用 html 格式的
4、最后調用發件服務
5、參考代碼
1 # coding=utf-8 2 #1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行 3 4 #2.注釋:包括記錄創建時間,創建人,項目名稱。 5 ''' 6 Created on 2019-5-8 7 @author: 北京-宏哥 8 Project:學習和使用163郵箱發郵件 9 ''' 10 #3.導入模塊 11 import smtplib 12 from email.mime.text import MIMEText 13 # ----------1.跟發件相關的參數------ 14 smtpserver = "smtp.163.com" # 發件服務器 15 port = 0 # 端口 16 sender = "hongge@163.com" # 賬號 17 psw = "**************" # 密碼 18 receiver = "1918991791@qq.com" # 接收人 19 # ----------2.編輯郵件的內容------ 20 subject = "這個是主題 163" 21 body = '<p>這個是發送的 163 郵件</p>' # 定義郵件正文為 html 格式 22 msg = MIMEText(body, "html", "utf-8") 23 msg['from'] = sender 24 msg['to'] = "19198991791@qq.com" 25 msg['subject'] = subject 26 # ----------3.發送郵件------ 27 smtp = smtplib.SMTP() 28 smtp.connect(smtpserver) # 連服務器 29 smtp.login(sender, psw) # 登錄 30 smtp.sendmail(sender, receiver, msg.as_string()) # 發送 31 smtp.quit() # 關閉
QQ郵箱(SSL)
1、QQ 郵箱是需要 SSL 認證的,這種郵箱跟上面的就有點不一樣了(如果已經開啟了,不知道授權碼,就點溫馨提示里面的‘生成授權碼’)
2、找到 QQ 郵箱授權碼,打開 QQ 郵箱-設置-賬號-POP3 開啟服務-開啟
3、根據相對應的驗證方式,就會收到授權碼了
4、收到授權碼后復制,保存下來,這個就可以當 QQ 郵箱的密碼了
5、QQ 郵箱發送郵件代碼,跟 163 有點不一樣,如下圖紅色框框:
6、參考代碼
1 # coding=utf-8 2 #1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行 3 4 #2.注釋:包括記錄創建時間,創建人,項目名稱。 5 ''' 6 Created on 2019-5-8 7 @author: 北京-宏哥 8 Project:學習和使用QQ郵箱發郵件 9 ''' 10 #3.導入模塊 11 import smtplib 12 from email.mime.text import MIMEText 13 # ----------1.跟發件相關的參數------ 14 # smtpserver = "smtp.163.com" # 發件服務器 15 smtpserver = "smtp.qq.com" 16 port = 465 # 端口 17 sender = "1918991791@qq.com" # 賬號 18 psw = "**************" # 密碼 19 receiver = "1918991791@qq.com" # 接收人 20 # ----------2.編輯郵件的內容------ 21 subject = "這個是主題 QQ" 22 body = '<p>這個是發送的 QQ 郵件</p>' # 定義郵件正文為 html 格式 23 msg = MIMEText(body, "html", "utf-8") 24 msg['from'] = sender 25 msg['to'] = "1918991791@qq.com" 26 msg['subject'] = subject 27 # ----------3.發送郵件------ 28 # smtp = smtplib.SMTP() 29 # smtp.connect(smtpserver) # 連服務器 30 smtp = smtplib.SMTP_SSL(smtpserver, port) 31 smtp.login(sender, psw) # 登錄 32 smtp.sendmail(sender, receiver, msg.as_string()) # 發送 33 smtp.quit() # 關閉
兼容 163(非SSL) 和 QQ 郵箱(SSL)
1、Python中檢測處理異常是非常重要的,這可以增加代碼的健壯性,我們在寫python程序的時候,會可能會遇到一些不可預料的情況,一旦遇到這些情況,運行時程序便可能會崩潰。異常可以通過 try 語句來檢測. 任何在 try 語句塊里的代碼都
會被監測, 檢查有無異常發生。
try 語句有兩種主要形式: try-except 和 try-finally . 這兩個語句是互斥的, 也就是說你只能使用其中的一種 . 一個 try 語句可以對應一個或多個 except 子句 , 但只能對應一個finally 子句, 或是一個 try-except-finally 復合語句.
try-except 語句(以及其更復雜的形式)定義了進行異常監控的一段代碼, 並且提供了處理異常的機制.
最常見的 try-except 語句語法如下所示,它由try塊和except塊 (try_suite 和 except_suite )組成, 也可以有一個可選的錯誤原因。首先嘗試執行 try 子句, 如果沒有錯誤, 忽略所有的 except 從句繼續執行,如果發生異常, 解釋器將在這一串處理器
(except 子句)中查找匹配的異常。

簡單用法(except后面不跟特定異常,這會捕獲所有異常)這種好處就是你不知道會發生什么異常,盡管用;壞處就是當異常發生時候,不能清楚了解到底發生哪種異常。

我們可以發現,連接沒有成功,但程序是正常運行的,會繼續往下運行如果沒有try,程序則會中斷報錯。我們發現第一個print並沒有運行,這是因為try 語句塊中異常發生點后的剩余語句永遠不會到達(所以也永遠不會執行)。
2、好了關於try的講解就到這里,回歸正題:如果想兼容上面兩種方式發送郵件,只需把第三塊內容稍微改下,如下所示
3、參考代碼
1 # ----------3.發送郵件------ 2 try: 3 #非SSL 4 smtp = smtplib.SMTP() 5 smtp.connect(smtpserver) # 連服務器 6 except: 7 #SSL 8 smtp = smtplib.SMTP_SSL(smtpserver, port) 9 smtp.login(sender, psw) # 登錄 10 smtp.sendmail(sender, receiver, msg.as_string()) # 發送 11 smtp.quit() # 關閉
小結
1、小伙伴們下次遇到這樣的直接就用兼容SSL和非SSL的發送郵件代碼即可。其實也是很簡單!!!