python辦自動化--讀取郵箱中特定的郵件,并下載特定的附件

系列文章目錄

python辦公自動化–數據可視化(pandas+matplotlib)–生成條形圖和餅狀圖
python辦公自動化–數據可視化(pandas+matplotlib)–生成折線圖
python辦公自動化–數據可視化(pandas讀取excel文件,matplotlib生成可視化圖表)
python辦公自動化-openpyxl學習-工資表生成工資條
python辦公自動化–使用將csv大文件分割為xlsx小文件
python辦公自動化----使用pandas和os合并多個訂單表
三種方法批量填充訂單表中的空白單元格–python,excel vba,excel
python辦自動化–批量發送帶附件的變量郵件(示例:給員工發送工資條)

文章目錄

  • 系列文章目錄
  • 前言
  • 一、登錄郵箱
  • 二、記錄日志
  • 三、搜索解析郵件
  • 四、設置搜索條件
    • 1.前五十封
    • 2.發件人白名單
    • 3.郵件主題白名單
    • 4.發件日期為今天
  • 五、下載.xlsx附件
  • 六、關閉郵箱安全退出
  • 七.代碼整合(可直接使用)
  • 總結


前言

今天我們來學習使用python讀取郵箱中的郵件,并且將里面的附件表格下載到我們本地的文件夾中。

我們這個系列叫做python自動化辦公,要實現真正意義上的辦公自動化,就是要解放我們的雙手,實現全過程的自動化。基本上數據分析的工作分為以下流程:收集數據----清晰整理數據-----分析數據-----發送結果
我們前面學習了使用pandas清洗整理數據(結合我的另一個專欄–python數據分析),學習了python發送帶附件的變量郵件(發送結果),至于最精彩最關鍵的分析數據這個階段,我們也略微接觸了一些,今天我們就好好學習一下python讀取郵件。

情景設置:你是公司的數據分析師,每天各個部門的負責人每天八點會將昨天的數據作為附件表格,以“order”和“kucun”作為主題發送到你的郵箱,你需要使用將每天的郵件里面的附件下載到本地的E盤的“附件下載”這個文件夾中。

一、登錄郵箱

# 導入imaplib庫用于IMAP協議郵箱操作
import imaplib
# 郵箱登錄用戶名
email_user = "youremail"
# 郵箱授權碼(非登錄密碼),用于IMAP協議認證
email_password = "yourpassword"
# IMAP服務器地址,Foxmail使用QQ郵箱的IMAP服務器
imap_server = "imap.qq.com"
mail = imaplib.IMAP4_SSL(imap_server)
# 使用用戶名和授權碼登錄郵箱
mail.login(email_user, email_password)
print("郵箱登錄成功")

首先我們要在郵箱的設置界面打開我們的smtp/imap/pop3等服務,在這個過程中,我們會獲得一個授權碼,通過這個授權碼,我們就可以將連接到我們的郵箱。我這里登錄的是QQ郵箱,所以服務器地址就是“imap.qq.com”,那么大家在嘗試登錄的時候,就要先把上面的用戶名,授權碼以及郵箱地址改為自己的地址和授權碼。
登錄成功以后,我們才可以進行下面的操作。

在這里插入圖片描述

二、記錄日志

因為我們讀取郵件下載附件這個動作并不是只做一次,所以我們需要設置日志來記錄腳本的運行信息。

# 導入logging庫用于記錄日志
import logging
# 導入os庫用于文件和目錄操作
import os  
# 附件下載目錄,使用雙反斜杠轉義
download_folder = "E:\\附件下載"# 日志系統配置
# ============
logging.basicConfig(level=logging.DEBUG,  # 設置日志級別為DEBUG,記錄所有級別日志format="%(asctime)s - %(levelname)s - %(message)s",  # 日志格式: 時間-級別-消息handlers=[# 文件處理器,將日志寫入到下載目錄中的email_downloader.log文件logging.FileHandler(os.path.join(download_folder, "email_downloader.log")),# 控制臺處理器,將日志輸出到標準輸出logging.StreamHandler()]
)
# 獲取當前模塊的日志記錄器實例
logger = logging.getLogger(__name__)

