Python開(kāi)發(fā)之SMTP連接與字符串處理錯(cuò)誤與解決方案
引言
在Python開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者經(jīng)常會(huì)遇到各種錯(cuò)誤和異常。有些錯(cuò)誤顯而易見(jiàn),例如語(yǔ)法錯(cuò)誤;而有些則較為隱蔽,例如網(wǎng)絡(luò)連接問(wèn)題或第三方API的限制。本文將總結(jié)兩個(gè)典型的Python開(kāi)發(fā)問(wèn)題:SMTP服務(wù)器連接失敗和f-string字符串處理錯(cuò)誤,分析其原因,并提供詳細(xì)的解決方案。文章還將包含代碼示例和最佳實(shí)踐建議,幫助開(kāi)發(fā)者避免類似問(wèn)題。
1. SMTP服務(wù)器連接失敗問(wèn)題
1.1 錯(cuò)誤現(xiàn)象
在嘗試使用Python的smtplib連接QQ郵箱SMTP服務(wù)器時(shí),出現(xiàn)以下錯(cuò)誤:
2025-05-15 23:34:58,808 - app - ERROR - SMTP服務(wù)器連接失敗: (-1, b'\x00\x00\x00')
Traceback (most recent call last):
File "/doudian-phone-tool/doudian/send_qq_email.py", line 70, in send_email_with_attachment
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
File "/usr/local/lib/python3.11/smtplib.py", line 284, in __exit__
raise SMTPResponseException(code, message)
smtplib.SMTPResponseException: (-1, b'\x00\x00\x00')
1.2 可能的原因
1.SMTP服務(wù)未開(kāi)啟:QQ郵箱默認(rèn)關(guān)閉SMTP服務(wù),需手動(dòng)開(kāi)啟。
2.錯(cuò)誤的服務(wù)器配置:
錯(cuò)誤的SMTP服務(wù)器地址(如smtp.qq.com拼寫(xiě)錯(cuò)誤)
錯(cuò)誤的端口號(hào)(465或587)
3.授權(quán)問(wèn)題:
使用了郵箱密碼而非授權(quán)碼(QQ郵箱要求使用授權(quán)碼而非原始密碼)
授權(quán)碼已過(guò)期(修改QQ郵箱密碼后,授權(quán)碼會(huì)失效)
4.網(wǎng)絡(luò)或防火墻限制:
服務(wù)器無(wú)法訪問(wèn)SMTP服務(wù)(如云服務(wù)器未開(kāi)放465端口)
本地防火墻或安全組規(guī)則阻止連接
1.3 解決方案
(1) 檢查并開(kāi)啟QQ郵箱SMTP服務(wù)
登錄QQ郵箱網(wǎng)頁(yè)版 → 進(jìn)入設(shè)置 → 賬戶
找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù)
開(kāi)啟IMAP/SMTP服務(wù),并生成新的授權(quán)碼(16位字符串)
(2) 驗(yàn)證SMTP配置
確保代碼中的SMTP配置正確:
smtp_server = "smtp.qq.com" # 必須正確 smtp_port = 465 # SSL端口,或587(STARTTLS) sender_email = "your_email@qq.com" password = "your_authorization_code" # 不是QQ郵箱密碼!
(3) 改進(jìn)錯(cuò)誤處理
優(yōu)化代碼,增加更詳細(xì)的錯(cuò)誤日志和重試機(jī)制:
import smtplib import time from socket import gaierror ???????def send_email_with_retry(sender, password, recipients, msg, max_retries=3): for attempt in range(max_retries): try: with smtplib.SMTP_SSL("smtp.qq.com", 465) as server: server.login(sender, password) server.sendmail(sender, recipients, msg.as_string()) return True except smtplib.SMTPAuthenticationError: print("SMTP認(rèn)證失?。赫?qǐng)檢查郵箱和授權(quán)碼") return False except (smtplib.SMTPException, gaierror) as e: print(f"SMTP連接失敗(嘗試 {attempt + 1}/{max_retries}):{str(e)}") time.sleep(2) # 延遲2秒后重試 return False
2. f-string字符串引號(hào)嵌套錯(cuò)誤
2.1 錯(cuò)誤現(xiàn)象
在Python代碼中使用f-string時(shí),由于引號(hào)嵌套錯(cuò)誤導(dǎo)致語(yǔ)法錯(cuò)誤:
current_app.logger.info(f"【{item['waybillNum']}】運(yùn)單號(hào),【{record["手機(jī)號(hào)"]}】手機(jī)號(hào)處理成功,保存訂單到數(shù)據(jù)庫(kù)")
^^^^^^^^^
SyntaxError: f-string: unmatched '['
2.2 原因分析
引號(hào)沖突:f-string 的外層使用雙引號(hào) "...",而內(nèi)部字典鍵也使用了雙引號(hào) record["手機(jī)號(hào)"],導(dǎo)致Python解析器無(wú)法正確識(shí)別字符串邊界。
f-string的解析規(guī)則:Python的f-string要求引號(hào)必須正確配對(duì),否則會(huì)拋出SyntaxError。
2.3 解決方案
(1) 外層使用單引號(hào),內(nèi)層使用雙引號(hào)
current_app.logger.info(f'【{item["waybillNum"]}】運(yùn)單號(hào),【{record["手機(jī)號(hào)"]}】手機(jī)號(hào)處理成功,保存訂單到數(shù)據(jù)庫(kù)')
(2) 統(tǒng)一使用單引號(hào)
current_app.logger.info(f'【{item[\'waybillNum\']}】運(yùn)單號(hào),【{record[\'手機(jī)號(hào)\']}】手機(jī)號(hào)處理成功,保存訂單到數(shù)據(jù)庫(kù)')
(3) 使用轉(zhuǎn)義字符
current_app.logger.info(f"【{item['waybillNum']}】運(yùn)單號(hào),【{record['手機(jī)號(hào)']}】手機(jī)號(hào)處理成功,保存訂單到數(shù)據(jù)庫(kù)")
2.4 最佳實(shí)踐
優(yōu)先使用單引號(hào)作為字符串分隔符(Python社區(qū)推薦)。
避免混用引號(hào),如外層雙引號(hào) + 內(nèi)層雙引號(hào)。
使用格式化工具(如black或autopep8)自動(dòng)調(diào)整代碼風(fēng)格。
3. 總結(jié)與建議
3.1 如何避免類似錯(cuò)誤
問(wèn)題類型 | 預(yù)防措施 |
---|---|
SMTP連接失敗 | 1. 檢查SMTP服務(wù)是否開(kāi)啟 2. 使用正確的授權(quán)碼 3. 增加錯(cuò)誤重試機(jī)制 |
f-string引號(hào)錯(cuò)誤 | 1. 統(tǒng)一引號(hào)風(fēng)格 2. 使用代碼格式化工具 3. 避免多層嵌套 |
3.2 調(diào)試技巧
日志記錄:使用logging模塊記錄詳細(xì)錯(cuò)誤信息。
逐步測(cè)試:先測(cè)試SMTP連接(如telnet smtp.qq.com 465),再調(diào)試代碼。
靜態(tài)檢查:使用pylint或flake8檢查語(yǔ)法問(wèn)題。
到此這篇關(guān)于Python開(kāi)發(fā)之SMTP連接與字符串處理錯(cuò)誤與解決方案的文章就介紹到這了,更多相關(guān)Python常見(jiàn)錯(cuò)誤解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3操作mysql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了python3操作mysql數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06詳解Python排序算法的實(shí)現(xiàn)(冒泡,選擇,插入,快速)
這篇文章主要為大家介紹了Python中常見(jiàn)的四種排序算法的實(shí)現(xiàn):冒泡排序、選擇排序、插入排序和快速排序,文中通過(guò)圖片詳細(xì)講解了它們實(shí)現(xiàn)的原理與代碼,需要的可以參考一下2022-04-04Pyhton模塊和包相關(guān)知識(shí)總結(jié)
文中詳細(xì)整理了關(guān)于Python模塊和包的相關(guān)知識(shí)點(diǎn),剛?cè)腴T(mén)Python的小伙伴們可以學(xué)習(xí)一下,有助于加深Python基礎(chǔ)的理解.而且有詳細(xì)說(shuō)明及代碼示例,需要的朋友可以參考下2021-05-05Effective Python bytes 與 str 的區(qū)別
這篇文章主要介紹了Effective Python bytes 與 str 的區(qū)別,Python 有兩種類型可以表示字符序列,下面圍繞Python bytes 與 str 的相關(guān)資料展開(kāi)內(nèi)容,需要的朋友可以參考一下2021-11-11Python讀寫(xiě)常用數(shù)據(jù)文件的示例詳解
Python?提供了多種強(qiáng)大的工具和庫(kù),可以輕松實(shí)現(xiàn)對(duì)各種類型文件的讀寫(xiě)操作,本文為大家整理了Python讀寫(xiě)常用的那些數(shù)據(jù)文件的方法,希望對(duì)大家有所幫助2025-01-01Django 根據(jù)數(shù)據(jù)模型models創(chuàng)建數(shù)據(jù)表的實(shí)例
今天小編就為大家分享一篇Django 根據(jù)數(shù)據(jù)模型models創(chuàng)建數(shù)據(jù)表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python api構(gòu)建tensorrt加速模型的步驟詳解
小編個(gè)人認(rèn)為python比c++更容易讀并且已經(jīng)有很多包裝很好的科學(xué)運(yùn)算庫(kù)(numpy,scikit等),今天通過(guò)本文給大家分享Python api構(gòu)建tensorrt加速模型的步驟,感興趣的朋友一起看看吧2021-09-09