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
# 郵件內容
subject = '郵件主題'
body = '郵件正文'
# 構建郵件
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):
# 獲取郵件內容
response, lines, octets = pop_server.retr(i + 1)
email_content = b'\r\n'.join(lines)
# 解析郵件內容
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):
# 獲取郵件內容
response, lines, octets = pop_server.retr(i + 1)
email_content = b'\r\n'.join(lines)
# 解析郵件內容
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):
# 獲取郵件內容
response, lines, octets = pop_server.retr(i + 1)
email_content = b'\r\n'.join(lines)
# 解析郵件內容
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(有效載荷,即郵件主體內容)
def get_payload(self, 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': # 如果內容類型為HTML,則返回該部分內容
return part.get_content()
elif content_type == 'text/plain': # 如果內容類型為純文本,則返回該部分內容
return part.get_content()
elif email_message.get_content_type() == 'text/html': # 如果郵件非多部分形式,且為HTML類型,則返回郵件內容
return email_message.get_content()
elif email_message.get_content_type() == 'text/plain': # 如果郵件非多部分形式,且為純文本類型,則返回郵件內容
return email_message.get_content()
# 定義一個函數(shù),用以獲取郵件信息
def fetch_email(self):
num_emails = len(self.pop_server.list()[1]) # 獲取郵箱內的郵件數(shù)量
# 遍歷每一封郵件
for i in range(num_emails):
# 獲取郵件內容
response, lines, octets = self.pop_server.retr(i + 1) # retr函數(shù)返回指定郵件的全部文本
email_content = b'\r\n'.join(lines) # 將所有行連接成一個bytes對象
# 解析郵件內容
email_parser = BytesParser(policy=policy.default) # 創(chuàng)建一個郵件解析器
email = email_parser.parsebytes(email_content) # 解析郵件內容,返回一個郵件對象
# 解析郵件頭部信息并提取發(fā)件人信息
email_from = email.get('From').strip() # 獲取發(fā)件人信息,并去除尾部的空格
email_from = str(make_header(decode_header(email_from))) # 解碼發(fā)件人信息,并將其轉換為字符串
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)總結
到此這篇關于python接收/發(fā)送QQ郵箱的文章就介紹到這了,更多相關python接收發(fā)送QQ郵箱內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解
今天小編就為大家分享一篇對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
在Python的web框架中編寫創(chuàng)建日志的程序的教程
這篇文章主要介紹了在Python的web框架中編寫創(chuàng)建日志的程序的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04
Python Web框架之Django框架cookie和session用法分析
這篇文章主要介紹了Python Web框架之Django框架cookie和session用法,結合實例形式分析了Django框架cookie和session的常見使用技巧與操作注意事項,需要的朋友可以參考下2019-08-08