這里我們在E盤新建一個文件夾叫做“附件下載”,在這里面我們會新建一個log文件來保存日志

三、搜索解析郵件

# 導入email.utils用于郵件日期解析
import email.utils
# 導入email.header用于解碼郵件頭
import email.header
# 選擇收件箱文件夾
mail.select("inbox")
# 執行IMAP搜索命令
status, messages = mail.search(None, search_criteria)
if status != "OK":  # 檢查搜索是否成功raise Exception("郵件搜索失敗")
# 解析郵件內容為Message對象
email_message = email.message_from_bytes(msg_data[0][1])

四、設置搜索條件

# 1. FROM 白名單中的任一發件人(使用OR連接)
# 2. SINCE 今天日期
# 3. HAS attachment 必須包含附件
from_clause = " OR ".join([f'FROM "{sender}"' for sender in sender_whitelist])
search_criteria = f'({from_clause} SINCE "{today}" HAS attachment)'
logger.info(f"嚴格模式: 只處理今天({today})收到的郵件")
logger.info(f"發件人白名單: {sender_whitelist}")
logger.info(f"主題白名單: {subject_whitelist}")
logger.info(f"搜索條件: {search_criteria}")

1.前五十封

代碼如下(示例):


# 獲取郵件ID列表并只取最后50個(最新的50封)
mail_ids = messages[0].split()[-50:]
logger.info(f"找到 {len(mail_ids)} 封匹配郵件,只處理最近50封")# 從最新到最舊處理郵件
for mail_id in reversed(mail_ids):# 獲取郵件完整內容(RFC822格式)status, msg_data = mail.fetch(mail_id, "(RFC822)")if status != "OK":  # 如果獲取失敗則跳過continue

通常我們的郵箱每天不會收到太多郵件,50封這個量對于一天來說應該綽綽有余了

2.發件人白名單

# 發件人郵箱白名單列表
sender_whitelist = ["fajianren1@163.com",  # 示例郵箱1"fajianren2@gmail.com",  # 示例郵箱2
]
if from_header not in sender_whitelist:  # 嚴格檢查白名單logger.debug(f"跳過非白名單發件人: {from_header}")continue

通常每天給我們發送郵件的人是固定的,我們只需要下載他們發送的郵件里面的附件,因此添加發件人白名單這一個限制條件。

3.郵件主題白名單

# 主題白名單列表(精確匹配)
subject_whitelist = ["order",  # 示例主題1"kucun"
]
subject = email_message['Subject']
if subject not in subject_whitelist:  # 嚴格檢查主題白名單logger.debug(f"跳過非白名單主題: {subject}")continue

有時候這部門負責人給我們發的郵件并不是昨天的銷售數據,所以我們要用郵件主題進行區分
這里和上面的發件人白名單是一樣的處理邏輯,這里注意兩點;1.使用英文作為郵件主題,比如上面的"order"和"kucun";2.注意大小寫,這里是嚴格匹配,所以大小寫需要保持一致

4.發件日期為今天

# 從datetime導入datetime用于日期時間處理
from datetime import datetime# 郵件日期驗證
# ===========
try:# 解析郵件日期頭mail_date = email.utils.parsedate_to_datetime(email_message['Date']) if email_message['Date'] else Noneif mail_date and mail_date.date() != datetime.now().date():  # 如果不是今天則跳過logger.debug(f"跳過非今天({mail_date.date()})收到的郵件")continue

這里我們需要設置時間為條件,確保我們每天下載的都是最新的數據,要不然會重復下載前面幾天的數據。

五、下載.xlsx附件

