python接收/发送QQ邮箱保姆级教程

 更新时间:2024年03月08日 10:00:14   作者:晦涩男董先生  
我们在日常python开发过程中,需求中常有实现发送邮箱的功能,可以说是非常常见,也非常重要的功能,下面这篇文章主要给大家介绍了关于python接收/发送QQ邮箱保姆级教程的相关资料,需要的朋友可以参考下

前言:

关于代码中:

sender_email = 'XXXX@qq.com'   #这个就是你的邮箱地址,不多说了
password = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #在QQ邮箱设置里拿到的码,自己去查.需要手机发信息过去,0.1/RMB一个;为期大概一个月!

1.发送邮箱:

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'

# 发送邮件
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('邮件发送成功')
except smtplib.SMTPException as e:
    print('邮件发送失败:', str(e))

2.接收邮箱---(打印发件人/主题,解决收件人乱码问题)

import base64
import poplib
from email.parser import BytesParser
import email.header as jiexi
import re

#这个代码会检查邮件发件人,如果发件人存在,才会进行解析和输出,否则将直接跳过邮件。并且我改变了邮件解析的方法,使用了email.header.decode_header函数来解析邮件的头部信息和主题。

# 连接到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:  # 只处理存在发件人的邮件
        # 解析邮件主题
        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  # 跳过缺失发件人的邮件

# 关闭连接
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

#在这段代码中,我定义了一个函数get_html_payload()来提取邮件的payload。
# 如果邮件的主题是多部分的(即包含多个部分,例如文本和HTML),那么我们会遍历每个部分,
# 找出HTML部分并返回。如果邮件主题只有一个部分且是HTML,则直接返回该部分。如果没有合适的部分,
# 那么函数将返回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:  # 只处理存在发件人的邮件
        # 解析邮件主题
        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  # 跳过缺失发件人的邮件

# 关闭连接
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):
    #------------------解析正文-------------------
    # 我在循环中使用了这个新的信息,根据正文的类型执行不同的操作。对于纯文本类型,它只打印正文;
    # 对于html和image类型,它创建一个目录(如果还不存在),然后将正文写入一个文件。对于image,
    # 我还添加了一个把数据从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:  # 只处理存在发件人的邮件
        # 解析邮件主题
        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)

        # 创建安全的文件夹名和文件名
        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)

        # 根据正文类型处理
        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  # 跳过缺失发件人的邮件

# 关闭连接
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:
    # 在初始化函数中,设置POP3服务器的来源、用户、密码和待查询的目标邮件地址
    def __init__(self, host, user, password, target_email):
        self.pop_server = poplib.POP3_SSL(host)  # 使用POP3协议通过SSL安全连接到邮件服务器
        self.pop_server.user(user)  # 输入用户邮箱
        self.pop_server.pass_(password)  # 输入用户邮箱密码
        self.target_email = target_email  # 输入待查询的目标邮件地址

    # 定义一个函数,用以清除文件名中的无效字符
    def sanitize_folder_name(self, name):
        invalid_characters = "<>:\"/\\|?*@"
        for char in invalid_characters:  # 遍历所有无效字符
            name = name.replace(char, "_")  # 将无效字符替换为下划线
        return name  # 返回清理后的名称

    # 定义一个函数,用以提取邮件的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()

    # 定义一个函数,用以获取邮件信息
    def fetch_email(self):
        num_emails = len(self.pop_server.list()[1])  # 获取邮箱内的邮件数量

        # 遍历每一封邮件
        for i in range(num_emails):
            # 获取邮件内容
            response, lines, octets = self.pop_server.retr(i + 1)  # retr函数返回指定邮件的全部文本
            email_content = b'\r\n'.join(lines)  # 将所有行连接成一个bytes对象

            # 解析邮件内容
            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 == self.target_email:  # 如果发件人地址与指定的目标邮件地址一致,对邮件进行处理
                # 解析邮件时间
                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接收/发送QQ邮箱的文章就介绍到这了,更多相关python接收发送QQ邮箱内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python写入内容到制定文件

    使用Python写入内容到制定文件

    这篇文章主要介绍了使用Python写入内容到制定文件,Python只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式,需要的朋友可以参考下
    2023-07-07
  • Python3中lambda表达式与函数式编程讲解

    Python3中lambda表达式与函数式编程讲解

    今天小编就为大家分享一篇关于Python3中lambda表达式与函数式编程讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Python中动态获取对象的属性和方法的教程

    Python中动态获取对象的属性和方法的教程

    本文主要介绍了如何在Python中动态获取对象的属性和方法,并运行使用它们,需要的朋友可以参考一下
    2015-04-04
  • tensorflow中tf.reduce_mean函数的使用

    tensorflow中tf.reduce_mean函数的使用

    这篇文章主要介绍了tensorflow中tf.reduce_mean函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 基于Python实现抢注大词的提词工具

    基于Python实现抢注大词的提词工具

    这篇文章主要为大家详细介绍了如何利用Python语言实现抢注大词的提词工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • 通过conda把已有虚拟环境的python版本进行降级操作指南

    通过conda把已有虚拟环境的python版本进行降级操作指南

    当使用conda创建虚拟环境时,有时候可能会遇到python版本不对的问题,下面这篇文章主要给大家介绍了关于如何通过conda把已有虚拟环境的python版本进行降级操作的相关资料,需要的朋友可以参考下
    2024-05-05
  • python获取linux和windows系统指定接口的IP地址的步骤及代码

    python获取linux和windows系统指定接口的IP地址的步骤及代码

    这篇文章主要介绍了python获取linux和windows系统指定接口的IP地址,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Python 如何引用不确定的函数

    Python 如何引用不确定的函数

    在Python中,引用不确定的函数通常意味着我们可能在运行时才知道要调用哪个函数,或者我们可能想根据某些条件动态地选择不同的函数来执行,下面给大家分享Python 如何引用不确定的函数,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • 浅谈pandas dataframe对除数是零的处理

    浅谈pandas dataframe对除数是零的处理

    这篇文章主要介绍了浅谈pandas dataframe对除数是零的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python数据清洗之利用pandas筛选数据详解

    Python数据清洗之利用pandas筛选数据详解

    这篇文章主要介绍了Python数据清洗之利用pandas筛选数据详解,Pandas是一个用于数据分析和处理的Python库,它提供了高效的数据结构和数据分析工具,使得数据的清洗、转换、分析和可视化变得更加容易和灵活,需要的朋友可以参考下
    2023-08-08

最新评论