使用IMAP服務獲取163郵箱的未讀郵件

使用IMAP服務獲取163郵箱的未讀郵件

整體的邏輯思路如下:

  1. 開啟163郵箱的IMAP服務,拿到授權碼用于登錄IMAP服務
  2. 登錄IMAP服務,獲取郵箱的未讀郵件列表
  3. 遍歷未讀郵件列表,獲取郵件內容
# 導入必要的庫
import os
import imaplib
import ssl
import email
from email.header import decode_header
from email.utils import parseaddr

1. 開啟163郵箱的IMAP服務,拿到授權碼用于登錄IMAP服務

163郵箱設置IMAP服務,需要到郵箱設置頁面,選擇“郵箱設置”->“POP3/IMAP”->“開啟IMAP服務”,然后點擊“保存”,即可開啟IMAP服務。

2. 登錄IMAP服務,獲取郵箱的未讀郵件列表

# 創建一個默認的SSL上下文對象,用于服務器認證
# 參數設置為None,表示使用默認值,后續將通過代碼明確指定SSL/TLS版本范圍
ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None)
# 指定SSL/TLS的最小版本為TLS 1.2,以確保連接使用的協議不低于此版本
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2# 指定SSL/TLS的最大版本為TLS 1.3,以確保連接不會使用超出此版本的協議
# TLS 1.3是最新的TLS版本,提供了更強的安全性和加密方法
ssl_context.maximum_version = ssl.TLSVersion.TLSv1_3
def login163(user=None, pwd=None, host="imap.163.com" ):# 嘗試建立SSL加密的IMAP連接并登錄# 異常處理增強try:imap_client = imaplib.IMAP4_SSL(host, ssl_context=ssl_context)  # 確保使用TLS 1.2imap_client.login(user, pwd)except imaplib.IMAP4.error as e:print(f"登錄失敗: {e}")return# 發送ID命令給服務器,提供客戶端信息imaplib.Commands["ID"] = ('AUTH',)args = ("name", user, "contact", user, "version", "1.0.0", "vendor", "myclient")imap_client._simple_command("ID", str(args).replace(",", "").replace("'", "\""))return imap_client

3. 遍歷未讀郵件列表,獲取郵件內容

def fetch_and_mark_emails_as_read(imap_client,mailbox="INBOX"):"""從指定的郵箱中獲取未讀郵件,并將這些郵件標記為已讀。:param imap_client: IMAP客戶端對象,用于與郵件服務器交互:param mailbox: string, 指定的郵箱,默認為"INBOX"(收件箱)"""# 選擇郵箱,默認為收件箱imap_client.select(mailbox)# 搜索未讀郵件typ, dat = imap_client.search(None, "UNSEEN")# 解碼郵件編號字符串str_numbers = dat[0].decode('utf-8')# 將編號字符串分割成列表numbers_str_list = str_numbers.split()# 遍歷未讀郵件for msg in numbers_str_list:try:# 獲取郵件內容_, data = imap_client.fetch(msg, '(RFC822)')raw_email = data[0][1]email_message = email.message_from_bytes(raw_email)# 解碼郵件主題subject = decode_email_header(email_message['Subject'])# 解碼發件人信息from_info = decode_header(email_message['From'])name_parts = []for part, charset in from_info:if isinstance(part, bytes):if charset:decoded_part = part.decode(charset)else:decoded_part = part.decode('utf-8', errors='replace')else:decoded_part = partname_parts.append(decoded_part)full_name = ''.join(name_parts).strip() from_person,_=parseaddr(full_name)# 提取郵件正文all_text_body = extract_text_body(email_message)#------------------------------#你對得到的郵件的處理代碼#------------------------------# 標記郵件為已讀imap_client.store(msg, '+FLAGS', '\\Seen')except imaplib.IMAP4.error as e:print(f"處理郵件或標記已讀失敗: {e}")

郵件主題解碼函數:

def decode_email_header(header):"""解碼電子郵件頭信息。電子郵件頭信息可能包含多種編碼,這個函數旨在解析頭信息并返回解碼后的字符串。如果頭信息是ASCII碼,則直接返回;如果是非ASCII碼,會根據編碼類型進行解碼。參數:header (str): 需要解碼的電子郵件頭信息。返回:str: 解碼后的字符串。如果解碼過程中包含多種編碼,會返回一個元組,包含解碼后的字符串和對應的編碼類型。"""# 解碼頭信息,返回一個包含解碼結果和編碼類型的元組# 列表decoded_header = decode_header(header)[0]# print(decoded_header)# 判斷解碼結果是否為元組,如果是,說明存在多種編碼,需要進一步解碼if isinstance(decoded_header, tuple):# 對元組中的字符串進行解碼,并返回解碼后的結果part, charset = decoded_headerif isinstance(part, bytes):  # 檢查是否為字節串if charset:  # 如果有字符集,按指定字符集解碼decoded_part = part.decode(charset)else:  # 沒有指定字符集時嘗試UTF-8解碼,或選擇其他策略decoded_part = part.decode('utf-8', errors='replace')else:  # 如果已經是字符串,直接使用decoded_part = partreturn decoded_partelse:# 如果解碼結果不是元組,直接返回解碼后的字符串return None