# 遍歷郵件各部分
# =============
for part in email_message.walk():  # 遞歸遍歷郵件所有部分if part.get_content_maintype() == "multipart":  # 跳過multipart容器部分continue# 檢查是否為.xlsx附件# ==================filename = part.get_filename()  # 獲取附件文件名content_type = part.get_content_type()  # 獲取內容類型# 判斷條件:# 1. 文件名以.xlsx結尾,或# 2. 內容類型是Excel文件if (filename and filename.lower().endswith(".xlsx")) or \(content_type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"):# 處理無文件名的情況# ================if not filename:  # 如果附件沒有文件名# 使用郵件ID生成唯一文件名filename = f"attachment_{mail_id.decode()}.xlsx"# 文件名處理# =========# 解碼郵件頭中的文件名decoded_name = email.header.decode_header(filename)[0][0]if isinstance(decoded_name, bytes):decoded_name = decoded_name.decode('utf-8')today_str = datetime.now().strftime("%Y%m%d")  # 獲取當前日期字符串base_name, ext = os.path.splitext(decoded_name)  # 拆分文件名和擴展名# 生成新文件名格式:YYYYMMDD-原文件名.xlsxnew_filename = f"{today_str}-{base_name}{ext}"# 拼接完整的文件保存路徑filepath = os.path.join(download_folder, new_filename)# 附件保存處理# ===========if not os.path.exists(filepath):  # 檢查文件是否已存在# 以二進制模式保存附件with open(filepath, "wb") as f:f.write(part.get_payload(decode=True))  # 解碼并寫入附件內容logger.info(f"下載附件: {filename} -> {new_filename}")else:  # 文件已存在則跳過logger.info(f"附件已存在,跳過: {new_filename}")

首先我們根據文件類型篩選出.xlsx格式的附件,然后我們將當天的日期和附件的名字結合在一起,作為新名字,最后我們將附件以新名字命名保存到E盤的‘附件下載”這個文件夾中


六、關閉郵箱安全退出

    # 關閉郵箱連接# ===========mail.close()  # 關閉當前郵箱文件夾mail.logout()  # 退出IMAP會話logger.info("處理完成")  # 記錄處理完成信息except Exception as e:  # 異常處理部分# 記錄錯誤信息,包含堆棧跟蹤logger.error(f"發生錯誤: {str(e)}", exc_info=True)  # 確保郵箱連接被正確關閉if 'mail' in locals() and mail.state != 'LOGOUT':  # 檢查mail對象是否存在且未退出try:mail.logout()  # 嘗試安全退出except:pass  # 忽略退出時的任何錯誤if __name__ == "__main__":# 當腳本直接運行時執行主函數download_specific_attachments()  

七.代碼整合(可直接使用)

