python接收/發(fā)送QQ郵箱保姆級教程
前言:
關于代碼中:
sender_email = 'XXXX@qq.com' #這個就是你的郵箱地址,不多說了
password = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #在QQ郵箱設置里拿到的碼,自己去查.需要手機發(fā)信息過去,0.1/RMB一個;為期大概一個月!
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郵箱設置里拿到的碼 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 #這個代碼會檢查郵件發(fā)件人,如果發(fā)件人存在,才會進行解析和輸出,否則將直接跳過郵件。并且我改變了郵件解析的方法,使用了email.header.decode_header函數(shù)來解析郵件的頭部信息和主題。 # 連接到POP3服務器 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ā)件人的郵件 # 關閉連接 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 #在這段代碼中,我定義了一個函數(shù)get_html_payload()來提取郵件的payload。 # 如果郵件的主題是多部分的(即包含多個部分,例如文本和HTML),那么我們會遍歷每個部分, # 找出HTML部分并返回。如果郵件主題只有一個部分且是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服務器 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ā)件人的郵件 # 關閉連接 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)中使用了這個新的信息,根據(jù)正文的類型執(zhí)行不同的操作。對于純文本類型,它只打印正文; # 對于html和image類型,它創(chuàng)建一個目錄(如果還不存在),然后將正文寫入一個文件。對于image, # 我還添加了一個把數(shù)據(jù)從base64格式解碼回二進制格式的步驟,這是因為圖片通常會以base64格式存儲在郵件中。 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服務器 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ā)件人的郵件 # 關閉連接 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服務器并從指定的郵件地址獲取郵件 class EmailClient: # 在初始化函數(shù)中,設置POP3服務器的來源、用戶、密碼和待查詢的目標郵件地址 def __init__(self, host, user, password, target_email): self.pop_server = poplib.POP3_SSL(host) # 使用POP3協(xié)議通過SSL安全連接到郵件服務器 self.pop_server.user(user) # 輸入用戶郵箱 self.pop_server.pass_(password) # 輸入用戶郵箱密碼 self.target_email = target_email # 輸入待查詢的目標郵件地址 # 定義一個函數(shù),用以清除文件名中的無效字符 def sanitize_folder_name(self, name): invalid_characters = "<>:\"/\\|?*@" for char in invalid_characters: # 遍歷所有無效字符 name = name.replace(char, "_") # 將無效字符替換為下劃線 return name # 返回清理后的名稱 # 定義一個函數(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() # 定義一個函數(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) # 將所有行連接成一個bytes對象 # 解析郵件內(nèi)容 email_parser = BytesParser(policy=policy.default) # 創(chuàng)建一個郵件解析器 email = email_parser.parsebytes(email_content) # 解析郵件內(nèi)容,返回一個郵件對象 # 解析郵件頭部信息并提取發(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ā)件人地址與指定的目標郵件地址一致,對郵件進行處理 # 解析郵件時間 email_time = email.get('Date') # 獲取郵件時間 # 提取郵件正文 email_body = self.get_payload(email) # 獲取郵件正文 return email_body, email_time # 返回郵件正文和時間 print("No new emails from", self.target_email) # 如果沒有從目標郵件地址收到新郵件,打印相應信息 return None, None # 返回None
-------封裝他------------
from shou_self import EmailClient client = EmailClient('pop.qq.com', '你的郵箱', '郵箱提取出的密碼', '需要針對的目標郵箱') body, time = client.fetch_email() print("Time:", time) print("Body:", body)
總結(jié)
到此這篇關于python接收/發(fā)送QQ郵箱的文章就介紹到這了,更多相關python接收發(fā)送QQ郵箱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python將ansible配置轉(zhuǎn)為json格式實例代碼
這篇文章主要介紹了python將ansible配置轉(zhuǎn)為json格式實例代碼的相關資料,需要的朋友可以參考下2017-05-05對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解
今天小編就為大家分享一篇對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解
這篇文章主要為大家介紹了python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06在Keras中實現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu)
這篇文章主要介紹了在Keras中實現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧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é)合實例形式分析了Django框架cookie和session的常見使用技巧與操作注意事項,需要的朋友可以參考下2019-08-08