正文獲取部分

def extract_text_body(email_message):"""從電子郵件消息中提取純文本正文。參數:email_message: 一個電子郵件消息對象,可以是使用Python email庫構建的或從文件中讀取的。返回:一個字符串,包含電子郵件的純文本正文。如果沒有找到純文本正文或郵件為空,則返回空字符串。"""# 初始化一個字符串,用于存儲提取的文本正文all_text_body = ""# 遍歷電子郵件的每一個部分for part in email_message.walk():# 獲取當前部分的Content-Typectype = part.get_content_type()# 獲取當前部分的Content-Dispositioncdispo = str(part.get('Content-Disposition'))# 檢查當前部分是否為純文本且不是附件if ctype == 'text/plain' and 'attachment' not in cdispo:# 獲取當前部分的payload(實際內容),并解碼body = part.get_payload(decode=True)# 獲取當前部分的內容字符集charset = part.get_content_charset()# 將解碼后的文本添加到存儲所有文本正文的字符串中all_text_body += body.decode(charset, errors='replace')# 找到純文本正文后立即終止循環,以提高效率break  # 如果找到文本部分,即停止搜索,提高效率# 返回收集到的所有文本正文return all_text_body

測試代碼

def imap_mail_get(client):retry_limit = 3for i in range(retry_limit):try:if client is None:client = login163(username, password)#password為IMAP授權碼# 對兩個郵箱進行操作for mailbox in ["INBOX", "Sent"]:fetch_and_mark_emails_as_read(client, mailbox=mailbox)return client except Exception as e:pass

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

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

相關文章

三大工作流引擎技術Activiti、Flowable、Camunda選型指南