# 導入imaplib庫用于IMAP協議郵箱操作
import imaplib
# 導入email庫用于解析郵件內容
import email  
# 導入os庫用于文件和目錄操作
import os  
# 導入logging庫用于記錄日志
import logging  
# 從datetime導入datetime用于日期時間處理
from datetime import datetime
# 導入email.utils用于郵件日期解析
import email.utils
# 導入email.header用于解碼郵件頭
import email.headerdef download_specific_attachments():"""下載指定發件人今天發送的郵件中的.xlsx附件主要功能:1. 連接IMAP郵箱服務器2. 搜索指定發件人今天發送的郵件3. 只處理最近20封郵件4. 解析郵件內容并識別.xlsx附件5. 下載附件并按指定格式重命名6. 記錄完整操作日志"""# 郵箱服務器配置部分# ====================# 郵箱登錄用戶名email_user = "youremail"# 郵箱授權碼(非登錄密碼),用于IMAP協議認證email_password = "yourpassword"# IMAP服務器地址,Foxmail使用QQ郵箱的IMAP服務器imap_server = "imap.qq.com"# 發件人郵箱白名單列表sender_whitelist = ["fajianren1@163.com",  # 示例郵箱1"fajianren2@gmail.com",  # 示例郵箱2]# 主題白名單列表(精確匹配)subject_whitelist = ["order" , # 示例主題1"kucun" ]# 附件下載目錄,使用雙反斜杠轉義download_folder = "E:\\附件下載"# 日志系統配置# ============logging.basicConfig(level=logging.DEBUG,  # 設置日志級別為DEBUG,記錄所有級別日志format="%(asctime)s - %(levelname)s - %(message)s",  # 日志格式: 時間-級別-消息handlers=[# 文件處理器,將日志寫入到下載目錄中的email_downloader.log文件logging.FileHandler(os.path.join(download_folder, "email_downloader.log")),# 控制臺處理器,將日志輸出到標準輸出logging.StreamHandler()])# 獲取當前模塊的日志記錄器實例logger = logging.getLogger(__name__)# 創建附件下載目錄# exist_ok=True表示如果目錄已存在不會報錯os.makedirs(download_folder, exist_ok=True)try:# 郵箱連接和登錄部分# ==================logger.info("正在連接到IMAP服務器...")# 創建IMAP4_SSL安全連接對象mail = imaplib.IMAP4_SSL(imap_server)# 使用用戶名和授權碼登錄郵箱mail.login(email_user, email_password)# 記錄登錄成功狀態logger.info("登錄成功")# 選擇收件箱文件夾mail.select("inbox")# 構造IMAP搜索條件# ===============# 獲取今天的日期,格式化為IMAP要求的格式(如"21-Jul-2025")today = datetime.now().strftime("%d-%b-%Y")# 構造IMAP搜索條件:# 1. FROM 白名單中的任一發件人(使用OR連接)# 2. SINCE 今天日期# 3. HAS attachment 必須包含附件from_clause = " OR ".join([f'FROM "{sender}"' for sender in sender_whitelist])search_criteria = f'({from_clause} SINCE "{today}" HAS attachment)'logger.info(f"嚴格模式: 只處理今天({today})收到的郵件")logger.info(f"發件人白名單: {sender_whitelist}")logger.info(f"主題白名單: {subject_whitelist}")logger.info(f"搜索條件: {search_criteria}")# 執行IMAP搜索命令status, messages = mail.search(None, search_criteria)if status != "OK":  # 檢查搜索是否成功raise Exception("郵件搜索失敗")# 處理搜索結果# =============# 獲取郵件ID列表并只取最后20個(最新的20封)mail_ids = messages[0].split()[-20:]logger.info(f"找到 {len(mail_ids)} 封匹配郵件,只處理最近20封")# 從最新到最舊處理郵件for mail_id in reversed(mail_ids):# 獲取郵件完整內容(RFC822格式)status, msg_data = mail.fetch(mail_id, "(RFC822)")if status != "OK":  # 如果獲取失敗則跳過continue# 解析郵件內容為Message對象email_message = email.message_from_bytes(msg_data[0][1])# 驗證發件人是否在白名單中# ========================# 驗證郵件主題是否在白名單中,并處理中文漢字主題# ========================from_header = email.utils.parseaddr(email_message['From'])[1]  # 解析發件人郵箱if from_header not in sender_whitelist:  # 嚴格檢查白名單logger.debug(f"跳過非白名單發件人: {from_header}")continuetry:# 嘗試將郵件主題解碼為utf-8,處理可能的中文字符問題subject = email_message['Subject'].encode('latin1').decode('utf-8')except UnicodeDecodeError:# 如果解碼失敗,則記錄日志并跳過該郵件logger.warning("郵件主題編碼問題,跳過該郵件")continueif subject not in subject_whitelist:  # 嚴格檢查主題白名單logger.debug(f"跳過非白名單主題: {subject}")continue# 郵件日期驗證# ===========try:# 解析郵件日期頭mail_date = email.utils.parsedate_to_datetime(email_message['Date']) if email_message['Date'] else Noneif mail_date and mail_date.date() != datetime.now().date():  # 如果不是今天則跳過logger.debug(f"跳過非今天({mail_date.date()})收到的郵件")continueelif not mail_date:  # 如果郵件沒有日期信息則默認處理logger.debug("郵件無日期信息,默認處理")except Exception as e:  # 日期解析錯誤處理logger.warning(f"日期解析錯誤: {str(e)},默認處理")# 遍歷郵件各部分# =============for part in email_message.walk():  # 遞歸遍歷郵件所有部分if part.get_content_maintype() == "multipart":  # 跳過multipart容器部分continue# 檢查是否為.xlsx附件# ==================filename = part.get_filename()  # 獲取附件文件名content_type = part.get_content_type()  # 獲取內容類型# 判斷條件:# 1. 文件名以.xlsx結尾,或# 2. 內容類型是Excel文件if (filename and filename.lower().endswith(".xlsx")) or \(content_type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"):# 處理無文件名的情況# ================if not filename:  # 如果附件沒有文件名# 使用郵件ID生成唯一文件名filename = f"attachment_{mail_id.decode()}.xlsx"# 文件名處理# =========# 解碼郵件頭中的文件名decoded_name = email.header.decode_header(filename)[0][0]if isinstance(decoded_name, bytes):decoded_name = decoded_name.decode('utf-8')today_str = datetime.now().strftime("%Y%m%d")  # 獲取當前日期字符串base_name, ext = os.path.splitext(decoded_name)  # 拆分文件名和擴展名# 生成新文件名格式:YYYYMMDD-原文件名.xlsxnew_filename = f"{today_str}-{base_name}{ext}"# 拼接完整的文件保存路徑filepath = os.path.join(download_folder, new_filename)  # 附件保存處理# ===========if not os.path.exists(filepath):  # 檢查文件是否已存在# 以二進制模式保存附件with open(filepath, "wb") as f:  f.write(part.get_payload(decode=True))  # 解碼并寫入附件內容logger.info(f"下載附件: {filename} -> {new_filename}")  else:  # 文件已存在則跳過logger.info(f"附件已存在,跳過: {new_filename}")  # 關閉郵箱連接# ===========mail.close()  # 關閉當前郵箱文件夾mail.logout()  # 退出IMAP會話logger.info("處理完成")  # 記錄處理完成信息except Exception as e:  # 異常處理部分# 記錄錯誤信息,包含堆棧跟蹤logger.error(f"發生錯誤: {str(e)}", exc_info=True)  # 確保郵箱連接被正確關閉if 'mail' in locals() and mail.state != 'LOGOUT':  # 檢查mail對象是否存在且未退出try:mail.logout()  # 嘗試安全退出except:pass  # 忽略退出時的任何錯誤if __name__ == "__main__":# 當腳本直接運行時執行主函數download_specific_attachments()  

