欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python接收/發(fā)送QQ郵箱保姆級(jí)教程

 更新時(shí)間:2024年03月08日 10:00:14   作者:晦澀男董先生  
我們在日常python開發(fā)過程中,需求中常有實(shí)現(xiàn)發(fā)送郵箱的功能,可以說是非常常見,也非常重要的功能,下面這篇文章主要給大家介紹了關(guān)于python接收/發(fā)送QQ郵箱保姆級(jí)教程的相關(guān)資料,需要的朋友可以參考下

前言:

關(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)文章

最新評(píng)論