文章目錄 前言1 流程引擎發展歷程2 流程引擎主要概念BPM (Business Process Management)BPMN (Business Process Model and Notation)CMMN (Case Management Model and Notation)DMN (Decision Model and Notation)事件(Event)順序流(Sequenc…

從靜電到浪涌,全面防護:雷卯多電壓等級電源保護設計方案匯總

在當今數字化、電氣化日益加速的時代,電子設備和電力系統面臨著前所未有的挑戰,其中靜電放電(ESD)、浪涌以及雷擊等瞬態事件成為了威脅設備穩定性和壽命的關鍵因素。從精密的消費電子產品到工業級控制系統,從智能家居到新能源汽車&#xff0c…

區塊鏈技術的核心要素:共識機制、加密技術與分布式賬本

區塊鏈聽起來像個非常高大上的技術,其實它的核心原理并不難理解。今天我們要聊的就是區塊鏈的三個核心要素:共識機制、加密技術和分布式賬本。想象一下區塊鏈是一個巨大的數字筆記本,我們要弄清楚大家如何共同寫這個筆記本,又如何…

用一個實例看如何分享大量照片 續篇二,關于Exif (Exchangeable Image File) - 可交換圖像文件

續篇二:說說關于照片隱含的 Exif (Exchangeable Image File) 可交換圖像文件 數碼照片的Exif 參數有很多,重要的Exif信息:拍攝日期、時間、拍攝器材、GPS信息。 當然這主要對自己的檔案有意義,如果放到網上還是建議抹去這些信息。…

Bad owner or permissions on C:\\Users\\username/.ssh/config > 過程試圖寫入的管道不存在。

使用windows連接遠程服務器出現Bad owner or permissions 錯誤 問題: 需要修復文件權限 SSH 配置文件應具有受限權限以防止未經授權的訪問 確保只有用戶對該.ssh/config文件具有讀取權限 解決方案: 在windows下打開命令行,通過以下命令打開文…

C++編程(四)this指針 常函數 常對象 靜態成員

文章目錄 一、this指針(一)概念(二)顯式使用this指針的場景1. 當形參和成員變量名一致時2. 返回對象自身的時候必須要使用this指針3. 在類中銷毀一個對象 二、常函數和常對象(一)常函數1. 概念2. 語法格式 …

python OpenCV 庫中的 cv2.Canny() 函數來對圖像進行邊緣檢測,并顯示檢測到的邊緣特征

import cv2# 加載圖像 image cv2.imread(4.png)# 使用 Canny 邊緣檢測算法提取邊緣特征 edges cv2.Canny(image, 100, 200)# 顯示邊緣特征 cv2.imshow(Edges, edges) cv2.waitKey(0) cv2.destroyAllWindows() 代碼解析: 導入 OpenCV 庫: import cv2加…

【MFC】socket通信代碼解析

目錄 一、在MFC中使用Winsock進行socket編程 1.1 包含必要的頭文件 1.2 初始化Winsock 1.3創建socket 1.4 綁定socket 1.5 監聽連接(對于服務器) 1.6 建立連接(對于客戶端) 1.7 發送和接收數據 1.8. 關閉socket 1.9 錯誤處理 1.10 MFC集成 二、MFC中Socke…

PT100(RTD)是什么?2線,3線,4線原理

RTDs - or Resistance Temperature Detectors- (電阻式溫度探測器),是溫度型傳感器,包含一個電阻,這個阻值可以隨溫度的變化而變化。在工業的進程中和實驗室里已經使用了很多年,以精確,可靠和穩定的特性。 2線制 2線制…

解決Ucharts在小程序上的層級過高問題

<qiun-wx-ucharts canvas2d"{{true}}" type"pie" opts"{{rectificationRateOpts}}" chartData"{{rectificationRateData}}" /> 開啟2d渲染即可解決&#xff08;在小程序開發工具上看著層級還是高&#xff0c;但是在手機上是正常…

C語言| 數組元素的刪除

同數組元素的插入差不多。 數組元素的插入&#xff0c;是先移動要插入元素位置后面的所有元素&#xff0c;再插入新元素&#xff0c;長度1。 C語言| 數組的插入-CSDN博客 數組元素的刪除&#xff0c;是先刪除元素&#xff0c;再把后面的元素往前移動一位&#xff0c;而本程序…

深入理解Spring中的核心注解:@Controller、@Component、@Service、@Repository、@Configuration及其擴展

在現代Java開發中&#xff0c;Spring框架以其強大的依賴注入&#xff08;DI&#xff09;和面向切面編程&#xff08;AOP&#xff09;功能深受開發者喜愛。Spring提供了一系列注解來簡化配置和管理Bean。本文將詳細探討Spring中的核心注解&#xff0c;包括Controller、Component…

【智能算法應用】麻雀搜索算法在物流配送中心選址的應用(無待選配送中心)

目錄 1.算法原理2.數學模型3.結果展示4.參考文獻5.代碼獲取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及實現 2.數學模型 模型假設 待定物流配送中心的庫存總能滿足需求點的需求不考慮從工廠到待定物流配送中心的運輸成本不考慮選定區域內待確定…

Vue 解決報錯 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise‘

Vue 報錯 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise’ 排查 控制臺報了一個錯誤 , Uncaught SyntaxError: Unexpected identifier ‘Promise’&#xff0c;網上查到的方法是 缺少符號&#xff0c;語法寫法錯誤&#xff0c;但這些都沒有解決我的問題&am…

RTDETR更換優化器——Lion

RTDETR更換Lion優化器 論文&#xff1a;https://arxiv.org/abs/2302.06675 代碼&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py 簡介&#xff1a; Lion優化器是一種基于梯度的優化算法&#xff0c;旨在提高梯度下降法在深度學習中的優化效果…

MyBatis~配置解析, 屬性(properties)、設置(settings)

注意, 對應的名稱一定要相同, 比如username就要對應username, 而且如果同時使用外部配置文件和property, 優先級是外部配置文件優先級更高 設置&#xff08;settings&#xff09; 這是 MyBatis 中極為重要的調整設置&#xff0c;它們會改變 MyBatis 的運行時行為。 下表描述了…

prompt:我是晚餐盲盒,只要你問出“今晚吃什么”我就將為你生成美妙的食物推薦。

使用方法&#xff1a;在ChatGP粘貼下面提示詞模型&#xff0c;點擊輸出。然后再問“晚餐有什么好吃的&#xff1f;”&#xff0c;AI輸出豐種食物供你選擇。抽到什么吃什么&#xff0c;極大的解決選擇困難的問題。 客戶需要生成1000條俏皮靈動&#xff0c;趣味盎然&#xff0c;比…

基于機器學習的網頁摘要生成算法的研究與實現

摘要&#xff1a;隨著互聯網的迅猛發展&#xff0c;網頁信息量呈爆炸式增長&#xff0c;用戶往往難以在海量信息中快速獲取所需內容。因此&#xff0c;開發一種能夠自動生成網頁摘要的算法&#xff0c;對于提高信息檢索效率具有重要意義。本文將對基于機器學習的網頁摘要生成算…

pytest測試框架pytest-order插件自定義用例執行順序

pytest提供了豐富的插件來擴展其功能&#xff0c;本章介紹插件pytest-order&#xff0c;用于自定義pytest測試用例的執行順序。pytest-order是插件pytest-ordering的一個分支&#xff0c;但是pytest-ordering已經不再維護了&#xff0c;建議大家直接使用pytest-order。 官方文…

華為云安全防護,九河云綜合分解優劣勢分析

隨著全球化的發展&#xff0c;越來越多的企業開始尋求在國際市場上擴展業務&#xff0c;這一趨勢被稱為企業出海。然而&#xff0c;企業在海外擴張面臨諸多隱患與安全挑戰&#xff0c;其中因為地域的不同&#xff0c;在安全性方面與國內相比會變得薄弱&#xff0c;從而導致被黑…