點擊運行后,在我本地的E盤里面的“附件下載”這個文件夾內容如下
在這里插入圖片描述
可以看到,成功下載了附件以及生成了log日志
那么大家在使用上面的代碼的時候,需要修改的就是郵箱,授權碼,以及發件人白名單和郵件主題白名單了。

總結

今天我們學習了用python讀取郵箱里面的郵件,并且下載附件到本地,我們還設置了時間、發件人以及郵件主題等多個限制條件。其實這里面可以玩的東西遠不止這么多,我大家可以自行去探索。

OK,那么到今天為止,我們就講完了python發郵件以及收郵件,我們得到了數據源,那么下階段將正式開始學習python處理數據,當然主要是excel表格的數據,包括一些匹配、聚合等等,當然如果有空也會更新python處理word或者pptx等。

至于下階段的更新,我會放在python數據分析這個專欄。如果大家對上面的文章有不懂的地方,也可以隨時私信我。同樣的,如果大家發現哪里不對,也歡迎批評指正哈。
大家有興趣的可以點個關注以及免費的贊贊喲,愛你們!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916160.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916160.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916160.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

清理DNS緩存

Cloudflarehttps://1.1.1.1/purge-cacheGooglehttps://dns.google/cacheOpenDNShttps://cachecheck.opendns.comLinux DNS緩存sudo systemd-resolve --flush-caches 或 sudo /etc/init.d/nscd restartWindows DNS緩存ipconfig /flushdnsmacOS DNS緩存sudo dscacheutil -flushca…

