簡介
本篇總結了 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的傳送郵件程式碼即可。其實也是很簡單!!!