python接收/發(fā)送QQ郵箱保姆級(jí)教程
前言:
關(guān)于代碼中:
sender_email = 'XXXX@qq.com' #這個(gè)就是你的郵箱地址,不多說了
password = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #在QQ郵箱設(shè)置里拿到的碼,自己去查.需要手機(jī)發(fā)信息過去,0.1/RMB一個(gè);為期大概一個(gè)月!
1.發(fā)送郵箱:
import smtplib from email.mime.text import MIMEText from email.header import Header # 郵件內(nèi)容 subject = '郵件主題' body = '郵件正文' # 構(gòu)建郵件 msg = MIMEText(body, 'plain', 'utf-8') msg['Subject'] = Header(subject, 'utf-8') msg['From'] = 'XXXX@qq.com' msg['To'] = 'XXXX@qq.com' # 發(fā)送郵件 smtp_server = 'smtp.qq.com' smtp_port = 587 sender_email = 'XXXX@qq.com' password = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #在QQ郵箱設(shè)置里拿到的碼 try: with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() server.login(sender_email, password) server.sendmail(sender_email, [msg['To']], msg.as_string()) print('郵件發(fā)送成功') except smtplib.SMTPException as e: print('郵件發(fā)送失敗:', str(e))
2.接收郵箱---(打印發(fā)件人/主題,解決收件人亂碼問題)
import base64 import poplib from email.parser import BytesParser import email.header as jiexi import re #這個(gè)代碼會(huì)檢查郵件發(fā)件人,如果發(fā)件人存在,才會(huì)進(jìn)行解析和輸出,否則將直接跳過郵件。并且我改變了郵件解析的方法,使用了email.header.decode_header函數(shù)來解析郵件的頭部信息和主題。 # 連接到POP3服務(wù)器 pop_server = poplib.POP3_SSL('pop.qq.com', 995) pop_server.user('xxxx@qq.com') pop_server.pass_('xxxxxxxxxx') # 獲取郵箱中的郵件信息 num_emails = len(pop_server.list()[1]) # 遍歷每封郵件 for i in range(num_emails): # 獲取郵件內(nèi)容 response, lines, octets = pop_server.retr(i + 1) email_content = b'\r\n'.join(lines) # 解析郵件內(nèi)容 email_parser = BytesParser() email = email_parser.parsebytes(email_content) # 解析郵件頭部信息 email_from = email.get('From').strip() email_from = str(jiexi.make_header(jiexi.decode_header(email_from))) if email_from: # 只處理存在發(fā)件人的郵件 # 解析郵件主題 subject = email.get('Subject').strip() decoded_subject = str(jiexi.make_header(jiexi.decode_header(subject))) if subject else None print("------------------") print("From:", email_from) print("Subject:", decoded_subject) else: continue # 跳過缺失發(fā)件人的郵件 # 關(guān)閉連接 pop_server.quit()
3.接收郵箱v02---(打印出郵件的正文body部分)
import poplib from email import policy from email.parser import BytesParser from email.header import decode_header, make_header #在這段代碼中,我定義了一個(gè)函數(shù)get_html_payload()來提取郵件的payload。 # 如果郵件的主題是多部分的(即包含多個(gè)部分,例如文本和HTML),那么我們會(huì)遍歷每個(gè)部分, # 找出HTML部分并返回。如果郵件主題只有一個(gè)部分且是HTML,則直接返回該部分。如果沒有合適的部分, # 那么函數(shù)將返回None。 def get_html_payload(email_message): if email_message.is_multipart(): for part in email_message.iter_parts(): content_type = part.get_content_type() if content_type == 'text/html': return part.get_content() else: continue elif email_message.get_content_type() == 'text/html': return email_message.get_content() # 連接到POP3服務(wù)器 pop_server = poplib.POP3_SSL('pop.qq.com', 995) pop_server.user('xxxxxx@qq.com') pop_server.pass_('xxxxxxx') # 獲取郵箱中的郵件信息 num_emails = len(pop_server.list()[1]) # 遍歷每封郵件 for i in range(num_emails): # 獲取郵件內(nèi)容 response, lines, octets = pop_server.retr(i + 1) email_content = b'\r\n'.join(lines) # 解析郵件內(nèi)容 email_parser = BytesParser(policy=policy.default) email = email_parser.parsebytes(email_content) # 解析郵件頭部信息 email_from = email.get('From').strip() email_from = str(make_header(decode_header(email_from))) if email_from: # 只處理存在發(fā)件人的郵件 # 解析郵件主題 subject = email.get('Subject').strip() decoded_subject = str(make_header(decode_header(subject))) if subject else None # 提取郵件正文 email_body = get_html_payload(email) print("------------------") print("From:", email_from) print("Subject:", decoded_subject) print("Body:", email_body) else: continue # 跳過缺失發(fā)件人的郵件 # 關(guān)閉連接 pop_server.quit()
4.接收郵箱v03---(打印出郵件的正文body部分,并分類存文件到目錄,以html/圖片/text分類)
import os import base64 import poplib from email import policy from email.parser import BytesParser from email.header import decode_header, make_header def sanitize_folder_name(name): #清理郵箱地址,移除或替換那些非法字符 invalid_characters = "<>:\"/\\|?*@" for char in invalid_characters: name = name.replace(char, "_") return name def get_payload(email_message): #------------------解析正文------------------- # 我在循環(huán)中使用了這個(gè)新的信息,根據(jù)正文的類型執(zhí)行不同的操作。對(duì)于純文本類型,它只打印正文; # 對(duì)于html和image類型,它創(chuàng)建一個(gè)目錄(如果還不存在),然后將正文寫入一個(gè)文件。對(duì)于image, # 我還添加了一個(gè)把數(shù)據(jù)從base64格式解碼回二進(jìn)制格式的步驟,這是因?yàn)閳D片通常會(huì)以base64格式存儲(chǔ)在郵件中。 if email_message.is_multipart(): for part in email_message.iter_parts(): content_type = part.get_content_type() if content_type == 'text/html': return part.get_content(), 'html' elif content_type == 'text/plain': return part.get_content(), 'text' elif content_type.startswith('image/'): return part.get_content(), 'image', part.get_content_type().split('/')[-1] else: continue elif email_message.get_content_type() == 'text/html': return email_message.get_content(), 'html' elif email_message.get_content_type() == 'text/plain': return email_message.get_content(), 'text' # 連接到POP3服務(wù)器 pop_server = poplib.POP3_SSL('pop.qq.com', 995) pop_server.user('xxxx@qq.com') pop_server.pass_('xxxxxx') # 獲取郵箱中的郵件信息 num_emails = len(pop_server.list()[1]) # 遍歷每封郵件 for i in range(num_emails): # 獲取郵件內(nèi)容 response, lines, octets = pop_server.retr(i + 1) email_content = b'\r\n'.join(lines) # 解析郵件內(nèi)容 email_parser = BytesParser(policy=policy.default) email = email_parser.parsebytes(email_content) # 解析郵件頭部信息 email_from = email.get('From').strip() email_from = str(make_header(decode_header(email_from))) if email_from: # 只處理存在發(fā)件人的郵件 # 解析郵件主題 subject = email.get('Subject').strip() decoded_subject = str(make_header(decode_header(subject))) if subject else None # 提取郵件正文 email_body, body_type, *extras = get_payload(email) # 創(chuàng)建安全的文件夾名和文件名 safe_folder_name = sanitize_folder_name(email_from) safe_subject = sanitize_folder_name(decoded_subject) print("------------------") print("From:", email_from) print("Subject:", decoded_subject) print("Body Type:", body_type) # 根據(jù)正文類型處理 if body_type == 'text': print("Body:", email_body) elif body_type == 'html': directory = safe_folder_name if not os.path.exists(directory): os.makedirs(directory) with open(f'{directory}/{safe_subject}.html', 'w') as f: f.write(email_body) elif body_type == 'image': directory = safe_folder_name if not os.path.exists(directory): os.makedirs(directory) image_data = base64.b64decode(email_body) image_extension = extras[0] # Get the image extension with open(f'{directory}/{safe_subject}.{image_extension}', 'wb') as f: f.write(image_data) else: continue # 跳過缺失發(fā)件人的郵件 # 關(guān)閉連接 pop_server.quit()
5.接收郵箱v04--(接收指定的郵箱,并把它封裝好!完整版,可直接使用)
import os import base64 import poplib from email import policy from email.parser import BytesParser from email.header import decode_header, make_header # 定義EmailClient類,用于連接到POP3服務(wù)器并從指定的郵件地址獲取郵件 class EmailClient: # 在初始化函數(shù)中,設(shè)置POP3服務(wù)器的來源、用戶、密碼和待查詢的目標(biāo)郵件地址 def __init__(self, host, user, password, target_email): self.pop_server = poplib.POP3_SSL(host) # 使用POP3協(xié)議通過SSL安全連接到郵件服務(wù)器 self.pop_server.user(user) # 輸入用戶郵箱 self.pop_server.pass_(password) # 輸入用戶郵箱密碼 self.target_email = target_email # 輸入待查詢的目標(biāo)郵件地址 # 定義一個(gè)函數(shù),用以清除文件名中的無效字符 def sanitize_folder_name(self, name): invalid_characters = "<>:\"/\\|?*@" for char in invalid_characters: # 遍歷所有無效字符 name = name.replace(char, "_") # 將無效字符替換為下劃線 return name # 返回清理后的名稱 # 定義一個(gè)函數(shù),用以提取郵件的payload(有效載荷,即郵件主體內(nèi)容) def get_payload(self, email_message): if email_message.is_multipart(): # 判斷郵件是否為多部分郵件 for part in email_message.iter_parts(): # 如果是,則遍歷其中的每一部分 content_type = part.get_content_type() # 獲取該部分的內(nèi)容類型 if content_type == 'text/html': # 如果內(nèi)容類型為HTML,則返回該部分內(nèi)容 return part.get_content() elif content_type == 'text/plain': # 如果內(nèi)容類型為純文本,則返回該部分內(nèi)容 return part.get_content() elif email_message.get_content_type() == 'text/html': # 如果郵件非多部分形式,且為HTML類型,則返回郵件內(nèi)容 return email_message.get_content() elif email_message.get_content_type() == 'text/plain': # 如果郵件非多部分形式,且為純文本類型,則返回郵件內(nèi)容 return email_message.get_content() # 定義一個(gè)函數(shù),用以獲取郵件信息 def fetch_email(self): num_emails = len(self.pop_server.list()[1]) # 獲取郵箱內(nèi)的郵件數(shù)量 # 遍歷每一封郵件 for i in range(num_emails): # 獲取郵件內(nèi)容 response, lines, octets = self.pop_server.retr(i + 1) # retr函數(shù)返回指定郵件的全部文本 email_content = b'\r\n'.join(lines) # 將所有行連接成一個(gè)bytes對(duì)象 # 解析郵件內(nèi)容 email_parser = BytesParser(policy=policy.default) # 創(chuàng)建一個(gè)郵件解析器 email = email_parser.parsebytes(email_content) # 解析郵件內(nèi)容,返回一個(gè)郵件對(duì)象 # 解析郵件頭部信息并提取發(fā)件人信息 email_from = email.get('From').strip() # 獲取發(fā)件人信息,并去除尾部的空格 email_from = str(make_header(decode_header(email_from))) # 解碼發(fā)件人信息,并將其轉(zhuǎn)換為字符串 if email_from == self.target_email: # 如果發(fā)件人地址與指定的目標(biāo)郵件地址一致,對(duì)郵件進(jìn)行處理 # 解析郵件時(shí)間 email_time = email.get('Date') # 獲取郵件時(shí)間 # 提取郵件正文 email_body = self.get_payload(email) # 獲取郵件正文 return email_body, email_time # 返回郵件正文和時(shí)間 print("No new emails from", self.target_email) # 如果沒有從目標(biāo)郵件地址收到新郵件,打印相應(yīng)信息 return None, None # 返回None
-------封裝他------------
from shou_self import EmailClient client = EmailClient('pop.qq.com', '你的郵箱', '郵箱提取出的密碼', '需要針對(duì)的目標(biāo)郵箱') body, time = client.fetch_email() print("Time:", time) print("Body:", body)
總結(jié)
到此這篇關(guān)于python接收/發(fā)送QQ郵箱的文章就介紹到這了,更多相關(guān)python接收發(fā)送QQ郵箱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django+js+ajax實(shí)現(xiàn)刷新頁面的方法
這篇文章主要介紹了django+js+ajax實(shí)現(xiàn)刷新頁面的方法,結(jié)合實(shí)例形式分析了django實(shí)現(xiàn)ajax刷新頁面功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05python將ansible配置轉(zhuǎn)為json格式實(shí)例代碼
這篇文章主要介紹了python將ansible配置轉(zhuǎn)為json格式實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05對(duì)python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解
今天小編就為大家分享一篇對(duì)python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解
這篇文章主要為大家介紹了python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06使用python實(shí)現(xiàn)省市三級(jí)菜單效果
本文給大家分享的是使用使用python實(shí)現(xiàn)省市三級(jí)菜單效果的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。2016-01-01在Keras中實(shí)現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu)
這篇文章主要介紹了在Keras中實(shí)現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06在Python的web框架中編寫創(chuàng)建日志的程序的教程
這篇文章主要介紹了在Python的web框架中編寫創(chuàng)建日志的程序的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04Python Web框架之Django框架cookie和session用法分析
這篇文章主要介紹了Python Web框架之Django框架cookie和session用法,結(jié)合實(shí)例形式分析了Django框架cookie和session的常見使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-08-08