用 Python 寫你的第一個爬蟲:小白也能輕松搞定數據抓取(超詳細包含最新所有Python爬蟲庫的教程)

用 Python 寫你的第一個爬蟲:小白也能輕松搞定數據抓取(超詳細包含最新所有Python爬蟲庫的教程) 摘要 本文是一篇面向爬蟲愛好者的超詳細 Python 爬蟲入門教程,涵蓋了從基礎到進階的所有關鍵技術點:使用 Requests 與…

openmv識別數字

Lenet是一種卷積識別網絡,可以用來識別打印的,或者是手寫的數字利用NCC的模板匹配算法來進行數字識別,模板匹配需要我們事先保存需要匹配的數字以及字母的模板圖片,模板匹配對于模板的大小和角度,有一定的要求如果數字的大小和角度有所變換&a…

一款功能全面的文體場所預約小程序

大家好?? ,我是 阿問學長!專注于分享優質開源項目解析、計算機學習資料推薦,并為同學們提供畢業設計項目指導支持,歡迎關注交流!?? 項目概述 隨著全民健身的普及,各地新建了大批體育、健身、文化娛樂場所,中小學校園的運動設施也開始對市民開放。為了合理安排主辦…

PyTorch中實現早停機制(EarlyStopping)附代碼

1. 核心目的 當模型在驗證集上的性能不再提升時,提前終止訓練防止過擬合,節省計算資源 2. 實現方法 監控驗證集指標(如損失、準確率),設置耐心值(Patience) 3. 代碼: class EarlySto…

Nacos-服務注冊,服務發現(一)

nacos快速入手 Nacos是Spring Cloud Alibaba的組件, Spring Cloud Alibaba遵循Spring Cloud中定義的服務注冊, 服 務發現規范. 因此使?Nacos和使?Eureka對于微服務來說,并沒有太?區別. 主要差異在于: Eureka需要??搭建?個服務, Nacos不???搭…

單片機(STM32-ADC模數轉換器)

一、基礎知識1. 模擬信號(Analog Signal)定義:模擬信號是連續變化的信號,可以取任意數值。特點:幅值和時間都是連續的,沒有“跳變”。舉例:聲音(麥克風采集到的電壓)溫度…

side.cpp - OpenExo

side.cpp構造函數源代碼run_side - 核心read_data()源代碼FSR壓力傳感器讀取與賦值步態事件檢測:落地(ground_strike)步態周期自適應:期望步長更新Toe-Off/Toe-On事件檢測與站立/擺動窗口更新步態百分比進度估算FSR閾值動態讀取&a…

基于Java+MySQL實現(Web)文件共享管理系統(仿照百度文庫)

文件共享管理系統的設計與實現摘要:本文件共享管理系統解決了用戶在搜索文件不需要下載文件到本地硬盤后才能查看文件的詳細內容的弊端;解決用戶在搜索關鍵字不明確條件下無法搜索到自己需要的文件弊端;解決了系統用戶并發量增加后服務器宕機…

go語言基礎教程:1. Go 下載安裝和設置

1. Go 下載安裝和設置1. 安裝Go 官網下載安裝即可,注意要記住安裝的位置,例如D:\Go cmd輸入go 或者go env 會輸出各種信息,代表安裝成功 2. hello go (1)編寫 hello.go go是以文件夾為最小單位管理程序的&#xff0c…

使用相機不同曝光時間測試燈光閃爍頻率及Ai解釋

1.背景坐地鐵上,撥弄著手機拍照中的專業模式,偶然發現拍出了條紋,懷疑是燈光的緣故,但是隨后在家里的LED等下就拍不出類似的效果了。好奇心?讓我又嘗試多了解了一點和不斷嘗試,發現不同的曝光時間可以拍出不同明顯程度…

力扣-416.分割等和子集

題目鏈接 416.分割等和子集 class Solution {public boolean canPartition(int[] nums) {int sum 0;for (int i 0; i < nums.length; i) {sum nums[i];}if (sum % 2 1)return false;int target sum / 2;// dp[i]表示&#xff1a;背包容量為i時&#xff0c;能裝的最大…

http協議學習-body各種類型

1、概述使用postman工具和nc命令分析http協議中body各種類型的格式。2、分析環境準備虛擬機中用nc命令模仿服務器&#xff0c;啟動監聽狀態。 windows機器安裝postmannc -k -l 192.168.202.223 80821、params參數postman中params添加倆個key為m、n&#xff1b;value為1、2&…

C++中的塔尖算法(Tarjan算法)詳解

C中的塔尖算法&#xff08;Tarjan算法&#xff09;詳解——目錄C中的塔尖算法&#xff08;Tarjan算法&#xff09;詳解一、什么是Tarjan算法&#xff1f;二、算法原理與實現步驟1. 核心概念2. 主要邏輯3. C代碼示例三、應用場景與擴展1. 典型應用2. 注意事項四、為什么選擇Tarj…

Qt 數據庫事務處理與數據安全

在 Qt 應用程序中&#xff0c;數據庫事務處理是確保數據完整性和一致性的關鍵技術。通過事務&#xff0c;可以將多個數據庫操作作為一個不可分割的單元執行&#xff0c;保證數據在并發訪問和異常情況下的安全性。本文將詳細介紹 Qt 中數據庫事務的處理方法和數據安全策略。 一、…

Redis的事務和Lua之間的區別

Redis的事務和Lua之間的區別 Redis 提供了事務和 Lua 腳本兩種實現原子性操作的方式。當需要以原子方式執行多個命令時,我們可以選擇其中一種方案。 原子性保證 兩者都確保操作的不可分割性 需要注意:不管是事務還是 Lua 腳本都不支持回滾機制 區別: 事務:某個命令失敗不會…

騰訊云SDK

SDK的用途&#xff0c;現在顯然是想更系統地了解它的產品定位和核心能力。 用戶可能是開發者或者技術決策者&#xff0c;正在評估騰訊云的開發工具鏈。從ta連續追問云服務相關技術細節的習慣看&#xff0c;應該具備相當的技術背景&#xff0c;但需要避免過度使用術語。 需要突出…

大數據集分頁優化:LIMIT OFFSET的替代方案

針對大數據集分頁場景中 LIMIT OFFSET 的性能瓶頸&#xff0c;以下是已驗證的高效替代方案及實施要點&#xff1a;?? 一、LIMIT OFFSET 的核心問題當偏移量&#xff08;OFFSET&#xff09;增大時&#xff0c;數據庫需?物理掃描并丟棄前 N 條記錄?&#xff0c;導致資源浪費和…

Linux網絡框架分析

在 Linux 內核架構中,/net 和 /drivers/net 是網絡子系統的兩個核心組成部分,它們之間的關系體現了 Linux 經典的 “抽象層分離” 設計哲學。以下是深入分析: 一、核心關系圖解 #mermaid-svg-esFw9i3LN65SYumi {font-family:"trebuchet ms",verdana,arial,sans-se…

ISIS高級特性GR

一、概述IS-IS GR是一種支持GR能力的高可靠性技術&#xff0c;可以實現數據的不間斷轉發。與我們之前介紹的OSPF的GR功能幾乎一致,但實現方法并不相同。1、GR支持GR的ISIS的設備,IIH報文中一定會攜帶TLV211(GR),TLV211包含的字段(1)RR:restart request 請求重啟,默認是3秒發送1…